[Spring Boot] 스프링부트 @ConfigurationProperties 어노테이션으로 application.properties에서 관리하기

@ConfigurationProperties
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ConfigurationProperties {
    @AliasFor("prefix")
    String value() default "";

    @AliasFor("value")
    String prefix() default "";

    boolean ignoreInvalidFields() default false;

    boolean ignoreUnknownFields() default true;
}

기본적으로 소스는 다음과 같습니다. 안의 주석문을 뜯어보면 다음과 같습니다.

 

맨 위엣줄의 설명을 보면 설정을 외부화할 때 필요한 어노테이션 정도로 이해할 수 있겠습니다.

 

데이터 바인딩은 setter가 있으면 setter로 하고, 파라미터 생성자가 존재하면 생성자로 바인딩 한다고 적혀있는것 같습니다.

 

일단 위에서 제가 사용한 속성은 prefix 라는 속성입니다.

 

그 전에 @ConfigurationProperties라는 속성을 적용할 클래스를 생성해보겠습니다. 예제이므로 유의미한 설정으로는 진행하지 않겠습니다.

 

 

MyClassConfigurationProperties 클래스 생성
@ConfigurationProperties(prefix = "my-class")
@Configuration
@Getter
@Setter
public class MyClassConfigurationProperties {

    private String propertyOne;
    private String propertyTwo;
    private String propertyThree;

}

데이터 바인딩을 위해서 Lombok 라이브러리를 이용하여 @Setter, 데이터 접근을 위해 @Getter 어노테이션을 붙여주었습니다.

 

이제 application.properties에서 해당 값을 사용할 수 있는지 확인해보겠습니다.

 

이상하네요.. prefix로 설정해놓은 경우 인텔리제이 환경에서는 자동완성을 지원해줍니다. 하지만 현재는 먹히지 않는 것 같습니다. 이는 아직 프로젝트 빌드를 하지 않았기 때문입니다.

 

프로젝트를 build 해줍니다. build 메뉴 -> build project

 

이제는 다음과 같이 각각의 속성이 자동완성됩니다. 이는 바로 @ConfigurationProperties 어노테이션을 통해 클래스파일에 존재하는 멤버변수의 변수명들을 application.properties에서 외부적으로 관리할 수있도록 도와줍니다.

 

값을 넣어보겠습니다.

다음과 같이 값을 넣었고 단위테스트를 통해서 해당 값에 접근해보고 마무리 짓도록 하겠습니다.

 

결과

- test 코드

@SpringBootTest
@ActiveProfiles("test")
class DemoApplicationTests {

    @Autowired
    MyClassConfigurationProperties myClassConfigurationProperties;

    @Test
    void contextLoads() {
        System.out.println(myClassConfigurationProperties.getPropertyOne());
        System.out.println(myClassConfigurationProperties.getPropertyTwo());
        System.out.println(myClassConfigurationProperties.getPropertyThree());
    }

}

출력결과

댓글

Designed by JB FACTORY