Application/Spring Framework

[Spring] 생성자 주입을 사용해야 하는 이유

반응형

의존성 주입 방법의 종류


먼저 스프링에서 의존성을 주입하는 방법은 다음과 같이 3가지 방법이 있습니다.

  • 생성자 주입 (Constructor-based dependency injection)
  • Setter 주입 (Setter-based dependency injection)
  • 필드 주입 (Field-based dependency injection)


이 중에서,  생성자 주입 사용이 가장 추천 되는 이유

1. final 선언이 가능합니다 (immutable)


  • 생성자 주입 시, 의존성 주입이 클래스 인스턴스화 중에 시작되므로 final 선언을 할 수 있다.
    따라서 객체를 변경이 불가능한 immutable(불변) 하게 할 수 있습니다.
  • 반면에, 필드 주입 혹은 Setter 주입의 경우 final 선언을 할 수 없어, Immutable 하지 않습니다.

Immutable Object (불변 객체)란, 한번 할당하면 내부 데이터를 변경할 수 없는 객체를 의미합니다.

 


2. 다른 방식에 비해 의존성을 외부에서 한눈에 확인하기 쉽습니다.

  • 필드 주입 또는 Setter 주입 시 생성자 주입에 비해 의존성을 외부에서 한눈에 확인하기 어렵다.
    이러한 이유로, 생성자 주입의 경우, 많은 파라미터를 수를 통해 단일 책임의 원칙을 위반 하였는지 의심 해보기 다른 방식에 비해 쉽습니다.

여기서 단일 책임의 원칙은 SOLID 원칙 중 S(Single responsibility principle)으로, "한 클래스는 하나의 책임만 가져야 한다" 를 의미합니다.

 


3. 다른 객체와 느슨한 결합을 맺을 수 있습니다.

  • 필드 의존성 주입 시 다른 객체와 강한 결합을 맺어 개방-폐쇄 원칙을 위반한다.
  • 반면에, 생성자 주입 시 Strategy Pattern (전략 패턴)을 사용할 수 있어 느슨한 결합을 유지할 수 있어, 런타임 시에, 의존성을 동적으로 바꿀 수 있습니다. (Stub Test 등 테스트에도 용이)

여기서 개방-폐쇄 원칙이란 SOLID 원칙 중 O(Open-closed principe)로, "소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다" 를 의미합니다.

 


4. 순환 참조를 방지할 수 있습니다.

  • 순환 참조란 예를 들어 A 클래스가 B에 의존하고, B 클래스 역시 A 클래스에 의존하는 것을 의미합니다.
  • 필드 주입 혹은 Setter 주입시, 순환 참조가 발생하면, StackOverflowError을 발생시킵니다.
  • 반면에 생성자 주입 시 아래와 같은 에러를 볼 수 있습니다.
    The dependencies of some of the beans in the application context form a cycle"


출처) Field injection is not recommended - Spring IOC - Marc Nuri 스프링 - 생성자 주입을 사용해야 하는 이유, 필드인젝션이 좋지 않은 이유

반응형