생성자 주입

- 생성자를 활용하여 의존관계를 주입

- 빈 등록과 동시에 의존관계 주입이 발생함 (의존관계 주입을 생성자로 하는데, 빈 등록을 위해 객체 생성을 하려면 생성자를 바로 호출하니깐...)

- 딱 1번만 발생

- final 키워드 사용 가능 (생성자로 바로 초기화가 가능하니깐...)

=> 불변, 필수

- 생성자가 1개만 있으면 @AutoWired를 생략해도 됨

@Component
public class OrderServiceImpl implements OrderService{

    private final MemberRepository memberRepository;
    private final DiscountPolicy discountPolicy;

    @Autowired // 생략 가능
    public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
        this.memberRepository = memberRepository;
        this.discountPolicy = discountPolicy;
    }

    /*
    	비즈니스 로직
    */
}

 

수정자 주입

- setter 메서드를 활용

- setter 메서드는 나중에도 호출이 가능

- final 키워드 사용 불가

=> 변경, 선택

@Component
public class OrderServiceImpl implements OrderService{

    private MemberRepository memberRepository;
    private DiscountPolicy discountPolicy;

    @Autowired
    public void setMemberRepository(MemberRepository memberRepository){
        this.memberRepository = memberRepository;
    }

    @Autowired
    public void setDiscountPolicy(DiscountPolicy discountPolicy){
        this.discountPolicy = discountPolicy;
    }

    /*
    	비즈니스 로직
    */
}

 

필드 주입

- 그냥 필드에 @AutoWired만 써서 바로 주입

- 코드가 간결하지만, 외부에서 변경이 불가능해서 테스트가 어려움

- 스프링 프레임워크가 없으면 기능 X

- 그냥 Java코드로 테스트 어려움

@Component
public class OrderServiceImpl implements OrderService{

	@AutoWired
    private MemberRepository memberRepository;
    @AutoWired
    private DiscountPolicy discountPolicy;    

    /*
    	비즈니스 로직
    */
}

 

일반 메서드 주입

- 사용 X

@Component
public class OrderServiceImpl implements OrderService{

    private MemberRepository memberRepository;
    private DiscountPolicy discountPolicy;

    @Autowired
    public void init(MemberRepository memberRepository, DiscountPolicy discountPolicy){
        this.memberRepository = memberRepository;
        this.discountPolicy = discountPolicy;
    }

    /*
    	비즈니스 로직
    */
}

 

 

어떤 주입 방법을 사용?

=> 생성자 주입 사용

- 생성자 주입은 불변, 필수의 특징이 있음

- 불변 : 의존관계는 한번 주입이 일어나면 애플리케이션 종료까지 변경될 일도 없고, 변경되면 안 됨, 생성자 주입은 생성자 호출 시 단 1회만 발생

- 필수 : 객체 생성 시 생성자 호출이 필수적

- final 키워드는 생성자 주입에서만 사용이 가능 => 값이 초기화되지 않는 경우 IDE에서 컴파일 오류로 알려줌

- 테스트 시에 생성자 파라미터를 누락한 경우 IDE에서 컴파일 오류로 알려줌

- 그냥 Java로 테스트 가능

 

- 수정자 주입이나 일반 메서드 주입은 메서드를 public으로 두기 때문에 누가 나중에 변경할 수 도 있음 => 불변 X