Bean을 주입받을때, @Autowired는 권장되지 않음
IntelliJ에서 @Autowired
를 사용하다보면 다음과 같은 메세지를 종종 보게된다.
필드주입은 권장되지 않는다. 생성자 주입을 사용.
Spring에서 Bean을 주입받는 방법은 아래와 같다.
@Autowired
setter
생성자
이중 가장 권장하는 방식이 생성자로 주입받는 방식이다.
생성자 주입을 권고하는 이유
- 순환참조 방지
- final 선언
- 테스트코드 작성의 용이
1. 순환참조방지
생성자 주입방식은 먼저 생성자의 인자에 사용되는 Bean
을 찾거나 Bean Factory
에서 만든다. 그 후에 찾은 인자 Bean
으로 주입하려는 Bean
의 생성자를 호출한다.
⇒ 먼저 Bean
을 생성하지 않고 주입하려는 Bean
을 먼저 찾는다.setter
와 @Autowired
방식은 먼저 Bean
을 생성한 후, 주입하려는 Bean을 찾아 주입
2. final 선언
생성자 주입의 경우 필드를 final
로 선언할 수 있다.
⇒ 런타임에 객체 불변성을 보장받는다.
3. 테스트 코드 작성의 용이
생성자 주입의 경우 단순히 원하는 객체를 생성한 후 생성자에 넣어줌
⇒ Mocking
없이 테스트코드를 작성
결론
Lombok의 @RequiredArgsConstructor 은 그 번거로움을 해결해준다. final이 선언된 모든 필드를 인자값으로 하는 생성자를 롬복의 @RequiredArgsConstructor가 대신 생성해주기 때문에 위 와 같은 상황을 나도 모르게 방지 할 수 있다.
번외 @AllArgsConstructor
@AllArgsConstructor 는 클래스 내 모든 필드의 생성자를 생성해주는데 이 어노테이션을 사용하면 final이 없이도 생성자 주입이 가능하다. 하지만 위에서 언급한 내용과 같이 객체의 불변성을 보장받을수 없고 불필요한 의존성이 추가되어 코드의 복잡도가 높아질 수 있으므로 되도록이면 final을 곁들인 @RequiredArgsConstructor를 사용하는것이 좋아보인다.
'개발' 카테고리의 다른 글
Docker(1) - image 와 container 사용법 (0) | 2021.08.04 |
---|---|
[Design Pattern] 객체지향의 5대 원칙 Solid원칙 (0) | 2021.07.24 |
[JPA] Entity에서 @Builder 와 @NoArgsConstructor 같이 사용할때 예외 (0) | 2021.04.23 |
Vue 따라해보기 (0) | 2020.12.01 |
FCM - Firebase Cloud Messaging - (1) 개요 및 설정 (작성중) (0) | 2020.08.27 |