자바와 스프링을 공부하는 사람들에게 필수적인 코스가 있습니다.

그것은 공식문서를 보는 것입니다. 

https://docs.spring.io/spring-framework/reference/core/beans/dependencies.html

 

여기서 특이한점은 공식문서에서 생성자 주입을 권장하고 있다는 것입니다. 

 

공식 문서에서 나온 설명

위 내용을 해석해보자면 아래와 같습니다. 

 

생성자 기반 DI(Constructor-based DI)와 세터 기반 DI(Setter-based DI) 중 어떤 것을 사용할지는 클래스에 따라 다를 수 있습니다. 일반적으로는 생성자를 사용하여 필수적인 의존성을 주입하고, 세터 메소드나 설정 메소드를 사용하여 선택적인 의존성을 주입하는 것이 좋은 방법입니다. @Autowired 어노테이션을 세터 메소드에 사용하면 해당 프로퍼티가 필수적인 의존성이 되지만, 인자의 프로그래밍적 유효성 검사와 함께하는 생성자 주입이 더 선호됩니다.

스프링 팀은 일반적으로 생성자 주입을 권장하며, 이는 애플리케이션 컴포넌트를 불변 객체로 구현하고 필수적인 의존성이 null이 되지 않도록 보장합니다. 또한, 생성자 주입된 컴포넌트는 항상 완전히 초기화된 상태로 클라이언트(호출) 코드에 반환됩니다. 덧붙여 말하자면, 많은 수의 생성자 인자는 좋지 않은 코드의 표시로 여겨지며, 클래스가 너무 많은 책임을 가지고 있다는 것을 의미하며, 관심사의 적절한 분리를 위해 리팩터링되어야 합니다.

세터 주입은 주로 클래스 내에서 합리적인 기본값을 할당할 수 있는 선택적인 의존성에 대해 사용되어야 합니다. 그렇지 않으면 의존성을 사용하는 코드의 모든 위치에서 null 체크를 수행해야 합니다. 세터 주입의 이점 중 하나는 세터 메소드를 통해 나중에 클래스의 객체를 재구성하거나 재주입할 수 있다는 점입니다. 따라서 JMX MBean을 통한 관리는 세터 주입의 사용 사례로서 흥미로울 수 있습니다.

 

 

특정 클래스에 가장 적합한 DI 스타일을 선택하십시오. 때로는 소스 코드를 가지고 있지 않은 서드파티 클래스와 작업할 때 선택이 강제될 수 있습니다. 예를 들어, 세터 메소드를 노출하지 않는 서드파티 클래스의 경우 생성자 주입이 유일한 사용 가능한 DI 형태일 수 있습니다.

일단 생성자 주입을 권장하는 가장 큰 이유는

1. 불변객체로 구현한다

2. 필수적인 의존성이 null이 되지 않도록 보장한다. 

 

생각해보면 너무 당연한 것 아닐까요?

setter의 불안전성은 언제 어디에서 객체의 값이 바뀔지 모른다는 것입니다.

하지만 생성자는 객체가 생성되는 순간 초기화하기 때문에 final 상수로 보장받을 수 있으며 그로 인해 null값인지 확인할 필요 없습니다. 반드시 상수로 존재하기 때문입니다. 

 

필요한 경우( 스프링팀은 선택적인 의존성이라고 명시) 세터 주입도 필요하기 때문에 잘 알고 있는 것이 좋을것 같습니다.

왜냐하면 초창기에 코드 리팩토링을 하다가 무조건 생성자 주입으로 서비스에 때려박았던 저처럼 순환참조에서 빠져나오지 못하고 처음부터 다시 시작하게 될수도 있기 때문입니다. 눈물없이 말할 수 없는 스토리인데...나중에 기억을 더듬어 풀어보도록 하겠습니다....

+ Recent posts