- 스프링은 Dependency Injection을 위해
@AutoWired
어노테이션을 제공한다.
- 이를 사용해 필드 주입, 세터 주입, 생성자 주입의 세가지 방식의 의존관계 주입이 가능하다.
각각 Injection 방식을 먼저 활용해 보겠습니다.
Parent를 상속한 ChildA를
@Component
를 통해 Bean으로 등록하였습니다.필드 주입
FieldInjection 클래스 자체도 Bean으로 등록이 되었으며
printChild
메소드는 @PostConstruct 를 통해 빈 초기화 작업 후 실행 하도록 설정하였습니다.생성자도 없고 private 필드인
child
에다가 Spring이 제주껏 Bean Type을 통해 의존관계 주입을 해 주었습니다. 아마 리플렉션을 활용하는 것 같습니다.세터 주입
역시 잘 동작합니다. 로그를 찍어보면 setter를 명시적으로 호출하여 의존관계 주입이 되었음을 확인할 수 있습니다.
생성자 주입
역시 역시 잘 동작합니다. 로그를 찍어보면 클래스를 생성하는 시점에 의존관계 주입이 발생함을 알 수 있습니다.
장 단점
- 의존 관계를 주입하는 세가지 방법을 모두 활용해 보았습니다.
- 각 방식의 장단점은 아래와 같습니다.
필드 주입
👍 장점
- 간단하다
👎 단점
- 의존관계가 주입 되는 시점을 확인 할 수 없다.
- 스프링에 의존적이다.
따라서 혼자 뚝뚝딱딱 대충 실험 하거나 테스트 코드를 작성하는 경우에만 활용하자.
세터 주입
👍 장점
- 의존관계의 주입 시점을 확인 할 수 있다.
- 동적으로 의존관계를 변경할 수 있다.
- 의존관계의 cycle을 해결할 수 있다.
👎 단점
- 필드에 final 키워드를 사용할 수 없다.
생성자 주입
👍 장점
- 의존관계의 주입 시점을 확인 할 수 있다.
- 필드에 final 키워드를 사용할 수 있다.
생성자 주입 써라
- 웹 애플리케이션에서 의존관계가 한번 결정되면 동적으로 바뀌어야 하는 경우는 드물다.
- 의존관계의 cycle도 잘 발생하지 않고 설계를 변경하여 없앨 수 있는 경우가 많다.
- 위의 장 단점을 고려하였을때 대부분의 경우 생성자 주입이 정답임을 알 수 있음
- 추가로 생성자 주입의 경우 Lombok과 조합하여 사용한다면 코드라인을 매우 줄일 수 있습니다.
@RequiredArgsConstructo
r 를 통해 final 키워드가 붙은 필드를 주입하는 생성자 자동 생성- 생성자가 하나있을때
@Autowired
생략가능