- 해당 게시물은 인프런 "스프링 핵심 원리 - 기본편" 강의를 참고하여 작성한 글 입니다.
최근에는 스프링을 포함한 DI 컨테이너들은 생성자 주입을 권장한다. 그 이유는 다음과 같다.
OrderServiceImpl 에서 수정자 주입으로 의존관계를 주입했다.
순수 자바 코드를 이용해서 OrderServiceImpl 의 '주문 요청'메서드를 테스트하자.
NullPointerException 이 발생한다.
OrderServiceImpl 을 생성해서 테스트 코드를 작성하는 상황에서는 의존관계를 주입해야 하는 것을 발견하지 못하기 때문이다.
set은 '객체가 생성된 후에' 의존관계 주입을 하는거니까. 생성시에는 별 문제가 안된다.
OrderServiceImpl 의 의존관계를 '생성자 주입'으로 변경했다.
테스트 코드로 돌아가보자. 코드에 빨간 밑줄이 벌써 떠있고 constructor 오류가 난다.
보는 것과 같이 컴파일 오류가 발생해서 미리 알려준다.
바로 빨간줄 뜨고 자바 컴파일러가 생성자에 의존관계 주입하라고 컴파일 시점에 잡을 수 있다.
막상 개발을 해보면 대부분이 다 불변이다. 그래서 생성자에 final 키워드를 붙이게 된다.
대부분 다 비슷한 코드를 사용할 것인데 누군가 간단하게 만들수 있도록 해놓지 않았을까?
해당 OrderServiceImpl 을 최적화 해보자.
@RequiredArgsConstructor 가 final 이 붙은 필드를 가지고 생성자 코드를 그대로 만들어준다.