@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());
}
}
출력결과