최근에는 스프링을 포함해서 DI Framework 대부분들이 생성자 주입을 권장하고 있다.
수정자 의존 관계가 아래와 같을 때, @Autowired가 프레임워크 내에서 동작할 때에는 의존관계가 없으면 오류가 발생하나 프레임워없이 자바 코드로만 단위 테스트를 수행하고 있다. 테스트를 진행하면 실행은 되지만, NPE가 발생하는데 그 이유는 memberRepository, discountPolicy가 의존관계 주입이 누락되었기 때문이다.
@Autowired
public void setMemberRepository(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
@Autowired
public void setDiscountPolicy(DiscountPolicy discountPolicy){
this.discountPolicy = discountPolicy;
}
생성자 주입을 사용한다면 아래와 같이 주입 데이터를 누락했을 때 컴파일 오류
가 발생하면서 어떤 값을 필수로 주입해야 하는지 바로 알 수 있게 된다.
@Test
void createOrder() {
OrderServiceImpl orderService = new OrderServiceImpl();
orderService.createOrder(1L, "A", 10000);
}
생성자 주입을 사용하면 필드에 final
키워드를 사용할 수 있다. 따라서 생성자에서 값이 할당되지 않았을 때, 컴파일 오류를 발생하여 막을 수 있다.
@Component
public class Exampleimpl implements Example {
private final ClassA classA;
private final ClassB classB;
// classB에 값이 할당되지 않았으므로 오류 발생
public Exampleimpl(ClassA classA, ClassB classB) {
this.ClassA = classA;
}
}
참고
수정자 주입을 포함한 나머지 주입 방식은 모두 생성자 이후에 호출되므로, 필드에final
을 사용할 수 없다. 생성자 주입만final
키워드 사용이 가능하다.