이 글은 강의 : 김영한님의 - "스프링 핵심원리 - 기본편"을 듣고 정리한 내용입니다. 😁😁
이번 챕터는 의존관계 자동주입으로 다양한 의존관계 주입 방법에 대해서 알아볼 것이다.
생성자 주입 -> 가장 많이 사용한다 ☺☺
수정자 주입(setter 주입)
필드 주입
일반 메서드 주입
먼저 생성자를 통해서 의존관계를 주입받는 방법이다. (지금까지 우리가 진행했던 방법)
1) 특징
2) 생성자 주입 코드 작성
package hello.core.order;
@Component
public class OrderServiceImpl implements OrderService{
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
// 1. 생성자 주입
@Autowired // ac.getBean(MemberRepository.class), ac.getBean(DiscountPolicy.class)
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
...
}
3) @Autowired 생략
🎈 중요!!
생성자가 딱 1개 있으면 @Autowired를 생략해도 자동 주입된다!!! (스프링 빈에만 해당)
package hello.core.order;
@Component
public class OrderServiceImpl implements OrderService{
// 1. 생성자 주입
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
System.out.println("memberRepository = " + memberRepository);
System.out.println("discountPolicy = " + discountPolicy);
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
...
}
필드의 값을 변경하는 수정자 메서드(setter)를 통해 의존관계를 주입하는 방법이다.
1) 특징
2) 수정자 주입 코드 작성
package hello.core.order;
@Component
public class OrderServiceImpl implements OrderService{
// setter를 만들기 위해 final 제거
private MemberRepository memberRepository;
private DiscountPolicy discountPolicy;
// 2. 수정자 주입
@Autowired
public void setMemberRepository(MemberRepository memberRepository) {
System.out.println("memberRepository = " + memberRepository);
this.memberRepository = memberRepository;
}
// 2. 수정자 주입
@Autowired
public void setDiscountPolicy(DiscountPolicy discountPolicy) {
System.out.println("discountPolicy = " + discountPolicy);
this.discountPolicy = discountPolicy;
}
...
}
(참고) @Autowired 의 기본 동작은 주입할 대상이 없으면 오류가 발생한다. 주입할 대상이 없어도 동작하게 하려면 @Autowired(required = false) 로 지정하면 된다.
memberRepository가 스프링 빈으로 등록되지 않아도 setmemberRepository() 를 호출할 수 있음
`필드에 바로 주입하는 방법. 특별한 경우(테스트 코드)를 제외하고는 사용하지 말자.
1) 특징
2) 필드 주입 코드 작성
package hello.core.order;
@Component
public class OrderServiceImpl implements OrderService{
// 3. 필드 주입
@Autowired private final MemberRepository memberRepository;
@Autowired private final DiscountPolicy discountPolicy;
...
}
참고로 순수 자바 테스트 코드에서는 @Autowired가 동작하지 않는다. 스프링 컨테이너를 테스트에 통합한 경우에만 가능!
**** 일반 메서드 주입은 잘 사용하지 않으니..... 패스해도 좋아
의존관계 자동 주입은 스프링 컨테이너가 관리하는 스프링 빈이어야 동작한다. 스프링 빈이 아닌 Member 같은 클래스에서 @Autowired 코드를 적용해도 아무 기능도 동작하지 않는다.