Constructor-based or setter-based DI?
스프링의 3대요소 중 IoC 제어의 역전 정리 할 때 autowired를 이용한 의존성 주입 시 최근에는 무조건 생성자 주입으로 하고있었다는 걸 깨달았다. 이유는 알았는데 까먹었다, 그래서 다시 정리해보려고 한다.
일단 @RequiredArgsConstructor 사용하면 자동으로 되니까 매우 편했다. ㅎㅎ
먼저 스프링의 공식 문서 자료이다.

정리
- 필수적인 의존성은 생성자 주입을 사용하고 선택적인 의존성은 setter주입을 사용해라 다만 생성자 주입을 통해 객체를 불변하게 유지하는 것을 권장한다.
- setter 주입은 null 체크를 직접 수행해야하는 주의 필요하다.
- 생성자의 매개변수가 많을 경우 클래스의 많은 책임이 있음으로 간주하고 리팩토링이 필요하다.
생성자 주입을 사용해야하는 이유
1. 불변성
- 의존성을 필수적으로 설정하여 강제함으로써 객체를 불변하게 유지해줌
- 객체가 생성될 때 객체의 상태가 초기화되기 때문에 객체의 상태는 사라질 때까지 변하지 않음
2. 순환참조방지
- 의존성이 미리 주입되어 있어 순환 참조가 발생할 가능성이 줄어든다. 객체 간의 순환 참조가 발생하면 빈 생성 중 무한루프 돈다
3. 의존성 보장
- 해당 클래스의 객체가 생성될 때 모든 필수적인 의존성이 주입되어야 한다. 즉 메소드 호출 전 의존성이 보장되어 NullPointException과 같은 런타임 예외를 방지할 수 있다.
4. 테스트 용이
- 의존성 주입하는게 직관적이여서 테스트 케이스에서 mock 객체를 주입하기 쉽다.
- 객체 행위를 검증하기 용이하다.
5. 코드 가독성과 명확성
- 명시적으로 의존성이 드러나 코드 가독성이 향상되고 해당 객체의 어떤 의존성이 필요한지 쉽게 알 수 있다.
출처
https://docs.spring.io/spring-framework/docs/5.0.2.RELEASE/spring-framework-reference/core.html#beans-dependencies