의존관계 자동 주입

yanju·2024년 8월 2일
0
post-thumbnail

해당 게시물은 인프런 - "스프링 핵심 원리 - 기본편" 강의를 참고하여 작성한 글 입니다
유료강의이므로 자세한 내용은 없고, 간단한 설명 위주로 정리했습니다 강의 링크

다양한 의존관계 주입 방법

  • 생성자 주입
  • 수정자 주입 (setter 주입)
  • 필드 주입
  • 일반 메소드 주입

생성자 주입

생성자를 통해 의존 관계를 주입 받는다

생성자 호출시점에 딱 1번만 호출되는 것이 보장된다

불변, 필수 의존관계에 사용한다

생성자가 딱 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를 통해 의존관계를 주입한다

선택, 변경 가능성이 있는 의존관계에 사용한다

@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;
    }
}

필드 주입

필드에 바로 주입하는 방법이다

DI 프레임워크가 없으면 아무것도 할 수 없어서 사용이 권장되지 않는다

@Component
public class OrderServiceImpl implements OrderService {
    @Autowired
    private MemberRepository memberRepository;
 
 	@Autowired
    private DiscountPolicy discountPolicy;
}

조회 빈이 2개 이상

@Autowired는 타입(Type)으로 빈을 조회한다

선택된 빈이 2개 이상일 때 문제가 발생한다

@Component
public class FixDiscountPolicy implements DiscountPolicy {}

@Component
public class RateDiscountPolicy implements DiscountPolicy {}

@Autowired
private DiscountPolicy discountPolicy

위에서는 fixDiscountPolicy, rateDiscountPolicy 2개 중에 선택할 수 없다

NoUniqueBeanDefinitionException 오류가 발생한다

@Qualifier, @Primary

조회 대상 빈이 2개 이상일 때 해결 방법

  • @Autowired 필드 명 매칭
  • @Qualifer
  • @Primary

@Autowired 필드 명 매칭

@Autowired는 타입 매칭을 시도하고, 이때 여러 빈이 있으면 필드 이름, 파라미터 이름으로 빈 이름을 추가 매칭한다

@Autowired
private DiscountPolicy rateDiscountPolicy

필드 명이 rateDiscountPolicy이므로 RateDiscountPolicy 빈이 주입된다

@Qualifier

@Qualifer는 추가 구분자를 붙이는 방법이다

주입시 추가적인 방법을 제공하는 것이지 빈 이름을 변경하는 것은 아니다

@Component
@Qualifier("mainDiscountPolicy")
public class RateDiscountPolicy implements DiscountPolicy {}

@Component
@Qualifier("fixDiscountPolicy")
public class FixDiscountPolicy implements DiscountPolicy {}

@Autowired
public OrderServiceImpl(MemberRepository memberRepository,
                         @Qualifier("mainDiscountPolicy") DiscountPolicy
 discountPolicy) {
     this.memberRepository = memberRepository;
     this.discountPolicy = discountPolicy;
}

@Primary

@Primary는 우선순위를 정한다

@Autowired시에 여러 빈이 매칭되면 @Primary가 우선권을 가진다

@Component
@Primary
public class RateDiscountPolicy implements DiscountPolicy {}
 
@Component
public class FixDiscountPolicy implements DiscountPolicy {}

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

0개의 댓글