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

728x90

스프링에서 의존성을 주입하는 방식은 세 가지가 있다.
(요거 별거 아닌데 면접 질문으로 자주 나왔던 기억이 있다.   나오면 꽁으로 먹는 문제)

  1.  필드 주입 (= @Autowired)
  2. setter 주입
  3. 생성자 주입

스프링에서는 위의 세 가지 방식 중 생성자 주입 방식을 통해서 의존성을 주입하는 것을 권장하고있다.
(똑똑한 인텔리제이 마저 생성자 주입을 하라고 꾸짖는다.)

그 이유는 불변(= immutable)하게 만들기 위해서다.

  • 대부분의 의존관계 주입은 한번 일어나면 애플리케이션 종료 시점까지 의존관계를 변경할 일이 없다. (아니 변하면 안된다!)
  • 수정자 주입을 사용하면, setter를 public으로 열워둬야하는데 이는 개발자의 실수로인해 주입된 의존성이 변경될 수 있다.
  • 생성자 주입은 객체를 생성할 때, 1회성으로 호출되기 때문에 한번 객체가 생성되면 변경의 위험이 없다. (즉 불변하다!)
  • 필드들을 final로 선언할 수 있다. -> 혹시나 주생성자를 통해서 초기화되지 않은 필드가 있다면, 컴파일 에러가 발생

테스트하기 쉬운 객체가 된다.

의존하는 객체(일반적인 Service 클래스라고 생각해보면 Repository 클래스들?)를 쉽게 갈아끼울 수 있다. 
이 장점들로인해 스프링 프레임워크에 의존하지 않는 순수 자바객체에 대한 테스트를 작성할 수 있다.

 

728x90