์กฐํ ๋น์ด 2๊ฐ ์ด์ - ๋ฌธ์
@Component
public class FixDiscountPolicy implements DiscountPolicy {
@Component
public class RateDiscountPolicy implements DiscountPolicy {
DiscountPolicy ์ ํ์ ํ์ ์ธ FixDiscountPolicy , RateDiscountPolicy ๋๋ค ์คํ๋ง ๋น์ผ๋ก ์ ์ธ
์คํ๋ง ๋น ์กฐํ์์ ํ์ตํ๋ฏ์ด ํ์ ์ผ๋ก ์กฐํํ๋ฉด ์ ํ๋ ๋น์ด 2๊ฐ ์ด์์ผ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
@Autowired
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
@Autowired ๋ ํ์ (Type)์ผ๋ก ์กฐํํ๋ค.
ํ์ ์ผ๋ก ์กฐํํ๊ธฐ ๋๋ฌธ์,
๋ง์น ac.getBean(DiscountPolicy.class) ์ ์ฌํ๊ฒ ๋์ํ๋ค. (์ค์ ๋ก๋ ๋ ๋ง์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.)
NoUniqueBeanDefinitionException: No qualifying bean of type
'hello.core.discount.DiscountPolicy' available: expected single matching bean
but found 2: fixDiscountPolicy,rateDiscountPolicy
NoUniqueBeanDefinitionException ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
ํ๋์ ๋น์ ๊ธฐ๋ํ๋๋ฐ fixDiscountPolicy , rateDiscountPolicy 2๊ฐ๊ฐ ๋ฐ๊ฒฌ๋์๋ค๊ณ ์๋ ค์ค๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ์ ํ๋์ฉ ์์๋ณด์.
@Autowired ํ๋ ๋ช , @Qualifier, @Primary
์กฐํ ๋์ ๋น์ด 2๊ฐ ์ด์์ผ ๋ ํด๊ฒฐ ๋ฐฉ๋ฒ
- @Autowired ํ๋ ๋ช ๋งค์นญ
- @Qualifier -> @Qualifier๋ผ๋ฆฌ ๋งค์นญ -> ๋น ์ด๋ฆ ๋งค์นญ
- @Primary ์ฌ์ฉ
@Autowired ํ๋ ๋ช
๋งค์นญ
@Autowired ๋ ํ์ ๋งค์นญ์ ์๋ํ๊ณ , ์ด๋ ์ฌ๋ฌ ๋น์ด ์์ผ๋ฉด ํ๋ ์ด๋ฆ, ํ๋ผ๋ฏธํฐ ์ด๋ฆ์ผ๋ก ๋น ์ด๋ฆ์ ์ถ๊ฐ ๋งค์นญํ๋ค.
@Autowired
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy rateDiscountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = rateDiscountPolicy;
}
ํ๋ ๋ช ์ด rateDiscountPolicy ์ด๋ฏ๋ก ์ ์ ์ฃผ์ ๋๋ค.
ํ๋ ๋ช
๋งค์นญ์ ๋จผ์ ํ์
๋งค์นญ์ ์๋ ํ๊ณ ๊ทธ ๊ฒฐ๊ณผ์ ์ฌ๋ฌ ๋น์ด ์์ ๋ ์ถ๊ฐ๋ก ๋์ํ๋ ๊ธฐ๋ฅ์ด๋ค.
@Autowired ๋งค์นญ ์ ๋ฆฌ
1. ํ์
๋งค์นญ
2. ํ์
๋งค์นญ์ ๊ฒฐ๊ณผ๊ฐ 2๊ฐ ์ด์์ผ ๋ ํ๋ ๋ช
, ํ๋ผ๋ฏธํฐ ๋ช
์ผ๋ก ๋น ์ด๋ฆ ๋งค์นญ
@Qualifier ์ฌ์ฉ
@Qualifier ๋ ์ถ๊ฐ ๊ตฌ๋ถ์๋ฅผ ๋ถ์ฌ์ฃผ๋ ๋ฐฉ๋ฒ์ด๋ค.
์ฃผ์ ์ ์ถ๊ฐ์ ์ธ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ ๊ฒ์ด์ง ๋น ์ด๋ฆ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ ์๋๋ค.
@Component
@Qualifier("mainDiscountPolicy")
public class RateDiscountPolicy implements DiscountPolicy {
@Component
@Qualifier("fixDiscountPolicy")
public class FixDiscountPolicy implements DiscountPolicy {
๋น ๋ฑ๋ก์ @Qualifier๋ฅผ ๋ถ์ฌ ์ค๋ค.
@Autowired
public OrderServiceImpl(MemberRepository memberRepository, @Qualifier("mainDiscountPolicy") DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
์ฃผ์ ์์ @Qualifier๋ฅผ ๋ถ์ฌ์ฃผ๊ณ ๋ฑ๋กํ ์ด๋ฆ์ ์ ์ด์ค๋ค.
@Qualifier ์ ๋ฆฌ
1. @Qualifier๋ผ๋ฆฌ ๋งค์นญ
2. ๋น ์ด๋ฆ ๋งค์นญ
3. NoSuchBeanDefinitionException ์์ธ ๋ฐ์
@Primary ์ฌ์ฉ
@Primary ๋ ์ฐ์ ์์๋ฅผ ์ ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
@Autowired ์์ ์ฌ๋ฌ ๋น์ด ๋งค์นญ๋๋ฉด @Primary ๊ฐ ์ฐ์ ๊ถ์ ๊ฐ์ง๋ค.
@Component
@Primary
public class RateDiscountPolicy implements DiscountPolicy {
rateDiscountPolicy ๊ฐ ์ฐ์ ๊ถ์ ๊ฐ์ง๋๋ก ํ์.
์ฝ๋๋ฅผ ์คํํด๋ณด๋ฉด ๋ฌธ์ ์์ด @Primary ๊ฐ ์ ๋์ํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค
์ฐ์ ์์
@Primary ๋ ๊ธฐ๋ณธ๊ฐ ์ฒ๋ผ ๋์ํ๋ ๊ฒ์ด๊ณ , @Qualifier ๋ ๋งค์ฐ ์์ธํ๊ฒ ๋์ํ๋ค.
์ด๋ฐ ๊ฒฝ์ฐ ์ด๋ค ๊ฒ์ด ์ฐ์ ๊ถ์ ๊ฐ์ ธ๊ฐ๊น?
์คํ๋ง์ ์๋๋ณด๋ค๋ ์๋์ด, ๋์ ๋ฒ์์ ์ ํ๊ถ ๋ณด๋ค๋ ์ข์ ๋ฒ์์ ์ ํ๊ถ์ด ์ฐ์ ์์๊ฐ ๋๋ค.
๋ฐ๋ผ์ ์ฌ๊ธฐ์๋ @Qualifier ๊ฐ ์ฐ์ ๊ถ์ด ๋๋ค.
์ ๋ ธํ ์ด์ ์ง์ ๋ง๋ค๊ธฐ
@Qualifier("mainDiscountPolicy") ์ด๋ ๊ฒ ๋ฌธ์๋ฅผ ์ ์ผ๋ฉด ์ปดํ์ผ์ ํ์ ์ฒดํฌ๊ฐ ์๋๋ค.
import org.springframework.beans.factory.annotation.Qualifier;
import java.lang.annotation.*;
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER,
ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Qualifier(value = "mainDiscountPolicy")
public @interface MainDiscountPolicy {
}
๋ค์๊ณผ ๊ฐ์ ์ ๋ ธํ ์ด์ ์ ๋ง๋ค์ด์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
@Component
@MainDiscountPolicy
public class RateDiscountPolicy implements DiscountPolicy {
๋น ๋ฑ๋ก์ ์ ๋ ธํ ์ด์ ์ ๋ถ์ฌ ์ค๋ค.
@Autowired
public OrderServiceImpl(MemberRepository memberRepository, @MainDiscountPolicy DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
์ฃผ์ ์์ ๋ฑ๋กํ ์ ๋ ธํ ์ด์ ์ ์ ์ด์ค๋ค.