์คํ๋ง ํต์ฌ ์๋ฆฌ์ ๊ฐ์ ๋ด์ฉ์ ์ ๋ฆฌํ ํฌ์คํ ์ ๋๋ค.
์กฐํ ๋น์ด 2๊ฐ ์ด์์ผ ๋
๋ฌธ์ ์
@Autowired๋ ํ์ ์ผ๋ก ๋น์ ์กฐํํ๊ธฐ ๋๋ฌธ์, ์ค์ ๋ก๋ ๋ ๋ง์ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง๋ง
ac.getBean(DiscountPolicy.class)
์ ์ ์ฌํ๊ฒ ๋์ํ๋ค.
์ด๋ DiscountPolicy์ ํ์ ํ์
์ด ๋ ๊ฐ ์ด์ ์กด์ฌํ ๊ฒฝ์ฐ @Autowired๋ ํ ๊ฐ๊ฐ ์๋ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋ก๋ ํ์ ํ์
ํด๋์ค์ ๊ฐ์๋งํผ ์ค๋ณต๋ ๋น์ ์ฐพ๊ฒ ๋๊ณ , NoUniqueBeanDefinitionException
์ด ๋ฐ์ํ๊ฒ ๋๋ค.
๊ทธ๋ ๋ค๊ณ ํด์ ํ์ ํ์ ์ผ๋ก ๋น์ ์กฐํํ๋ ๊ฒ์ ์๋์ ๊ฐ์ด ๋ ๊ฐ์ง ๋ฌธ์ ์ ์ด ์กด์ฌํ๋ค.
1. DIP๋ฅผ ์๋ฐฐํจ๊ณผ ๋๋ถ์ด ์ฝ๋์ ์ ์ฐ์ฑ์ด ๋จ์ด์ง๋ค.
2. ๋น ์ด๋ฆ์ ๋ค๋ฅด์ง๋ง ํ์ ์ด ๋์ผํ ๊ฒฝ์ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
ํด๊ฒฐ์ฑ
ํฌ๊ฒ ์ธ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค.
1. @Autowired ํ๋ ๋ช ๋งค์นญ
@Autowired๋ ์ฐ์ ์ ์ผ๋ก ํ์ ๋งค์นญ์ ์๋ํ๋๋ฐ, ์ด ๋ ์กฐํ๋ ๋น์ด ์ฌ๋ฌ ๊ฐ์ผ ๊ฒฝ์ฐ ํ๋/ํ๋ผ๋ฏธํฐ ์ด๋ฆ์ผ๋ก ๋น ์ด๋ฆ์ ๋งค์นญ ์๋ํ๋ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์๋ค.
@Autowired
private DiscountPolicy discountPolicy
@Autowired
private DiscountPolicy rateDiscountPolicy
๊ธฐ์กด ์ฝ๋์ ํ๋ ๋ช ์ discountPolicy์ด๋ฏ๋ก ํ๋ ์ด๋ฆ์ ๊ฐ์ง๊ณ ๋งค์นญ์ ์๋ํด๋ ์ค๋ณต์ด ๋ฐ์ํ์ง๋ง, ํ๋ ๋ช ์ ๊ตฌ์ฒด(๊ตฌํ) ํด๋์ค์ ์ด๋ฆ์ธ rateDiscountPolicy๋ก ์์ ํ๊ฒ ๋๋ฉด ์์กด ๊ด๊ณ๊ฐ ์ ์์ ์ผ๋ก ์ฃผ์ ๋๋ค.
2. @Qualifier
@Qualifier๋ ์ถ๊ฐ ๊ตฌ๋ถ์๋ฅผ ๋ถ์ฌ์ฃผ๋ ๋ฐฉ๋ฒ์ผ๋ก, ๋น ์ด๋ฆ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ ์๋๋ค.
์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋น ๋ฑ๋ก ์ @Qualifier๋ฅผ ์ํ๋ ์ด๋ฆ๊ณผ ํจ๊ป ์ถ๊ฐํ๊ณ , ์์กด ๊ด๊ณ ์ฃผ์ ์ @Qualifier์ ํจ๊ป ๋ฑ๋กํ๋ ์ด๋ฆ์ ์ ์ด์ฃผ๋ฉด ๋๋ค.
@Component
@Qualifier("mainDiscountPolicy")
public class RateDiscountPolicy implements DiscountPolicy {}
@Autowired
public OrderServiceImpl(MemberRepository memberRepository,
@Qualifier("mainDiscountPolicy") DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
๋ง์ฝ @Qualifier๋ก ์์กด ๊ด๊ณ๋ฅผ ์ฃผ์
ํ ๋ @Qualifier("mainDiscountPolicy")
๋ฅผ ๋ชป์ฐพ์ผ๋ฉด mainDiscountPolicy๋ผ๋ ์ด๋ฆ์ ์คํ๋ง ๋น์ ์ถ๊ฐ๋ก ์ฐพ๋ ์์
์ ์ํํ๋ค.
(์ด ์์
์์๋ ๋งค์นญ๋๋ ๋น์ด ์๋ค๋ฉด NoSuchBeanDefinitionException
์ด ๋ฐ์๋๋ค.)
ํ์ง๋ง @Qualifier๋ @Qualifier๋ฅผ ์ฐพ๋ ์ฉ๋๋ก๋ง ์ฌ์ฉํ๋ ๊ฒ์ด ํ์ ์ด๋ ์ ์ง๋ณด์์ ๊ด์ ์์ ๋ช ํํ๊ณ ์ข๋ค. ๋ํ ์๋์ผ๋ก ๋น์ ๋ฑ๋กํ ๋๋ @Qualifier๋ฅผ ๋์ผํ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
3. @Primary
ํด๋น ๋ฐฉ๋ฒ์ ์ฐ์ ์์๋ฅผ ์ ํ๋ ๊ฒ์ผ๋ก, @Autowired ์ ์ฌ๋ฌ ๋น์ด ๋งค์นญ๋๋ ์ํฉ์์ @Primary๊ฐ ๋ถ์ ๋น์๊ฒ ์ฐ์ ๊ถ์ด ๊ฐ๋๋ก ํ๋ ๊ฒ์ด๋ค.
๋ค์๊ณผ ๊ฐ์ด ์์ฑํจ์ผ๋ก์จ rateDiscountPolicy๊ฐ ์ฐ์ ๊ถ์ ๊ฐ์ง๋๋ก ํ ์ ์๋ค.
@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;
}
4. @Qualifier vs @Primary
@Qualifier | @Primary | |
์ฅ์ | @Primary์ ๋นํด ๋ช ์์ ์ด๋ค. | ๋ณ๋์ ๊ตฌ๋ถ์ ์์ด ํด๋น ์ ๋ ธํ ์ด์ ์ ๋ถ์ด๋ ๊ฒ๋ง์ผ๋ก ์์กด ๊ด๊ณ๋ฅผ ์ฃผ์ ๋ฐ์ ์ ์๋ค. |
๋จ์ | ์์กด ๊ด๊ณ๋ฅผ ์ฃผ์
๋ฐ์ ๋ ๋ชจ๋ ์ฝ๋์ ํด๋น ์ ๋
ธํ
์ด์
์ ๋ถ์ฌ์ฃผ์ด์ผ ํ๋ค. ์ถ๊ฐ ๊ตฌ๋ถ์๋ฅผ ๋ถ์ฌ์ค๋ค๊ณ ํด๋ ์ปดํ์ผ ์์ ์์ ํ์ ์ฒดํฌ๋ฅผ ํ ์ ์๋ค. |
- |
์ฐ์ ์์ | @Qualifier๋ ์๋์ผ๋ก ๊ด๋ฆฌํ๋๋งํผ @Primary์ ๋นํด ๊ตฌ์ฒด์ ์ด๊ณ ์ข์ ๋ฒ์๋ฅผ ๊ฐ์ง๋ค. ๋ฐ๋ผ์ ๋ ์ ๋ ธํ ์ด์ ์ค์๋ @Qualifier๊ฐ ๋ ๋์ ์ฐ์ ์์๋ฅผ ๊ฐ์ง๋ค. |
|
ํ์ฉ ์์ | ์ฝ๋์์ ๋น๊ต์ ์ฌ์ฉ ๋น๋๊ฐ ๋จ์ด์ง๋ ์คํ๋ง ๋น → ๋ช ์์ ์ผ๋ก ๋๋ฌ๋์ผ๋ก์จ ์ฝ๋๋ฅผ ๊น๋ํ๊ฒ ์ ์งํ ์ ์์ (e.g., ์๋ธ DB ์ปค๋ฅ์ ) |
์ฝ๋์์ ์์ฃผ ์ฌ์ฉํ๋ ์คํ๋ง ๋น → ํธ๋ฆฌํ๊ฒ ์กฐํ ๊ฐ๋ฅ (e.g., ๋ฉ์ธ DB ์ปค๋ฅ์ ) |
์ ๋ ธํ ์ด์ ์ง์ ๋ง๋ค๊ธฐ
์์ @Qualifier์ ๋จ์ ์ผ๋ก ์ธ๊ธํ๋ฏ์ด @Qualifier("mainDiscountPolicy")์ "mainDiscountPolicy"์ ๋ฌธ์์ด๊ธฐ ๋๋ฌธ์ ์ปดํ์ผ ์์ ์์ ํ์ ์ฒดํฌ๋ฅผ ํ ์ ์๋ค.
๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ด ์ ๋ ธํ ์ด์ ์ ์ง์ ๋ง๋ค์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER,
ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Qualifier("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;
} //@MainDiscountPolicy ๋ด๋ถ์ @Qualifier๋ฅผ ์ธ์ํ์ฌ ์์กด ๊ด๊ณ๋ฅผ ์ฃผ์
ํ๋ ๋ฐฉ์
์ฐธ๊ณ
์ ๋ ธํ ์ด์ ์๋ ์์์ด๋ผ๋ ๊ฐ๋ ์ด ์๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ ์ ๋ ธํ ์ด์ ์ ๋ชจ์์ ์ฌ์ฉํ๋ ๊ธฐ๋ฅ์ ์คํ๋ง์ด ์ง์ํด์ฃผ๋ ๊ธฐ๋ฅ์ด๋ค. @Qualifier ๋ฟ๋ง ์๋๋ผ ๋ค๋ฅธ ์ ๋ ธํ ์ด์ ๋ค๋ ํจ๊ป ์กฐํฉํด์ ์ฌ์ฉํ ์ ์๋ค.
@Autowired ๋ํ ์ฌ์ฉ์๊ฐ ์ฌ์ ์ ํ ์ ์๋๋ฐ, ๊ทธ๋ ๋ค๊ณ ํ์ฌ ์คํ๋ง์ด ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ๋๋ ทํ ๋ชฉ์ ์์ด ๋ฌด๋ถ๋ณํ๊ฒ ์ฌ์ ์ ํ๋ ๊ฒ์ ์ ์ง๋ณด์์ ํผ๋์ ์ค ์ ์์ผ๋ฏ๋ก ๊ฐ๊ธ์ ํ์ํ ์ํฉ์์๋ง ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
์กฐํํ ๋น์ด ๋ชจ๋ ํ์ํ ๋; List, Map
ํด๋ผ์ด์ธํธ๊ฐ ํ ์ธ ์ข ๋ฅ(fix, rate)๋ฅผ ์ ํํ๋ ๊ฒฝ์ฐ์ ๊ฐ์ด ํด๋น ํ์ ์ ์คํ๋ง ๋น์ด ๋ชจ๋ ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋ค.
์ด๋๋ ApplicationContext์ getBean์ ์ด์ฉํด ์คํ๋ง ๋น์ List ๋๋ Map์ ๋ฐ์ ์ด์ฉํ ์ ์๋ค.
์๋, ์๋์ ์ฌ๋ฐ๋ฅธ ์ค๋ฌด ์ด์ ๊ธฐ์ค
๋น ๋ฑ๋ก๊ณผ ์์กด ๊ด๊ณ ์ฃผ์ ์ ์์ด ์๋๊ณผ ์๋ ๋ฐฉ๋ฒ์ ๊ฐ๊ฐ ์ด๋ ์ํฉ์์ ์ด์ฉํ๋ ๊ฒ์ด ์ข์๊น?
์ฐ์ ์ผ๋ฐ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ๋ก์ง์ ์๋์ผ๋ก ์ค์บํ ์ ์๋๋ก ์ง์ํจ๊ณผ ๋๋ถ์ด ์ต๊ทผ์ ์คํ๋ง ๋ถํธ๋ ์ปดํฌ๋ํธ ์ค์บ์ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉํ๊ณ , ์คํ๋ง ๋ถํธ์ ์ฌ๋ฌ ์คํ๋ง ๋น๋ค๋ ์กฐ๊ฑด์ด ๋ง์ผ๋ฉด ์๋์ผ๋ก ๋ฑ๋กํ๋๋ก ์ค๊ณํ๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ณธ์ ์ผ๋ก๋ ์๋ ๋น ๋ฑ๋ก์ ์ด์ฉํ๋ ๊ฒ์ด ๊ถ์ฅ๋๋ค.
์๋ ๋น ๋ฑ๋ก์ ์ด์ฉํด๋ OCP, DIP๋ฅผ ์งํฌ ์ ์๊ณ , ์คํ๋ง ๋น์ ๋ฑ๋กํ ๋ @Component๋ง ๋ฃ์ผ๋ฉด ๋๋๋ ์์ ์ ์๋ ๋น ๋ฑ๋ก์ ์ด์ฉํ ๊ฒฝ์ฐ @Configuration ์ค์ ํด๋์ค์ @Bean์ ์ถ๊ฐํ๊ณ , ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ์ฃผ์ ํ ๋์์ ์ผ์ผ์ด ์ ์ด์ฃผ์ด์ผ ํ๋ฏ๋ก ๊ทธ ๊ณผ์ ์ด ๋ฒ๊ฑฐ๋กญ๊ณ ๊ท๋ชจ๊ฐ ์ปค์ง๋ฉด ์ค์ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ๊ธฐ๊ฐ ํ๋ค์ด์ง๋ค.
์ ๋ฌด ๋ก์ง ๋น(์ปจํธ๋กค๋ฌ, ์๋น์ค, ๋ฆฌํฌ์งํ ๋ฆฌ ๋ฑ ๋น์ฆ๋์ค ์๊ตฌ์ฌํญ์ ์ํฅ์ ๋ฐ๋ ๋ก์ง)์ ๊ฒฝ์ฐ ์ด๋ ์ ๋์ ์ ์ฌํ ํจํด์ด ์๊ธฐ ๋๋ฌธ์ ์๋ ๋น ๋ฑ๋ก์ ์ด์ฉํด๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ง์ ์ ๋ช ํํ๊ฒ ํ์ ํ๊ธฐ๊ฐ ์ฝ๋ค. ๋ํ ๋น์ ์ซ์๊ฐ ๋ง๊ธฐ ๋๋ฌธ์ ์๋์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ด ์ ํฉํ๋ค.
๊ธฐ์ ๋ก์ง ๋น(DB ์ฐ๊ฒฐ์ด๋ ๊ณตํต ๋ก๊ทธ ์ฒ๋ฆฌ์ ๊ฐ์ด ๊ธฐ์ ์ ์ธ ๋ฌธ์ ๋ฑ์ ์ฒ๋ฆฌํ๊ฑฐ๋ ๊ณตํต ๊ด์ฌ์ฌ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ก์ง)์ ์ ์ฉ์ด ์ ๋๋์ง ์ฌ๋ถ์กฐ์ฐจ๋ ํ์ธํ๋ ๊ฒ์ด ์ด๋ ค์ด ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. ๋ํ ์ ๋ฌด ๋ก์ง ๋น๊ณผ ๋น๊ตํ์ ๋ ๊ทธ ์๊ฐ ์ ๊ณ ์ผ๋ฐ์ ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ ๊ฑธ์ณ ์ํฅ์ ๋ฏธ์น๊ธฐ ๋๋ฌธ์ ๊ฐ๊ธ์ ์๋ ๋น ๋ฑ๋ก์ ์ฌ์ฉํด์ ๋ช ํํ๊ฒ ๋๋ฌ๋ด๋ ๊ฒ์ด ์ ํฉํ๋ค.
๋น์ฆ๋์ค ๋ก์ง ์ค ๋คํ์ฑ์ ์ ๊ทน ํ์ฉํ๋ ์ํฉ์์๋ ์๋ ๋น ๋ฑ๋ก์ ๊ณ ๋ฏผํด ๋ณผ ์ ์๋ค.
DiscountService๋ผ๋ ๋น์ด ์์กด ๊ด๊ณ ์๋ ์ฃผ์ ์ผ๋ก Map<String, DiscountPolicy>์ ์ฃผ์ ๋ฐ๋๋ค๊ณ ๊ฐ์ ํ์ ๋ ํด๋น ๋งต์ ์ด๋ค ๋น๋ค์ด ์ฃผ์ ๋ ์ง, ๊ฐ ๋น๋ค์ ์ด๋ฆ์ ๋ฌด์์ผ์ง ์ฝ๋๋ง ๋ณด๊ณ ํ ๋ฒ์ ํ์ ํ๊ธฐ๋ ์ด๋ ต๋ค.
์๋ ๋ฑ๋ก์ ์ฌ์ฉํ๊ณ ์๊ธฐ ๋๋ฌธ์ ํ์ ์ ์ํด์ ์ฌ๋ฌ ์ฝ๋๋ฅผ ์ฐพ์๋ด์ผ ํ๋๋ฐ, ์ด๋ฌํ ๊ฒฝ์ฐ ์๋ ๋น์ผ๋ก ๋ฑ๋กํ๋ ๋ฐฉ๋ฒ์ ์ด์ฉํ๊ฑฐ๋ ์๋ ๋น์ ๋ฑ๋กํ ๊ฒฝ์ฐ ํน์ ํจํค์ง์ ๊ฐ์ด ๋ฌถ์ด ๋จ๋ฒ์ ํ์ ํ๊ธฐ ์ฝ๋๋ก ์ค๊ณํ๋ ๊ฒ์ด ์ข๋ค.
'Language & Framework > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์คํ๋ง ํต์ฌ ์๋ฆฌ] ๋น ์ค์ฝํ (0) | 2023.01.12 |
---|---|
[์คํ๋ง ํต์ฌ ์๋ฆฌ] ๋น ์๋ช ์ฃผ๊ธฐ ์ฝ๋ฐฑ (0) | 2023.01.10 |
[์คํ๋ง ํต์ฌ ์๋ฆฌ] ์์กด๊ด๊ณ ์๋ ์ฃผ์ (1) (0) | 2022.12.21 |
[์คํ๋ง ํต์ฌ ์๋ฆฌ] ์ฑ๊ธํค ์ปจํ ์ด๋ (0) | 2022.12.20 |
[์คํ๋ง ํต์ฌ ์๋ฆฌ] ์คํ๋ง ์ปจํ ์ด๋์ ์คํ๋ง ๋น (0) | 2022.11.14 |