-
Spring Framework의 테스트 클래스에서 단일 생성자로 의존성 자동 주입이 되지 않는 이유Spring Boot 2024. 10. 9. 21:39
사전 지식
Spring Framework 4.3부터 해당 빈(bean)의 생성자가 하나뿐인 경우, 그 생성자에
@Autowired
를 붙이지 않아도 생성자 주입이 된다.원문
As of Spring Framework 4.3, an @Autowired annotation on such a constructor is no longer necessary if the target bean defines only one constructor to begin with. However, if several constructors are available and there is no primary/default constructor, at least one of the constructors must be annotated with @Autowired in order to instruct the container which one to use. See the discussion on constructor resolution for details.
- 원문 링크: https://docs.spring.io/spring-framework/reference/core/beans/annotation-config/autowired.html
문제 현상
- Spring Framework 프로젝트에서 JUnit으로 단위 테스트를 작성할 때, @SpringBootTest, @DataJpaTest 등을 사용할 때에는 생성자에
@Autowired
를 붙이지 않으면 생성자 주입이 되지 않는다. - 즉, 생성자가 하나 뿐이더라도
@Autowired
를 생략할 수 없다. - 주입 대상 필드에 final을 붙이고 lombok의 @RequiredArgsConstructor를 사용하여 @Autowired를 생략하고 생성자 주입을 받는 방식을 사용하는 경우, 이 방식을 테스트 클래스에 사용할 수 없다.?
문제 현상의 이유
- @Autowired 없이 자동으로 생성자 주입을 해주는 것은 스프링 프레임워크가 관리하는 빈(bean)에 대해서만 수행된다.
- 스프링 프레임워크가 테스트 클래스는 애플리케이션 컨텍스트에서 관리하는 빈으로 간주하지 않는다.
그럼에도 lombok의 생성자 생성 기능을 사용하고 싶다면?
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
와 같이 onConstructor 옵션을 사용하여 lombok이 생성하는 생성자에 @Autowired를 붙일 수 있다.
결론
- 실제 컴포넌트 클래스에서는
생성자가 하나
인 경우 @Autowired 없이도 의존성 주입이 가능하다. - 테스트 클래스는
스프링 빈이 아니기 때문에
, @Autowired를 사용해 명시적으로 의존성을 주입해야 한다. - 테스트 클래스에서 lombok의 생성자 생성 기능을 사용하면서 생성자 주입을 하고 싶다면,
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
와 같이 사용하면 된다.
'Spring Boot' 카테고리의 다른 글
Spring Boot JPA : Java 날짜/시간 데이터 타입과 JPA, MySQL 타임존의 관계 (0) 2024.04.11 Spring Boot : ProblemDetailsExceptionHandler (0) 2024.04.10 Spring Boot : Default Error Response : 기본 에러 응답 (0) 2024.04.10