Spring 의존성 주입 - 생성자 주입 VS Setter 주입

Untitled·2024년 1월 9일

Spring

목록 보기
4/12
post-thumbnail

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

profile
그저 그런 꾸준히 하고만 싶은 개발자 이야기

0개의 댓글