생성자주입을 선택하라
학습 페이지
왜 생성자 주입을 사용해야 하는지 알아보자.
과거에는 세터주입, 필드 주입을 많이 사용했지만 최근에는 스프링을 포함한 DI프레임워크 대부분이 생성자 주입을 권장한다. 왜?
불변
- 대부분의 의존관계 주입은 애플리케이션 종료시점까지 의존관계를 변경할 일이 거의 없다. 아니, 오히려 바뀌면 안되는 경우가 많다.
- 수정자 주입을 선택하면 setXXX선택자를 public으로 열어야 하는데, 이거 자체가 리스크다.
누락
- 수정자 의존관계일 경우, 프레임워크 없이 순수한 자바 코드를 단위테스트 하는 경우에 의존관계가 누락되는 경우가 많다.
- 테스트 짜는 입장에선 어떤 빈을 생성해서 테스트해보려고 할때 그 빈에 어떤 구현체가 필요한지 알 수 없다. 직접 그 클래스 코드를 들여다 보기 전까지. 그래서 단위테스트때 nullPointerException이 쉽게 난다.
- 하지만 생성자 주입을 사용하면, 주입되어야 하는 구현체가 필수로 인자에 들어가야 하기 때문에 컴파일단계부터 오류가 나, 테스트 진행이 원활함.
final 키워드 사용가능
- final키워드를 이용해 의존관계가 런타임 동안 변하지 않을 것을 보장한다면 좋을 것이다.
- 그런데 final키워드는 생성시에 값이 단 한번만 정해지기 때문에 세터 방식으로는 사용할 수 없는 키워드이다.
- 생성자를 사용할때만 final을 사용가능하다.
- 또한 final은 그 값이 누락되면 컴파일오류가 난다. 따라서 필요한 의존관계가 다 주입되었는지 확인까지 가능함.