Spring에서 의존성 주입 방식은 생성자 주입, 필드 주입, setter 주입 크게 3가지가 있습니다.
필드 주입과 같은 경우는 변수에 Autowired 어노테이션을 붙여 사용합니다. 코드가 간단하지만 private 키워드로 필드를 선언했다면 외부에서 변경이 불가능하여 테스트 작성에 어려움이 있으며 프레임워크 의존도가 높아집니다.
setter 주입은 setter 메서드에 어노테이션을 붙여 사용합니다. 의존성을 선택적으로 주입하거나 런타임에 의존성을 변경해야 할 때 유용하다는 장점이 있지만, 완료되지 않는 상태에서 객체가 사용될 위험이 존재하기에 불변성이 보장되지 않습니다.
생성자 주입은 Bean 인스턴스를 생성하기 위해 필수 의존성을 먼저 해결해야 하므로, 객체가 생성되는 시점부터 완전한 상태를 보장할 수 있습니다. 반면 Setter/Field 주입은 Bean 인스턴스가 먼저 생성된 후 populateBean() 단계에서 의존성이 설정되므로 구조적으로 의존성이 설정되지 않은 중간 상태가 존재할 수 있습니다. 이러한 특성 때문에 필수 의존성에는 생성자 주입이 적합하며, 불변성(final)과 객체의 완전성을 보장할 수 있다는 점에서 권장됩니다.