네로개발일기

개발자 네로의 개발 일기, 자바를 좋아합니다 !

반응형
보통 스프링에서 빈 주입을 할 때, 다음과 같이 사용을 한다.
@Component
@RequiredArgsConstructor
public class MadExample {
    private final HelloService helloService;
    ... 생략 ...
}
lombok의 @RequiredArgsConstructor 을 사용하여 초기화 되지 않은 final 필드나 @NonNull이 붙은 필드에 대해 생성자를 생성해 주어, 주로 의존성 주입(Dependency Injection) 편의성을 위해 사용한다.
어떠한 빈(Bean)에 생성자가 오직 하나만 있고, 생성자의 파라미터 타입이 빈으로 등록가능한 존재라면, 이 빈은 @Autowired 어노테이션 없이도 의존성 주입이 가능하다.
 
회사 동료는 필드 주입으로 되어있던 코드들을 생성자 주입으로 변경하는 중이었다. (생성자 주입을 권장하는 이유) 빈에 @RequiredArgsConstructor 나 @AllArgsConstructor를 사용했지만 빈 생성 오류가 난다는 연락을 받았다.
 

Lombok 

1) 프로젝트에 lombok 라이브러리가 설치되어 있는지 확인
2) IDE(IntelliJ)에 lombok 플러그인이 추가되어있는지 확인
  • Settings > Plugins > Lombok Plugin 설치

  • Settings > Build, Execution, Deployment > Compiler > Annotation Processors Enable annotation processing 활성화

스프링 버전

스프링 버전과 빈 주입의 상관관계가 있을 것 같아서 찾아보았다. 아래처럼 Spring 4.3부터 생성자가 오직 하나만 있고, 생성자의 파라미터 타입이 빈으로 등록가능한 존재라면, 이 빈은 @Autowired 어노테이션을 생략할 수 있다고 한다.
 
Starting with Spring 4.3, if a class, which is configured as a Spring bean, has only one constructor, the @Autowired annotation can be omitted and Spring will use that constructor and inject all necessary dependencies.
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.
 
해당 프로젝트의 스프링 버전은 4.1.2였고, @Autowired 생략이 불가능해 생성자 주입을 할 때 @Autowired를 명시적으로 작성해줘야 한다.

 

728x90
반응형
blog image

Written by ner.o

개발자 네로의 개발 일기, 자바를 좋아합니다 !