본문 바로가기

개발기술/Spring

스프링 부가기능 (Resource, AOP, 유효성검증, 데이터바인딩,spel)

외부자원 가져오기

앱은 단순히 내부코드로만 동작할 수 없고 결국 자원을 끌어올 때가 있다. 외부 API, 외부 url, 외부 이미지, 내부 file system의 자원, 내부 패키지내 클래스라던지 등등 자원을 사용할 필요성이 있다. java 기본 라이브러리에서는 자원을 가지고오는 기능들이 충분하지않고 사용하기 어렵게 되어있어 스프링은 resource interface를 통해서 이러한 기능들을 제공한다. 

각 자원의 종류별로 resource interface를 상속하는 구체적인 구현체들이 있으며 이를 사용하여 resouce를 다룬다. 그리고 스프링컨테이너인 applicationcontext에 구현되어있는 resourceloader을 사용하여서 자원들을 불러온다. 마찬가지로 applicatiocontext같은 개체도 초기설정시에 설정값을 가져올때 resourceloader(.getresource())을 사용한다.

AOP 관점지향프로그래밍

  각 메소드들에게 동일한 로직이 반복해서 적용이 필요할 때 각 메소드들이 동일한 관점(관심사)를 갖고 있다고 말하고, 이를 편리하게 적용하는 기법이 관점지향 프로그래밍이라고 한다. 공통의 관심사란 로깅, 거래완료 확인 등등을 예로 들수있다. 동일한 로직을 도입하는 것은 OOP에서도 가능하나, 상속 혹은 의존성 등으로 관리가 까다롭기때문에 AOP로 편리하게 도입하는 기능을 Spring에서 제공한다.

   AOP의 구체적인 작동방식은 프록시를 생성하여 특정 메소드 호출을 가로채어, 추가적인 코드동작들을 메소드 호출 전후에 주입하는 방식으로 작동한다. 마치 메소드의 동작을 advise하는 것과 같다고 하여 advice라고 불린다.

  관점이라는 것은 기능이고 이것을 구현한 것을 advice라고 하는데 advice는 아무데서나 적용되는 것이아니라 특정한 method의 부분에만 적용가능하며 이를 joint point라고 한다. joint point들을 조건문으로 선택적으로 적용하는 것을 point cut이라고함. aspect 관리를 편리하게 해주는 aspecj라이브러리를 지원한다.

유효성검증

유효성 검증단계는 제대로 데이터가 흐르고있는지 혹은 프로세스 작동이 되고있는지 확인하는 단계이다. 주로 input되는 데이터가 규격에 맞는지 그리고 어떤 작업이후 흘러야하는 데이터가 제대로 흐르는지 확인하는 절차로 결국 데이터가 유효한지 확인하는 것이 주이다. 유효성검증방식은 두가지가 있는데

  • 첫번째, javabean POJO 중 하나인 Javabean에  annotation을 붙여서 제약조건들을 달아놓는다. 그리고 controller의 request parameter에 @Validation을 표기하면 검증이 작동한다.
    • Javabean규약 1. Private Fields with Public Getters and Setters 2. No-argument Constructor for easy instantiation 3. Serializable : should implement the Serializable interface.
    • JavaBean 검증annotation
      • @NotNull : not null
      • @Notblank : a string field is not null and not just whitespace
      • @Min(value), Max(value) : 숫자 데이터의 최소 최대값
      • @size(min, max) : String 데이터의 자리수
      • @pattern : String의 패턴을 정함
  • 두번째는 validator라는 인터페이스를 구현하여 검증을 위한 클래스를 만든다. 클래스 내부에는 support와 validate이라는 두가지 메소드가 존재하는데, validator가 동작할 조건을 정의하는support 메소드와 validation 검증조건을 정의하고 검증을 실행하는 validate라는 검증메소드가 존재한다. 
    • support method는 주로 class가 검증하고자 하는 class에 속하는 지 검증함. support method는 개발자가 실행하지 않아도 spring에서 validate실행전에 먼저 실행해줌
    • 개발자가 메소드를 정의하는 것이기 때문에 보다 세부적인 검증이 가능하며 단순, 데이터의 검증뿐아니라 로직의 작동에 대해서도 검증가능하다.

  Validation은 코드가 너무 흩어져있으면 만약, 검증조건이 바뀌었을때 일괄적으로 수정적용하여 관리하기가 어렵다. 그러한 관점에서 별도로 클래스를 만드는 두번째 방식보다는 Request DTO에 검증조건을 표기하는 첫번째 방식이 관리에 더 효과적이다. 그리고 Validation은 최대한 프로그램의 초기에 진행하는 것이 자원관리 및 rollback 관점에서 좋다.

  주로 사용되는 방식은 요청 DTO에 요청이 들어올시 1차적으로 validation을 진행하고, 로직초기에 비즈니스 검증 수행 후 실패시에 Custom Exception을 throw하도록 예외처리를 한다.

  

데이터바인딩 ; Converter, Formatter

데이터 검증후 내부시스템의 request에 담기 위해서 Converter interface를 사용한 구현체를 component로 생성하면, input type과 output type을 보고서 자동적으로 mapping하여 데이터를 목표하는 dto로 변환해준다. 동일한 논리로 formatter는 string을 dto로 변환시키는 converter라고 할 수 있음. 

 

SpEL : Spring Expression

  Expression Language(표현언어) : 짧고 간단한 문법을 통해 필요한 데이터나 설정 값을 얻을 수 있게하는 특별한 형태의 표현식에 가까운 간편한 언어(그래프 접근방식으로 데이터 접근이(earth.usa.california.xxx) 가능)

  EL 중에서 Spring에 특화된 것이 SpEL임. 주로 환경변수를 parsing 하여얻어와서 변수에 담아주는 것을 위해 @Value annotion에서 많이 사용한다. 이는 상황 및 환경에 따라서 변해야하는 값들을 복잡한 수정 후 재배포 과정없이 환경변수 변경만으로 적용시키고자할 때 많이 사용한다. 이 환경변수들은 개발자가 직접 설정하고 생성할 수 있다. 

  SpEL의 작동방식은 parser 구현체를 만들고 이곳에 문자열의 형식으로 문자열 혹은 연산키워즈(SpEL) 인풋하면 문자열의 내용을 평가하여 연산 규칙에 맞게 parsing해서 값을 가져온다.

  •  
  • '${}' : 환경변수에서 값을 파싱한다.
    • (@Value("${config.value}") - ${} 안에 SpEL이 들어가서 config를 접근하여 value를 확인한다. 주로많이 사용
  • #{<expression string>} : 값을 평가하여 string을 생성한다.
    • #{1+1} : 2
    • #{2 eq 2} : true
  • Parametervariable : #variablename, 메소드 파라미터 변수를 지칭한다
  • Special Variable : authentication.principal.id
  • Method : hasRole('ROLE_NAME')
scheduler:
  scrap:
    yahoo: "0 0 1 * * *"
@Scheduled(cron = "${scheduler.scrap.yahoo}")
public void yahooFinanceScheduling() {
@PreAuthorize("hasRole('ADMIN') or (hasRole('USER') and #userId == authentication.principal.id)")
public void performAction(Long userId) {
    // Method logic here
}

그 외 Annotation

  • @DateTimeFormat (attribute) : is used for formatting date and time fields.
    • purpose
      • Validation: It ensures that incoming date and time strings conform to a specified format before they are processed further. This prevents data errors that could occur from incorrectly formatted dates.
      • Consistency: By enforcing a specific format, it standardizes date and time data across different parts of an application, from the web layer to the business layer.
    • attribute 
      • iso: This attribute can be used to specify an ISO date time format (like ISO.DATE, ISO.TIME, or ISO.DATE_TIME)
      • style: You can specify a style pattern code which consists of two characters: one for the date style and one for the time style (e.g., "SS" for short date and short time).

JSON Parsing

  • attribute 
    • iso: This attribute can be used to specify an ISO date time format (like ISO.DATE, ISO.TIME, or ISO.DATE_TIME)
    • style: You can specify a style pattern code which consists of two characters: one for the date style and one for the time style (e.g., "SS" for short date and short time).

스케쥴링

 

프로그램 내에서 특정 행위를 예약해두고 싶을때 스케쥴링 기능을 사용한다. Spring은 해당 기능을 각 메소드 별로 @Scheduled annotation으로 지원한다. @Scheduled annotation scan을 위해서 Spring Application class에 @EnableScheduling을 포함한다.

 

scheduling에는 3가지 방법이 있다.

fixedDelay - 이전에 수행이 완료된 지점으로부터 특정시간이 넘어간다면 수행을 시작

fixedRate - 이전 수행이 시작된 지점으로부터 특정시간이 넘어간다면 수행을 시작 (이전 수행이 아직 안끝났을때 충돌가능성있음)

cron - 특정한 시점에 수행을 시작

 

 @Scheduled(cron = "0 0 1 * * *”)

Cron :  유닉스 및 유닉스 계열 운영 체제(예: Linux)에서 사용되는 시간 기반 작업 스케줄러입니다. Cron을 사용하면 사용자가 반복적인 작업을 자동으로 실행할 수 있습니다. Cron은 space로 단위를 구분하며, *은 wildcard로 전체를 표현함.

 

키워드

* :  모든수, ? : 조건없음, - : 범위지정

, : 특정 여러시간 지정, / : 시작시간과 반복간격, L : 지정할 수 있는 범위의 마지막 값 (날짜와 요일에만 사용)

 

예시)

0 0 * * * * : 매 시각

*/10 * * * * * : 10초마다

0 0 8-10 * * * : 매일 8시, 9시, 10시

 

Logger

서비스의 동작상태를 기록으로 남기는 것. Print도 유사한 기능을 할 수 있지만, 콘솔에 출력되는 한정적인 기능만 제공하기에 한계가 있다. Logger의 경우에는 로그저장, 과거로그 지우기 등 기능을 제공한다. 라이브러리로는 log4J, logback 등이 있음.

 

logback의 경우 스프링에 내장되어있어 별도로 dependency를 추가할 필요가 없다. resource file에 log의 config 파일만 추가한 후, spring의 config 파일에 해당 config 파일을 알려주기만 하면 된다. 

 

로그에는 아래와 같은 5가지 종류가 있다.

  • error : 심각한 문제 발생; DB와 연결이 끊어짐 등
  • warning : 로직상 유효성, 당장 서비스에 운영은 문제가 없으나 지켜봐야하는 
  • info : 서비스 운영에 필요한 정보; schedule 진행성공기록
  • debug : 세세하게 보고싶을 때, 개발단계
  • trace : 개발단계

로그 configuration : 우선, 검색을 통해서 외부소스를 활용하고 필요에 따라 공부하는 것을 추천.