# Spring / @Qualifier, @Primary
Study Repository

Spring / @Qualifier, @Primary

by rlaehddnd0422

๋“ฑ๋ก๋œ ๋นˆ์ด 2๊ฐœ ์ด์ƒ์ผ ๋•Œ 

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

 

์œ„์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์กฐํšŒ ๋นˆ์ด 2๊ฐœ ์ด์ƒ ๋“ฑ๋ก๋œ ๊ฒฝ์šฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

@Autowired๋Š” ํƒ€์ž…์œผ๋กœ ์กฐํšŒ๋ฅผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— 

ac.getBean(DiscountPolicy.class)์™€ ๊ฐ™์ด ๋™์ž‘ํ•œ๋‹ค. 

 

๋นˆ ์กฐํšŒ์—์„œ ๋ฐฐ์› ๋“ฏ์ด ํƒ€์ž…์œผ๋กœ ์กฐํšŒํ•˜๋ฉด ์„ ํƒ๋œ ๋นˆ์ด 2๊ฐœ ์ด์ƒ์ผ ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

DiscountPolicy์˜ ๊ตฌํ˜„์ฒด์ธ FixDp,RateDp ๋‘˜๋‹ค ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•˜๊ณ  @Autowired๋กœ ์ž๋™์ฃผ์ž…์„ ํ•˜๋ฉด

NoUniqueBeanDefinitionException

 ํ•˜๋‚˜์˜ ๋นˆ์„ ๊ธฐ๋Œ€ํ–ˆ๋Š”๋ฐ ๋‘๊ฐœ์˜ ๋นˆ์ด ๋ฐœ๊ฒฌ๋˜์—ˆ๋‹ค๊ณ  ์•Œ๋ ค์ค€๋‹ค.

 

์ด ๋•Œ ์Šคํ”„๋ง ๋นˆ์„ ์ˆ˜๋™์œผ๋กœ ๋“ฑ๋กํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด๋„ ๋˜์ง€๋งŒ, ์กฐํšŒ ๋นˆ์ด 2๊ฐœ ์ด์ƒ์ผ๋•Œ ์˜์กด๊ด€๊ณ„ ์ž๋™์ฃผ์ž…์œผ๋กœ ํ•ด๊ฒฐํ•˜๋Š” ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

 

1. @Autowired ํ•„๋“œ๋ช… ๋งค์นญ

๊ธฐ๋ณธ์ ์œผ๋กœ @Autowired๋Š”

ํƒ€์ž…๋งค์นญ ์‹œ๋„ -> ๋งŒ์•ฝ ์—ฌ๋Ÿฌ ๋นˆ์ด ์žˆ๋‹ค? -> ํ•„๋“œ๋ช…์œผ๋กœ ๋งค์นญ 

์ ˆ์ฐจ๋กœ ์‹คํ–‰๋œ๋‹ค.

 

๊ธฐ์กด์ฝ”๋“œ

 

@Autowired

private DiscountPolicy discountpolicy; ์—์„œ

 

@Autowired

private DiscountPolicy rateDiscountPolicy; ๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด 

 

RateDiscountPolicy๋กœ ์˜์กด๊ด€๊ณ„๋ฅผ ์ฃผ์ž…ํ•œ๋‹ค.

 

โ—๏ธ ํ•„๋“œ ๋ช… ๋งค์นญ์€ ๋จผ์ € ํƒ€์ž… ๋งค์นญ์„ ์‹œ๋„ ํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ์— ์—ฌ๋Ÿฌ ๋นˆ์ด ์žˆ์„ ๋•Œ ์ถ”๊ฐ€๋กœ ๋™์ž‘ํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

 

 

 

2. @Qualifier 

 

@Qualifier๋Š” ์ถ”๊ฐ€ ๊ตฌ๋ถ„์ž๋ฅผ ๋„ฃ์–ด์ฃผ๋Š” ๋ฐฉ๋ฒ•. ์ฃผ์ž…์‹œ ์ถ”๊ฐ€ ์ด๋ฆ„์„ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•์ด์ง€ ๋นˆ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฑด ์•„๋‹ˆ๋‹ค..!!

@Component
@Qualifier("mainDp")
public class FixDiscountPolicy implements DiscountPolicy{
@Component
@Qualifier("secondDp")
public class RateDiscountPolicy implements DiscountPolicy{

์œ„์™€๊ฐ™์ด ๊ตฌ๋ถ„์ž๋ฅผ ์ถ”๊ฐ€๋กœ ์„ค์ •ํ•˜๊ณ  ์ƒ์„ฑ์ž์—์„œ ์•„๋ž˜์™€ ๊ฐ™์ด @Qualifier๋กœ ๊ตฌ๋ถ„์ž๋ฅผ ์ด์šฉํ•˜์—ฌ ์˜์กด๊ด€๊ณ„๋ฅผ ์ฃผ์ž…ํ•œ๋‹ค.

@Component
public class OrderServiceImp implements OrderService {
    private final MemberRepository memberRepository;
    private final DiscountPolicy discountPolicy;

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

 

โ—๏ธ๋งŒ์•ฝ ์ƒ์„ฑ์ž์—์„œ ํ•ด๋‹น ๊ตฌ๋ถ„์ž๋ฅผ ์ฐพ์ง€ ๋ชปํ•˜๋ฉด???

ํ•ด๋‹น ์ด๋ฆ„์˜ ์Šคํ”„๋ง ๋นˆ์„ ์ถ”๊ฐ€๋กœ ์ฐพ๋Š”๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋Ÿฐ๊ฒฝ์šฐ ์ž์ฒด๋ฅผ ์•ˆ ๋งŒ๋“œ๋Š”๊ฒŒ ์ข‹๋‹ค.. ๋ช…ํ™•์„ฑ์ด ๋–จ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ.

 

์ˆ˜๋™ ๋นˆ ๋“ฑ๋ก์‹œ์—๋Š” 


@Bean
@Qualifier("mainDp")
public DiscountPolicy discountPolicy() {
    return new RateDiscountPolicy();
}

์ด๋ ‡๊ฒŒ ์จ์„œ @Qualifier๋ฅผ ๋™์ผํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

@Qualifier ๋งค์นญ์ˆœ์„œ

@Qualifier ๋ผ๋ฆฌ ๋งค์นญ -> ๋งŒ์•ฝ ์—†๋‹ค ? -> ๋นˆ์ด๋ฆ„ ๋งค์นญ -> ๋“ฑ๋ก๋œ ๋นˆ์—๋„ ์—†๋‹ค? -> NoSuchBeanDefinitionException ์˜ˆ์™ธ ๋ฐœ์ƒ

 

 

3. @Primary 

 

@Primary๋Š” ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ง€์ •ํ•ด์ฃผ๋Š” ์ง€์ •์ž๋กœ ์šฐ์„  ์˜์กด๊ถŒ์„ ๊ฐ–๋Š” ๋นˆ์—๊ฒŒ @Primary๋ฅผ ๋ถ™ํ˜€์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.

 

@Primary, @Qualifier ํ™œ์šฉ
์ฝ”๋“œ์—์„œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ปค๋„ฅ์…˜์„ ํš๋“ํ•˜๋Š” ์Šคํ”„๋ง ๋นˆ์ด ์žˆ๊ณ ,

์ฝ”๋“œ์—์„œ ํŠน๋ณ„ํ•œ ๊ธฐ๋Šฅ์œผ๋กœ ๊ฐ€๋” ์‚ฌ์šฉํ•˜๋Š” ์„œ๋ธŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ปค๋„ฅ์…˜์„ ํš๋“ํ•˜๋Š” ์Šคํ”„๋ง ๋นˆ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž.

๋ฉ”์ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ปค๋„ฅ์…˜์„ ํš๋“ํ•˜๋Š” ์Šคํ”„๋ง ๋นˆ์€ @Primary ๋ฅผ ์ ์šฉํ•ด์„œ ์กฐํšŒํ•˜๋Š” ๊ณณ์—์„œ @Qualifier ์ง€์ • ์—†์ด ํŽธ๋ฆฌํ•˜๊ฒŒ ์กฐํšŒํ•˜๊ณ ,

์„œ๋ธŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ปค๋„ฅ์…˜ ๋นˆ์„ ํš๋“ํ•  ๋•Œ๋Š” @Qualifier ๋ฅผ ์ง€์ •ํ•ด์„œ ๋ช…์‹œ์ ์œผ๋กœ ํš๋“ ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋ฌผ๋ก  ์ด๋•Œ ๋ฉ”์ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์Šคํ”„๋ง ๋นˆ์„ ๋“ฑ๋กํ•  ๋•Œ @Qualifier ๋ฅผ ์ง€์ •ํ•ด์ฃผ๋Š” ๊ฒƒ์€ ํ•ด๋„ ์•ˆํ•ด๋„ ์ƒ๊ด€์—†๋‹ค.

 

@Primary์™€ @Qualifier์ค‘์—์„œ๋Š” @Qualifier๊ฐ€ ์šฐ์„ ๊ถŒ์ด ๋†’๋‹ค. 

@Component
@Primary
@Qualifier("mainDp")
public class FixDiscountPolicy implements DiscountPolicy{
@Component
@Qualifier("secondDp")
public class RateDiscountPolicy implements DiscountPolicy{

์œ„์ฒ˜๋Ÿผ ์ง€์ •๋˜์–ด ์žˆ์„ ๋•Œ, 

@Component
public class OrderServiceImp implements OrderService {
    private final MemberRepository memberRepository;
    private final DiscountPolicy discountPolicy;

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

์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•˜๋ฉด RateDp๋กœ ์˜์กด๊ด€๊ณ„๊ฐ€ ์ฃผ์ž…๋œ๋‹ค๋Š” ์˜๋ฏธ.

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

Study Repository

rlaehddnd0422

ํ™œ๋™ํ•˜๊ธฐ