본문 바로가기
☕Java/Spring

생성자 주입을 권장하는 이유

by 캔 2022. 5. 30.

스프링의 의존성 주입 방식에는 수정자(setter) 주입, 필드(field) 주입, 생성자(constructor) 주입이 있다. 그중에서 생성자 주입이 다른 방식보다 권장된다. 그 이유들을 간단히 살펴보자.

 

  • 객체를 불변(immutable)으로 만들 수 있다.
  • setter를 사용하는 주입은 실행 중 언제든지 객체를 변경할 수 있지만, 생성자 주입은 객체를 final로 선언할 수 있어 처음 주입된 이후 변경이 불가능하다.

 

  • 애플리케이션 실행 시 의존성을 반드시 주입하여 NullPointerException을 방지한다.
  • 컴파일 시에 어떤 이유에서든 의존성이 주입되지 않는 경우를 막아서 실행 중에 NPE를 막을 수 있다.

 

  • 순환 참조를 막아준다.
  • 한 객체가 다른 객체를 서로 참조할 경우 stack overflow의 위험이 있는데, 생성자 주입 후 빌드를 실행하면 순환 참조 시 빌드가 중단되어 이를 예방한다.

 

  • 테스트 코드 작성을 용이하게 해 준다.
  • 필드 주입에 비해 테스트 작성이 쉽다. 필드 주입 시에는 단위 테스트를 할 때 의존성을 가지는 객체를 생성해서 주입하는 것이 불가능하기 때문이다. 스프링에서는 IoC 컨테이너가 이를 수행하지만, 단위 테스트에서는 그렇지 않다.