SpringBoot의 @ConfigurationProperties (+ 테스트 중 발생한 오류 잡기)

지니·2021년 7월 20일
0

대학생의 일기

목록 보기
6/17

Spring Boot를 이용한 프로젝트를 진행 중이었고 appliation.yml에 있는 값을 가져와서 사용하게 되었는데, 이 과정에서 @ConfigurationProperties라는 어노테이션을 알게 되었다.

@ConfigurationProperties

@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에 접근할 수 있도록 한다.

profile
Coding Duck

0개의 댓글