Spring/Spring ๊ธฐ๋ณธ

[์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ] - 21. @Autowired ํ•„๋“œ ๋ช… / @Qualifier, @Primary

hello_u 2023. 2. 7. 16:50

 

 

์กฐํšŒ ๋นˆ์ด 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;
}

 

์ฃผ์ž…์‹œ์— ๋“ฑ๋กํ•œ ์• ๋…ธํ…Œ์ด์…˜์„ ์ ์–ด์ค€๋‹ค.

 

 

 

 

 

 

 

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard

 

์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ - ์ธํ”„๋Ÿฐ | ๊ฐ•์˜

์Šคํ”„๋ง ์ž…๋ฌธ์ž๊ฐ€ ์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค์–ด๊ฐ€๋ฉด์„œ ์Šคํ”„๋ง์˜ ํ•ต์‹ฌ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๊ณ , ์Šคํ”„๋ง ๊ธฐ๋ณธ๊ธฐ๋ฅผ ํ™•์‹คํžˆ ๋‹ค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค., - ๊ฐ•์˜ ์†Œ๊ฐœ | ์ธํ”„๋Ÿฐ...

www.inflearn.com