[Spring] 07-2. 생성자 주입의 장점

지찬우·2023년 1월 12일
0

Spring

목록 보기
22/27
post-thumbnail

이 시리즈는 인프런 강의(김영한 님의 ‘스프링 핵심 원리 - 기본편’)로 공부하며 혼자 기록하고, 사람들과도 공유할 수 있도록 작성하는 글이다. 최대한 추가적인 정보는 공식 홈페이지, 문서를 보며 얻을 예정이다.
(개인적인 생각과 이해가 들어가 있기 때문에 저의 ‘무식함’이 있을 수 있습니다😜 혹시라도 이 글을 보게 되시는 분이 계시다면 잘못된 부분 댓글로 많이 알려주시면 너무 감사하겠습니다!!)

GitHub Repository : https://github.com/jcw1031/spring-core-study


생성자 주입 💉

과거에는 수정자 주입과 필드 주입을 많이 사용했지만 최근에는 스프링을 포함한 DI 프레임워크 대부분이 생성자 주입을 권장한다. 생성자 주입의 장점과 함께 이유를 알아보자.

생성자 주입 선택의 이유

불변 📌

대부분의 의존관계는 한 번 주입된 후 애플리케이션 종료 시점까지 의존관계를 변경할 일이 없고, 오히려 대부분의 의존관계는 변하면 안 된다.

수정자 주입은 set필드명() 메서드를 public으로 열어 두어야 한다. 이렇게 되면 누군가 실수로 변경할 수 있기 때문에 변경하면 안 되는 의존관계의 수정자 메서드를 열어두는 것은 좋은 설계 방법이 아니다.

생성자 주입은 객체를 생성할 때 딱 한 번만 호출되고 이후에 호출되는 일이 없기 때문에 불변하게 설계가 가능하다.

누락 📌

스프링을 사용하지 않고 순수한 자바 코드로 단위 테스트를 진행하는 경우에 유리하다. 코드 예시로 살펴보자.

만약 아래처럼 수정자 주입을 사용하는 경우의 테스트를 작성해 보겠다. (생성자를 주석 처리해두었기 때문에 AppConfig에서 컴파일 오류가 발생할 것이다. return null로 잠시 변경해두자.)


스프링 컨테이너를 사용하지 않고 new 키워드를 통해 OrderServiceImpl 객체를 생성하여 순수 자바 코드로 createOrder() 메서드의 로직이 잘 작동하는지 확인해 보기 위해 테스트를 작성했다.


하지만 setMemberRepository()setDiscountPolicy() 메서드로 의존관계를 주입하지 않았기 때문에 NullPointerException이 발생한다.

수정자 주입은 테스트 코드에서 OrderServiceImpl은 해당 클래스로 들어가지 않는 이상 어떤 객체가 필요한지 알기 어렵다.


두 필드에 객체가 주입되지 않았기 때문에 발생하는 것이다.


하지만 생성자 주입을 사용하는 경우에는 테스트 코드에서 생성자 매개변수가 누락되었다는 것을 알 수 있고, 어떤 의존관계가 필요한지 알 수 있다.


final 키워드 📌

생성자 주입을 사용하면 필드에 final 키워드를 사용하여 생성자에서 혹시라도 값이 설정되지 않는 오류를 컴파일 시점에 알 수 있다.


memberRepository에 값이 할당되어야 하는데 누락된 경우, 컴파일 오류가 발생한다.

final 키워드의 필드는 오직 직접 값을 할당하거나 생성자를 통해서만 할당할 수 있기 때문에 수정자 주입에는 final 키워드를 사용할 수 없다.


정리 📝

생성자 주입을 사용하는 이유 중 하나는 프레임워크에 의존하지 않고 순수한 자바 언어의 특징을 잘 살릴 수 있는 방법이기 때문이다. 생성자 주입과 수정자 주입은 함께 사용이 가능하기 때문에, 기본으로 생성자 주입을 사용하고 optional한 값은 수정자 주입 방식을 옵션으로 사용할 수 있다.

항상 생성자 주입을 사용! 가끔 옵션이 필요하다면 수정자 주입 사용! 필드 주입은 지양!”

profile
좋은 개발자가 되자.

0개의 댓글