Spring Boot를 이용한 프로젝트를 진행 중이었고 appliation.yml에 있는 값을 가져와서 사용하게 되었는데, 이 과정에서 @ConfigurationProperties라는 어노테이션을 알게 되었다.
application.properties나 application.yml의 값이 같은 값으로 시작할 때 그것을 묶어서 bean으로 등록할 수 있다.
my:
name: duck
age: 23
예를 들어서 application.yml 파일에 위와 같이 설정했을 때 이 값을 사용할 수 있도록 하는 클래스를 만들어줄 수 있다.
@Component
@ConfigurationProperties(prefix = "my")
public class FileProperties {
private String name;
private int age;
// name, age에 대한 getter, setter 생성
}
여기서 @ConfigurationProperties(prefix = "my")는 메타데이터를 생성해서 자동완성 기능을 가능하게 해주는 의존성을 추가해주는 역할을 한다.
이를 사용하려면 main에 @EnableConfigurationProperties 어노테이션을 사용하여 프로퍼티 클래스를 값으로 줘서 사용해야 하는데, Spring Boot에서는 자동으로 해주므로 해당 파일만 Bean으로 등록해주기만 하면 된다고 한다.
JUnit5를 이용해 Controller를 테스트하는 도중 에러가 생겼다.
찾아보니까 @ConfigurationProperties를 설정한 클래스에 대한 객체에 @Autowired를 해줬는데 Bean을 못찾는다는 에러라는 것 같은데...(정확한 의미인지는 모르겠다.) 한참 헤매다 이유 및 해결책을 찾게 되었다.
@ConfigurationProperties는 테스트에서 빌드할 때 application context에 의해 관리되지 않기 때문에 의존성 주입이 안돼 오류가 발생했던 것이다! 메인문에 있는 @EnableConfigurationProperties는 스프링 부트가 실행될 때 영향이 있는데, @SpringBootTest에서는 유효하지 않는다고 한다.
(본인은 단위 테스트 한다고 대신 @WebMvcTest를 썼는데 똑같은 것 같다.)
테스트 클래스 위에 @EnableConfigurationProperties({Config1.class, Config2.class, ...})를 추가하여 안에 있는 클래스들이 @SpringBootTest의 application context가 다룰 수 있도록 하여 yml에 있는 properties에 접근할 수 있도록 한다.