[Spring] @Autowired ๋นˆ ํƒ์ƒ‰ ์ „๋žต, @Qualifier, @Primary

๐Ÿ”น Bean ๋“ฑ๋ก๊ณผ ์กฐํšŒ ๊ทœ์น™

[ Bean ๋“ฑ๋ก ]

Spring์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฉ”์„œ๋“œ/ํด๋ž˜์Šค์˜ ์ด๋ฆ„์„ Bean์˜ ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

@Bean
public DiscountPolicy fixDiscountPolicy() {
    return new FixDiscountPolicy();
}

@Bean
public DiscountPolicy rateDiscountPolicy() {
    return new RateDiscountPolicy();
}

 

๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๋นˆ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

@Bean("fixDiscountPolicy")
public DiscountPolicy fixDiscountPolicy() {
    return new FixDiscountPolicy();
}

@Bean("rateDiscountPolicy")
public DiscountPolicy rateDiscountPolicy() {
    return new RateDiscountPolicy();
}

 

[ Bean ์กฐํšŒ ๊ทœ์น™ ์ „๋žต ]

@Autowired๊ฐ€ ๋“ฑ๋ก๋œ ๋นˆ์„ ์ฐพ์„ ๋•Œ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋งค์นญ ๊ทœ์น™์œผ๋กœ ๋นˆ์„ ์กฐํšŒํ•œ๋‹ค.

1. ์ฃผ์ž…๋ฐ›๊ณ ์ž ํ•˜๋Š” ํƒ€์ž…์œผ๋กœ ๋งค์นญ์„ ์‹œ๋„ํ•œ๋‹ค.

2. ํƒ€์ž…์ด ์—ฌ๋Ÿฌ ๊ฐœ๋ฉด ํ•„๋“œ ๋˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„์œผ๋กœ ๋งค์นญ์„ ์‹œ๋„ํ•œ๋‹ค.

 

ํ•˜์ง€๋งŒ ๋นˆ์˜ ์ด๋ฆ„์ด ์ถฉ๋Œ๋˜์–ด ๋นˆ ์ด๋ฆ„๋งŒ์œผ๋กœ ํ•ด๊ฒฐ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ๋˜๋Š” ๋นˆ์— ์ถ”๊ฐ€ ๊ตฌ๋ถ„์ž๋‚˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋ถ€์—ฌํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ์—

@Qualifier๋‚˜ @Primary ์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•˜์—ฌ ํŽธ๋ฆฌํ•˜๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ถ”๊ฐ€๋กœ Spring์€ ์ž๋ฐ” ํ‘œ์ค€ ์–ด๋…ธํ…Œ์ด์…˜์ธ @Resource๋ผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๊ณ  ์žˆ๋‹ค.

@Resource๋Š” @Autowired์™€ ๋‹ฌ๋ฆฌ ํ•„๋“œ ์ด๋ฆ„์œผ๋กœ ๋นˆ์„ ์ฐพ๋Š”๋‹ค.

 

์ •๋ฆฌํ•˜์ž๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

1. @Autowired : ํ•„๋“œ ํƒ€์ž…์„ ๊ธฐ์ค€์œผ๋กœ ๋นˆ์„ ์ฐพ๋Š”๋‹ค.

2. @Resource : ํ•„๋“œ ์ด๋ฆ„์„ ๊ธฐ์ค€์œผ๋กœ ๋นˆ์„ ์ฐพ๋Š”๋‹ค.

 

๐Ÿ”น @Qualifier์™€ @Primary

[ @Qualifier - ๋นˆ์˜ Alias(๊ตฌ๋ถ„์ž) ]

๋นˆ์˜ ์ด๋ฆ„๋งŒ์œผ๋กœ ๋ถ€์กฑํ•˜๊ณ , ์ถ”๊ฐ€์ ์ธ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋Ÿฐ ์ƒํ™ฉ์—์„œ @Qualifier ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ๋นˆ์— ์ถ”๊ฐ€ ๊ตฌ๋ถ„์ž๋ฅผ ๋ถ™์—ฌ์ค„ ์ˆ˜ ์žˆ๋‹ค. ๋นˆ์˜ ์ด๋ฆ„์„ ๋ฐ”๊พธ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.

 

๋งŒ์•ฝ ์œ„์˜ ๋‘ ๊ฐ€์ง€ DiscountPolicy ์ค‘์—์„œ FixDiscountPolicy๋ฅผ ์ค‘์ ์ ์œผ๋กœ ํ™œ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ํ•ด๋‹น ๋นˆ์— mainDiscountPolicy๋ผ๋Š” ๋ณ„์นญ ๋˜๋Š” ๊ตฌ๋ถ„์ž๋ฅผ ๋ถ€์—ฌํ•ด ์ค„ ์ˆ˜ ์žˆ๋‹ค.

@Qualifier("mainDiscountPolicy")
@Bean
public DiscountPolicy fixDiscountPolicy() {
    return new FixDiscountPolicy();
}

 

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋นˆ์„ ์ฐพ๊ณ ์ž ํ•˜๋Š” ๊ฒฝ์šฐ์— @Qualifier ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ€์—ฌํ•˜์—ฌ ๋นˆ์„ ์ฐพ๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.

public DiscountService(@Qualifier("mainDiscountPolicy") fixDiscountPolicy) {
    this.discountPolicy = fixDiscountPolicy;
}

1. ํ•ด๋‹น @Qualifier๊ฐ€ ๋ถ™์€ ๋นˆ์„ ์กฐํšŒํ•œ๋‹ค.

2. @Qualifier๊ฐ€ ๋ถ™์€ ๋นˆ์„ ๋ชป ์ฐพ์œผ๋ฉด ํ•„๋“œ ๋˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„์œผ๋กœ ๋งค์นญ์„ ์‹œ๋„ํ•œ๋‹ค.

3. ๊ทธ๋ž˜๋„ ์ฐพ์ง€ ๋ชปํ•˜๋ฉด NoSuchBeanDefinitionException์ด ๋ฐœ์ƒํ•œ๋‹ค.

 

๋ฌผ๋ก , ๋นˆ์„ ์ฐพ๊ณ ์ž ํ•˜๋Š” ๊ฒฝ์šฐ์— @Qualifier๋ฅผ ๋ถ™์ด์ง€ ์•Š์•„๋„ ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์œ ์ง€ ๋ณด์ˆ˜ ์‹œ ํ—ท๊ฐˆ๋ฆด ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋นˆ์„ ์ƒ์„ฑํ•˜๋Š” ๊ณณ๊ณผ ์ฐพ๋Š” ๊ณณ ๋ชจ๋‘ @Qualifier๋ฅผ ๋ถ™์—ฌ์ฃผ๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค.

 

[ @Primary - ๋นˆ์˜ ์šฐ์„ ์ˆœ์œ„ ๋ถ€์—ฌ ]

์—ฌ๋Ÿฌ ํƒ€์ž…์˜ ๋นˆ์ด ์กด์žฌํ•  ๋•Œ, ํŠน์ • ๋นˆ์„ ์šฐ์„ ์ ์œผ๋กœ ์ฃผ์ž…ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด @Primary ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Spring์ด ํƒ€์ž…์„ ๋นˆ์„ ์ฐพ๋‹ค๊ฐ€ @Primary๊ฐ€ ๋ถ™์–ด์žˆ๋Š” ๋นˆ์„ ๋ฐœ๊ฒฌํ•˜๋ฉด, ๋ฐ”๋กœ ํ•ด๋‹น ๋นˆ์„ ์ฃผ์ž…์‹œํ‚จ๋‹ค.

์ฆ‰, @Primary๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋นˆ๋“ค ์ค‘์—์„œ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋ถ€์—ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

@Primary
@Bean
public DiscountPolicy fixDiscountPolicy() {
    return new FixDiscountPolicy();
}

 

๋งŒ์•ฝ @Qualifier์™€ @Primary ๋ชจ๋‘ ๋“ฑ๋ก๋˜์–ด ์žˆ๋‹ค๋ฉด, ์ด๋ฆ„์„ ์ง์ ‘ ์ง€์ •ํ•ด ์ฃผ๋Š” @Qualifier๊ฐ€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ–๋Š”๋‹ค.

 

[ ๋นˆ ๋“ฑ๋ก ์ถฉ๋Œ ๋ฐœ์ƒ ]

ํ•˜์ง€๋งŒ ์œ„์™€ ๊ฐ™์ด ์„ค์ •ํ•ด ์ฃผ์ง€ ์•Š์•„ ๋นˆ ๋“ฑ๋ก ์‹œ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•œ๋‹ค๋ฉด Spring์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฒ˜๋ฆฌ๋œ๋‹ค.

์ž๋™ ๋นˆ vs ์ž๋™ ๋นˆ : ๋นˆ ์ด๋ฆ„ ์ค‘๋ณต ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

์ˆ˜๋™ ๋นˆ vs ์ž๋™ ๋นˆ : ๊ณผ๊ฑฐ์—๋Š” ์ˆ˜๋™ ๋นˆ์ด ์ž๋™ ๋นˆ์„ ๋ฎ์–ด๋ฒ„๋ ธ์ง€๋งŒ, ์ตœ๊ทผ์—๋Š” BeanDefinitionOverrideException ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

 

 

 

 

๐Ÿ“ƒ reference