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๋ก ์๋์ฃผ์ ์ ํ๋ฉด
ํ๋์ ๋น์ ๊ธฐ๋ํ๋๋ฐ ๋๊ฐ์ ๋น์ด ๋ฐ๊ฒฌ๋์๋ค๊ณ ์๋ ค์ค๋ค.
์ด ๋ ์คํ๋ง ๋น์ ์๋์ผ๋ก ๋ฑ๋กํด์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด๋ ๋์ง๋ง, ์กฐํ ๋น์ด 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๋ก ์์กด๊ด๊ณ๊ฐ ์ฃผ์ ๋๋ค๋ ์๋ฏธ.
'๐ Backend' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ธ๋ก๊ทธ์ ์ ๋ณด
Study Repository
rlaehddnd0422