생성자 주입이란?
- 의존성 주입의 방법중의 하나이다.
그 많은 방법 중에서 왜 생성자 주입을 사용해야 하는지 알아보자.
의존성 주입의 여러가지 방법
1. 생성자 주입 Constructor Injection
- 말 그대로 생성자를 통한 의존 관계를 주입하는 방법이다
@Component
public class OrderServiceImpl implements OrderService{
private MemberRepository memberRepository;
private DiscountPolicy discountPolicy;
@Autowired // 생성자가 하나일 경우 생략이 가능하다
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
...
생성자 주입의 특징
- 불변
- 대부분의 의존 관계는 한번 정해지면, 애플리케이션 구동이 끝날때까지 변하지 않는다
- 객체를 생성할 때 한번만 호출되므로 이후에 호출되지 않는다.
- 누락
- 개발자의 실수로 인한 테스트 오류를 final을 통해 컴파일 단계에서 막을 수 있다.
@Component
public class OrderServiceImpl implements OrderService{
private final MemberRepository memberRepository; // final로 미리 오류를 방지
private final DiscountPolicy discountPolicy;
@Autowired
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
2. 수정자 주입 Setter Injection
- 필드 값을 변경하는 메서드인
Setter을 통해서 의존 관계를 주입하는 방법이다.
public class OrderServiceImpl implements OrderService{
private MemberRepository memberRepository; // final을 사용할 수 없다!
private DiscountPolicy discountPolicy;
public void setDiscountPolicy(DiscountPolicy discountPolicy) {
this.discountPolicy = discountPolicy;
}
public void setMemberRepository(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
수정자 주입의 특징
- 주입받는 객체가 애플리케이션 구동 중간에 변경될 가능성이 있는 경우에 사용한다.
- 중간에 변경되는 경우는 극히 드물기 때문에 잘 사용하지 않는다.
3. 필드 주입 Field Injection
- 필드에서 생성자나 수정자를 거치지 않고 바로 주입하는 방식이다.
@Component
public class OrderServiceImpl implements OrderService{
@Autowired
private MemberRepository memberRepository;
@Autowired
private DiscountPolicy discountPolicy;
필드 주입의 특징
- 코드가 간결해진다
- 외부에서 접근이 불가능해진다
- 2번의 이유로 인해서 현재는 거의 사용하지 않는다
- DI 프레임워크가 필수적이다
왜 생성자 주입을 사용해야 할까
의존성 주입 방법에는 각각의 장점과 단점이 혼재한다 하지만 최근 트렌드는 생성자 주입을 사용하라고 권장한다.
- 프레임워크에 의존하지 않는다
필드 주입 참조 - final 키워드를 사용가능하다
컴파일 단계에서 오류를 잡는다 - Lombok과 결합이 가능하다
코드가 간결해진다 - 순환참조가 방지된다
스프링 2.6이하 버전에서만 해당
위와 같은 이유들 때문에 기본으로 생성자 주입을 사용한 후, 수정자 주입 방식을 옵션으로 부여하는게 좋다.
참고
이 글은 velog에 먼저 올렸던 글입니다 · 원문 보기 ↗
