달리기를 하고왔다. 아주 좋아요~
오늘 8장까지 듣고, 빅데이터까지 듣자. 화이팅!!!
📌 다양한 의존관계 주입 방법
➡️ 필수
private final MemberRepository memberRepository;
👉 무조건 값이 있어야하는 지정 ❣️
@Autowired
를 생략해도 되는 경우수정자란?(setter): 필드의 값을 변경하는 수정자 메서드 (set+필드이름)
setter
라 불리는 필드의 값을 변경하는 수정자 메서드를 통해서 의존관계를 주입하는 방법이다.
@Autowired(required = false)
→ 주입할 대상이 없어도 동작할 수 있게 한다.예제 코드
<@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;
}
➕ 생성자가 없어도 된다.
<스프링 생성과정>
1. 스프링 컨테이너 생성
2. 스프링 빈 등록
3. 스프링 빈 의존 관계 설정 - 준비
4. 스프링 빈 의존 관계 설정 - 완료 ⬅️ 바로 이시점에 의존관계 재 주입
setter
와 getter
을 사용해서 수정하고, 읽게 하는 규칙이 있다.이름 그대로 필드에 바로 주입하는 방법이다.
➡️ 안티패턴이다. : 외부에서 변경이 불가능해서 테스트 하기 힘들다.
순수한 자바 코드로 테스트 할 수가 없다.
순수한 자바 테스트 코드에는 당연히 @Autowired가 동작하지 않는다.
@Component
public class OrderServiceImpl implements OrderService{
//주문을 받은 다음, 회원 조회 , 할인 적용을 해야한다.
@Autowired private MemberRepository memberRepository;
@Autowired private DiscountPolicy discountPolicy;
😣 오류
@Test
void fieldInjectionTest() {
OrderServiceImpl orderService1 = new OrderServiceImpl();
orderService1.createOrder(1L,"pizza",10000);
}
🔨 오류 해결
@Test
void fieldInjectionTest() {
OrderServiceImpl orderService1 = new OrderServiceImpl();
MemoryMemberRepository repository = new MemoryMemberRepository();
repository.save(new Member(1L,"member1",Grade.VIP));
orderService1.setMemberRepository(repository);
orderService1.setDiscountPolicy(new RateDiscountPolicy());
orderService1.createOrder(1L,"pizza",10000);
}
그냥 안 쓸레요ㅎ , 괜히 복잡해지고 싶지 않아요...ㅎ
예제코드
@Autowired
public void init(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
참고: 어쩌면 당연한 이야기이지만 의존관계 자동 주입은 스프링 컨테이너가 관리하는 스프링 빈이어야 동작한다.
스프링 빈이 아닌 Member 같은 클래스에서 @Autowired 코드를 적용해도 아무 기능도 동작하지 않는다.
요즘 계속 배가 아프다..? 왜그러지 ?