최근에는 스프링을 포함한 DI 프레임워크 대부분이 생성자 주입을 권장하는 트렌드입니다.
일단 모던 소프트웨어 디자인에서 DI를 하는 가장 중요한 이유는 Modularity 라고 합니다.
아래에서는 간단하게 Modularity 에 연관해서 스프링에서의 DI를 살펴보고, 왜 스프링에서 생성자 주입을 선택하는 것을 권장하는지 살펴보겠습니다.
Figure 33. Overview of the high and low modularity in a graph (Ref. [128]).
그래프 이론에서 나온 지표이고 산출하는데 복잡한 수식을 가지고 있습니다. 하지만 간단히 말하자면 Modularity 가 높을수록 그래프가 잘 분할되었다. 즉 뚜렸한 목적을 가진 녀석들이 독립적으로 모였다라고 말할 수 있습니다.
기존에는 프로그래머가 프로그램 흐름에서 객체를 생성해서 사용했습니다.
하지만 DI 프레임워크에서는 컨테이너가 객체를 관리하며 주입해줍니다.
이밖에 테스트 용이성, 재사용성, 유연성 면에서 장점이 있습니다.
스프링에서의 대표적인 DI 방법은 다음과 같이 3가지가 있습니다.
대부분의 의존관계 주입은 한번 일어나면 애플리케이션 종료시점까지 의존관계를 변경할 일이 없습니다.
이는 대부분의 의존관계는 애플리케이션 종료 전까지 변하면 안된다는 것을 다른 한편으로는 의미합니다.
여기서 필드 주입과 Setter 주입의 문제점이 발생합니다.
필드 주입과 Setter 주입은 필드를 final 로 선언하지 못합니다.
생성자 주입을 사용하면 필드에 final 키워드를 사용할 수 있습니다.
그래서 생성자에서 혹시라도 값이 설정되지 않는 오류를 컴파일 시점에 막아줍니다.
결국 스프링에서 생성자 주입을 사용하는 것이 모듈화의 관점에서도 쫌 더 나은 DI 방법이라고 생각합니다.
물론 변경이 필요한 상황의 경우 Setter 주입을 사용하면 될 것입니다만, 이 경우도 쫌 더 나은 DI 방법이 있다고 생각합니다.