본문 바로가기
Java & 스프링/스프링부트 톺아보기

[스프링 부트] 외부 설정 적용하기(2)

by hjhello423 2019. 9. 25.

 

이전 포스팅에서 살펴본 외부 설정 파일의 값 바인딩을 type safe 하게 사용해 보자.

다음은 application.properties 파일이다.

my.name = hongjun
my.age = ${random.int(0,100)}
my.full_name = ${my.name} Choi

 

먼저 값을 바인딩할 class를 생성해보자.

아래 코드에선 getter, setter가 생략되어 있다.

@Component
@ConfigurationProperties("my")
public class MyProperties {

    String name;

    int age;

    String fullName;   
}

보는 바와 같이 @ConfigurationProperties을 이용하면 매우 간단하게 설정 파일의 값을 바인딩할 수 있다.

스프링 부트는 application.properties 파일을 자동으로 감지하기 때문에 @ConfigurationProperties에서 사용할 key값만 지정하여 값을 바인딩할 수 있다.

이전 포스팅에서 사용한 @Valid를 사용한 방법보다 휴먼 미스로 발생할 수 있는 에러 사항을 방지하기 쉽다.

 

기존에 properties값을 바인딩할 class를 생성할 경우 아래 코드와 같이 @SpringBootApplication이 적용된 main 함수에 @EnableConfigurationProperties 어노테이션을 적용해야 하지만 @ConfigurationProperties를 사용할 경우 이를 생략할 수 있다.

@SpringBootApplication
@EnableConfigurationProperties(MyProperties.class)
public class Application {

    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(Application.class);
        app.setWebApplicationType(WebApplicationType.NONE);
        app.run(args);
    }
}

 


스프링 부트는 properties값을 바인딩할 때 타입 컨버전(conversion)을 이용한다.

사용자 정의 컨버전이 필요할 경우 아래 3가지 방식으로 제공할 수 있다.

1. ConversionService bean (with a bean named conversionService)

2. custom property editors (through a CustomEditorConfigurer bean) 

3. custom Converters (with bean definitions annotated as @ConfigurationPropertiesBinding)

자세한 내용은 아래 doc링크를 확인해 보자

https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-external-config-conversion

 


java.time.Duration을 이용한 시간 값 표현도 가능하다.

먼저 타임 값을 세팅해 보자

my.name = hongjun
my.age = ${random.int(0,100)}
my.full_name = ${my.name} Choi
my.session-timeout = 25

 

25로 지정한 session-timeout를 초 단위로 바인딩해보자.

@DurationUnit(ChronoUnit.SECONDS)와 같은 방식으로 초 단위 시간 값을 지정할 수 있다.

아래 소스에선 기본값이 30초로 지정되었지만 위에서 설정한 25 값으로 인해 오버라이딩되어 25초의 값이 바인딩된다.

getter, setter를 생략하였다.

@Component
@ConfigurationProperties("my")
public class MyProperties {

    String name;

    int age;

    String fullName;

    @DurationUnit(ChronoUnit.SECONDS)
    private Duration sessionTimeout = Duration.ofSeconds(30);

}

 

실행해 보면 아래와 같이 25s로 표시되는 것을 볼 수 있다.

 

 

properties파일에서 25가 아닌 25s, 25h와 같은 방식으로 설정하여 시간 단위를 지정할 수 있다.

이렇게 할 경우 @DurationUnit(ChronoUnit.SECONDS)을 생략 가능하다.

  • ns for nanoseconds
  • us for microseconds
  • ms for milliseconds
  • s for seconds
  • m for minutes
  • h for hours
  • d for days

자세한 내용은 doc 링크를 확인해 보자.

 

https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-external-config-conversion-duration

 


간단하게 살펴보면 @Validated를 사용하여 값을 검증할 수도 있다.

아래와 같이 @NopEmpty를 사용하면 name값에 바인딩할 값이 properties파일에 설정되어 있지 않을 경우 실행 과정에서 에러를 발생시킨다.

@Validated에 관한 내용은 범위가 넓으므로 따로 포스팅을 해봐야겠다.

@Component
@ConfigurationProperties("my")
@Validated
public class MyProperties {

    @NotEmpty
    String name;

    int age;

    String fullName;

    private Duration sessionTimeout = Duration.ofSeconds(30);
}

 


약간의 팁은 properties 파일을 작성하기 전에 먼저 class파일을 만들었다면, properties파일에서 meta 정보를 이용하여 자동완성을 사용할 수 있다. 이때 spring-boot-configuration-processor jar을 사용하여 @ConfigurationProperties로 주석이 달린 항목에서 자체 구성 메타 데이터 파일을 쉽게 생성할 수 있다.

아래 doc 링크에서 확인해 보자.

https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#configuration-metadata-annotation-processor

 


링크

 

해당 포스팅은 백기선 님의 인프런 강의를 참고하여 작성하였습니다.
반응형

댓글