프로젝트/게시판 0부터 10까지

왜 생성자 주입을 써야하는가?

필리힐리 2022. 9. 6. 00:09

프로젝트를 하며 필요한 객체의 의존성 주입을 해야한다.
의존성 주입 방식에는 필드 주입, 수정자 주입, 생성자 주입 3가지 방식이 있다.

필드 주입

필드 주입은 아주 깔끔하다.
딱 보면 클린 코드 그 자체로 보이지 않는가?


하지만 우리의 인텔리제이님은 추천하지 않는다고 저렇게 줄을 그어놨다.


의존성 주입이라는 건 불변해야하는데 초기화가 되지 않아 final 선언이 불가하다.
결국 언제든 변할 수 있는 상태라는 의미이기 때문에 좋지 않은 코드이다.

또한 저 boardSvcImpl 변수는 BoardController에 종속되어 있기 때문에 결합도가 높고
이는 테스트 코드를 짜고자 할 때 BoardController를 컴파일해서 스프링 컨테이터에 올려야하는 불편함이 있다.
나는 boardSvcImpl만 테스트하고 싶은데 BoardController까지 불러와야한다.

수정자 주입


수정자 주입은 어떨까?
외부에서 의존성을 넣어주니 결합도는 낮아졌지만 근본적인 문제인 불변성을 지키지 못한다.
* 외부에서 접근이 가능하도록 public이 필수

생성자 주입


대망의 생성자 주입
불변성 문제가 아주 깔끔하게 해결되었다.
처음 어플리케이션이 실행될 때 의존성이 모두 주입되고 이는 어플리케이션이 종료될 때까지 변하지 않는다.
또한 생성자에서만 값을 세팅할 수 있고 final 키워드를 사용할 수 있기 때문에 하기 이미지 처럼 혹시나 생성자에서 값이 세팅 되지 않았을 경우를 방지할 수 있다.
* 필드 주입, 수정자 주입 둘 다 생성자 이후 호출되기 때문에 final 키워드 사용 불가