์ฝ๋ก๋์ ๊ฑธ๋ ค ์ผ์ฃผ์ผ์ ๋์์๋ค ์ด์๋ฌ๋ค. ๋จน๊ณ ์๊ณ ๋ง ๋ฐ๋ณตํ๋ ๋ํํจ์ ๋ํ์์ด ๋์ด๋ฒ๋ ธ๋๋ฐ... ์ด๋ ๊ฒ ๋ค์ ๊ณต๋ถ๋ฅผ ํ๋ ค๋ ๋ฐฐ๋ก ํ๋ ๊ฒ ๊ฐ๋ค. 8์์ ๊ผญ ๊ฐ์๋ฅผ ๋ค ๋ฃ๊ฒ ๋ค๊ณ ๋ค์งํ์๋๋ฐ,,, ์ผ๋ง ๋จ์ง ์์ ์๊ฐ ๋ค๋ฅธ ๊ณต๋ถ ์ ์ฒ๋๊ณ 8์ ์์ ๋๋ด๋ณผ๊น ํ๋ค. (๊ณผ์ฐ ํ ์ ์์ผ๋ ค๋?) ์๋ฌดํผ ๋ชจ๋๋ค ํ์ดํ
!!!!
๐งธ
๐งธ ๊ตฌ์กฐํ์ ๋ ์ธ ๊ผฌ์ฐ- ๐งธ
• order
ใด class : OrderServiceImpl
• annotation
ใด interface : MainDiscountPolicy
• HelloLombok
• AllBeanTest
ใด class : AllBeanTest
• AutoWiredTest
ใด class : AutoWiredTest
โ๏ธ OrderServiceImpl
โบ ์์ฑ์ ์ฃผ์
์ง๊ธ๊น์ง ์ฌ์ฉํ ๋ฐฉ๋ฒ์ด ๋๊ฒ ๋ค.
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
final
: ์ด๊ธฐํ๋๋ฉด ๋ณ๊ฒฝํ ์ ์๊ฒ ๋๋ค.
final์ ํตํด ์์ฑ์์ ๊ฐ์ด ์ ๋๋ก ์ค์ ๋์ง ์์ผ๋ฉด ์ปดํ์ผ ์ค๋ฅ๋ฅผ ๋ฐ์์ํฌ ์ ์๋ค. ์ปดํ์ผ ์ค๋ฅ๋ฅผ ํตํด ์์ฑ์์ ๊ฐ์ ๋นผ๋จน์ ๊ฑธ ๋น ๋ฅด๊ฒ ์์์ฐจ๋ฆด ์ ์๋ค. ๊ทธ๋ ๊ธฐ์ ์์ฑ์ ์ฃผ์ ๋ฐฉ๋ฒ์ ์ถ์ฒํ๋ค.
Q. final์ ์์ฐ๊ฒ ๋๋ค๋ฉด ์ด๋ป๊ฒ ๋๋?
A. ์ฝ๋ ๊ฐ๋ฐ์ด ํ์ฌ๋์ผ๋ก ์ด๋ค์ง๋๊ฒ ์๋๊ธฐ ๋๋ฌธ์, ๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ ์ฝ๋๋ฅผ ์์ ํ๊ฒ๋๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๋ค. ๊ฑฐ๊ธฐ๋ค ์์ฑ์๋ฅผ ๋ง๋ค์ง ์์ผ๋ฉด ํ ์คํธ๊ฐ ๋์๊ฐ์ง ์๊ธฐ ๋๋ฌธ์ ์ค๋ฅ ์์ ์ ์ฉ์ดํ๋ค. ์์ฑ์ ์ฃผ์ ์์ final์ ๋ถ์ฌ์ผ๋ง ์ฝ๋๊ฐ ๋์๊ฐ๋ ๊ฒ์ ์๋๋ค. (๊ทผ๋ฐ ๊ทธ๋ ๋ฐ๋๋ฉด ์์ฑ์ ์ฝ๋๋ผ๊ณ ๋ถ๋ฅด๊ธฐ ์ด๋ ต์ง ์์๊น..?)
••• ์ด์ด์ ๋ค๋ฅธ ์ฝ๋ ๋ถ๋ถ •••
@Autowired
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
@Autowired
: ์์กด๊ด๊ณ๋ฅผ ์ฃผ์ ํด์ฃผ๋๋ฐ, ์์ฑ์๊ฐ ํ๋์ธ ๊ฒฝ์ฐ๋ ์ฌ์ฉํ์ง ์์๋ ์๋์ ์ผ๋ก ์ฃผ์ ์ด ๋๋ค.
OrderServiceImpl์ ํด๋์ค MemberRepository์ DiscountPolicy์ ์๋ memberRepository์ discountPolicy๋ฅผ ํ์๋ก ํ๋ค. ๊ทธ๋ ๊ธฐ์ ์์ฑ์(๊ฐ์ฒด๋ฅผ ์ด๊ธฐํํ๋ ํน๋ณํ ๋ฉ์๋)๋ฅผ ๋ง๋ค์ด ๊ทธ ์์ฑ์๊ฐ ๋ค๋ฅธ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ํ ๋น๋ฐ์ ์ ์๋๋ก ์์กด๊ด๊ณ ์ฃผ์ ์ด ์ด๋ค์ง๊ฒ ๋๋ค.
์๋ฅผ ๋ค์ด๋ณด๋ฉด, ๊ณ์ฐ์ ํด์ผํ๋ ๋ฉ์๋๊ฐ ์๋ค๊ณ ๊ฐ์ ํด๋ณด์. ๊ณ์ฐ ๋ฉ์๋์๋ ํ์ ์ ๋ณด์ ํ์ฌ ํ ์ธ ์ ์ฑ ์ ๋ํ ์ ๋ณด๋ฅผ ํ์๋ก ํ๋ค. ๊ทธ ๋๊ฐ์ง์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด ํ์ ์ ๋ณด์ ํ ์ธ ์ ์ฑ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ ํด๋์ค๊ฐ ํ์ํ ๊ฒ์ด๋ค. ๊ทธ๋์ ์์กด๊ด๊ณ ์ฃผ์ ์ ํตํด ํ์ฌ ํด๋์ค์ ๋ค๋ฅธ ๋ ํด๋์ค์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋๋ก ํ๋ ๊ฒ์ด๋ค.
(์ด๋ ๊ฒ ์ดํดํ๊ธด ํ๋ค...)
โบ ์์ ์ ์ฃผ์
setter๋ก ํตํด ์์กด๊ด๊ณ ์ฃผ์ , ์์กด๊ด๊ณ๋ฅผ ๋๋ฝํด๋ ์คํ์ ๋๋ค.
private MemberRepository memberRepository;
private DiscountPolicy discountPolicy;
@Autowired
public void setMemberRepository(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
@Autowired
public void setDiscountPolicy(DiscountPolicy discountPolicy) {
this.discountPolicy = discountPolicy;
}
setter๋ @Autowired๋ฅผ ์ฌ์ฉํ์ฌ ์์กด๊ด๊ณ๋ฅผ ๋ฐ๊ฒ๋๋ค. ๊ทธ๋ฌ๋ฉด ๊ฐ ํด๋์ค์ธ MemberRepository์ DiscountPolicy์์ memberRepository์ discountPolicy์ ๋ํ ์์กด๊ด๊ณ๋ฅผ ๋ฐ๋ ๊ฒ์ด๋ค. ๊ทธ๋ ๊ฒ ๊ฐ์ฒด๋ฅผ final ์์ด ์ ์ธํ ๋ ๊ฐ์ฒด์ ์ํ ๋ณ๊ฒฝ์ ํ ์ ์๊ฒ ๋๋ค.
์์ฑ์ ์ฃผ์ ์์๋ final์ ํตํด ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋๋ก ํ์ง๋ง setter๋ final์ด ์๊ธฐ ๋๋ฌธ์ ๊ฐ์ฒด์ ์ํ์ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ๋ค. setter๋ ์ค์ ํ๋ ค๋ ํ๋์ ๋์ผํ ํ์ ์ ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ์์ผํ๋ฉฐ, ์๋ฐ๋น ํ๋กํผํฐ ๊ท์ฝ์ ํตํด set---๋ผ๊ณ ๋ฉ์๋๋ฅผ ํตํด ์ ๋ณด๋ฅผ ์์ ํ๋ ๊ท์น์ด ์๊ฒผ๋ค.
- setter๋ฅผ ํตํด ๊ฐ์ฒด ์ํ ๋ฐ๊พธ๊ธฐ ์ถ์ฒ
Q. ์์ฑ์๋ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ๋ฌ๊ฐ ๋ฐ์ ์ ์์๋ค. setter๋ ํ๋์ ๋งค๊ฐ๋ณ์๋ง ๋ฐ์๋ค. ์ ๊ทธ๋ฐ๊ฒ์ธ๊ฐ?
A. ์์ฑ์๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ํ์ํ ๋ชจ๋ ํ๋์ ๋ํด ๊ฐ์ ์ฃผ์ ํ๋ ์ญํ ์ ํ๋ค. ( ๊ฐ์ ๋ฐ์์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ํ๋์ ๋ฃ์ด์ค๋ค๋ ๊ฒ ๊ฐ๋ค.) ๊ทธ๋ฐ๋ฐ setter๋ ๊ฐ์ฒด ์ํ์ ์์ ์ด ๋ค์ด๊ฐ๋ ์ฃผ๋ก ํ๋์ ๋งค๊ฐ๋ณ์๋ง ์ฌ์ฉํ๋ค. ๊ผญ setter๋ฅผ ์ฌ์ฉํ ๋ ํ๋์ ๋งค๊ฐ๋ณ์๋ง ์ฌ์ฉ๊ฐ๋ฅํ ๊ฒ์ ์๋์ง๋ง ๋์ค์ ์ ์ง๋ณด์๋ฅผ ์๊ฐํด์ ํ๋์ฉ ์ฌ์ฉํ๋ค๊ณ ํ๋ค. ์ค์ ๋ก setter๋ ์ฌ์ฉ์ ์ง์ํ๋ ์ถ์ธ๋ผ๊ณ ํ๋ค. ์ด๊ฑด ์ ์๋ ๋ค๋ฃฌ์ ์ด ์๋ ๊ฒ ๊ฐ์๋ฐ, ๊ฐ์ฒด์ ์ํ๋ฅผ test ์ฝ๋ ํน์ ํ์ฌ setter ์ฝ๋ ๋ฑ์์ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๊ธฐ ๋๋ฌธ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ํ๋ฅ ์ด ๋๊ธฐ ๋๋ฌธ์ด๋ค.
โบ ํ๋ ์ฃผ์
ํ๋์ ๋ฐ๋ก ์์กด๊ด๊ณ ์ฃผ์ (์ฌ์ฉํ์ง๋ง์)
@Autowired
private MemberRepository memberRepository;
@Autowired
private DiscountPolicy discountPolicy;
OrderServiceImpl์ ๊ฐ ํด๋์ค MemberRepository์ DiscountPolicy์ ๊ดํ ์์กด๊ด๊ณ ์ฃผ์ ์ด ๋ฐ๋ก ์ด๋ค์ง๋ค.
โ๏ธ AutowiredTest
@Test
void AutoWiredOption() {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(TestBean.class);
}
AnnotationConfigApplicationContext
: ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ์์ฑํ๋ฉฐ, ๋น์ ๊ด๋ฆฌํ๊ณ ์์กด์ฑ ์ฃผ์ ์ ์ฒ๋ฆฌํ๋ค.
••• ์ด์ด์ ๋ค๋ฅธ ์ฝ๋ ๋ถ๋ถ •••
static class TestBean {
@Autowired(required = false)
public void setNoBean1(Member noBean1) {
System.out.println("noBean1 = " + noBean1);
}
@Autowired
public void setNoBean2(@Nullable Member noBean2) {
System.out.println("noBean2 = " + noBean2);
}
@Autowired
public void setBean3(Optional<Member> nobean3) {
System.out.println("nobean3 = " + nobean3);
}
}
@Autowired(required = false)
: ์๋ ์ฃผ์ ํ ๋์์ด ์์ผ๋ฉด ์์ ์ ๋ฉ์๋๊ฐ ์์ผ๋ฉด ํธ์ถ ์์ฒด๊ฐ ์๋๋ค.
@Nullable
: ์๋ ์ฃผ์ ํ ๋์์ด ์์ด๋ ํธ์ถ์ ๋์ง๋ง null๊ฐ์ด ๋๋ค.
Optional< >
: ์คํ๋ง ๋น์ด ์์ผ๋ฉด Optional empty๋ก ๋ค์ด์จ๋ค.
ํ์ฌ Member ํด๋์ค์๋ nobean1, nobean2, nobean3๊ณผ ๊ด๋ จ๋ bean์ด ๋ฑ๋ก๋์ด์์ง ์๊ธฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๋ค. ํ์ง๋ง ๊ฐ ์ฝ๋๋ฅผ ์ถ๊ฐํ์ฌ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ๋ฐฉ์งํ๋ค. nobean1์ required = true๋ก ํ๊ฒ๋๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ฒ๋๋ค.
Q. AnnotationConfigApplicationContext๋ฅผ ์ ์ธ์ ๋ฐ๋กํ๋ ์ด์ ๋ ๋ฌด์์ผ๊น?
A. AnnotationConfigApplicationContext๊ฐ ๋ฌด์์ ํ๋์ง ์ดํดํด์ผํ๋ค. AnnotationConfigApplicationContext์ ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ์์ฑํ๋ ์ญํ ์ ํ๊ณ ์๋ค. ๊ทธ๋ฆฌ๊ณ ์์ฑ ํ์ bean์ ๊ด๋ฆฌํ๊ณ ์์กด์ฑ์ ์ฃผ์ ํ๊ฒ ๋๋ค. static class TestBean์ ์คํ๋ง ์ปจํ ์ด๋์ ์ํด ๊ด๋ฆฌ๋๋ ๋น์ด ๋๋ค. ๋ง์ผ ๋ฐ๋ก ์ ์ธํ์ง ์๊ณ static class TestBean์ ์ ์ธํ๊ฒ ๋๋ฉด ์ฃผ๊ธฐ๊ฐ ๊ผฌ์ผ ์ ์๊ฒ๋๋ค. ์คํ๋ง์ ์ํด ๊ด๋ฆฌ๋์ด์ผํ ๋น์ด ๊ทธ ์์์ ์คํ๋ง์ ๊ด๋ฆฌํ ์ ์๋๋ก ์ ์ธํ๊ณ ์์ผ๋ ์ฃผ๊ธฐ๊ฐ ๊ผฌ์ฌ ์ ๋๋ก ์คํ๋์ง ๋ชปํ ์ ์๋ค.
Q. ๋กฌ๋ณต(LomBok) ์ด๋?
A. ์ฝ๋ ๋ฐ๋ณต ์์ฑ์ ์ค์ฌ์ฃผ๋ ์ฝ๋ ๋ค์ด์ดํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
โ๏ธ OrderServiceImpl (LomBok)
@Component
@RequiredArgsConstructor
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
}
@RequiredArgsConstructor
: ์ด๊ธฐํ ๋์ง์์ final ํ๋๋, @NonNull์ด ๋ถ์ ํ๋์ ๋ํด ์์ฑ์๋ฅผ ์์ฑํ๋ฉฐ, @Autowired๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์์กด์ฑ ์ฃผ์ ํ๋ค.
- @RequiredArgsConstructor ์ถ์ฒ
โ๏ธ Autowired ํ๋ ๋ช ๋งค์น
<๊ธฐ์กด ์ฝ๋>
@Autowired
private DiscountPolicy discountPolicy
ํ๋๊ฐ ๋ ๊ฐ (rateDiscountPolicy, fixDiscountPolicy)๊ฐ ์กด์ฌํ๋ค๋ฉฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
<๋ณ๊ฒฝ ํ ์ฝ๋>
@Autowired
private DiscountPolicy rateDiscountPolicy
@Autowired๋ DiscountPolicy๋ฅผ ํ์ ์ ๋น์ ์ฃผ์ ํ๊ธฐ ์ํด DiscountPolicy๋ฅผ ์ฐพ์๋์๊ฒ ๋๋ค. ๊ทธ๋ฐ๋ฐ DiscountPolicy ํ์ ์๋ rateDiscounPolicy์ fixDiscountPolicy์ธ ๋์ผ ํ์ ์ ๋น์ด ๋ ๊ฐ๊ฐ ์์์ ์๊ฒ๋๋ค. ๊ทธ๋ ๊ธฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ณ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ฌ ํ์ ๊ธฐ๋ฐ์์ ์ด๋ฆ ๊ธฐ๋ฐ ์ฝ๋๋ก ์์ ์์ผ์ค ๊ฒ์ด๋ค. rateDiscountPolicy ๋น์ด ์ ๋๋ก ๋ฑ๋ก๋์ด์๋ค๋ฉด ํด๋น ๋น์ผ๋ก ์ฃผ์ ํ๋ค.
โ๏ธ @Qualifier ์ฌ์ฉ
โบ ๋น ๋ฑ๋ก์ @Qualifier ์ถ๊ฐ ๊ตฌ๋ถ์ ์ ์ด์ฃผ๊ธฐ
@Component
@Qualifier("mainDiscountPolicy")
public class RateDiscountPolicy implements DiscountPolicy {}
Q. ๊ฐ์ ํ์ ์ ๋ค๋ฅธ ๋น์๋ @Qualifier์ ๊ผญ ์ฌ์ฉํด์ผํ๋๊ฐ?
A. ์ฌ์ฉํ์ง ์๋๋ค๊ณ ํด์ ๊ผญ ๋ฌธ์ ๊ฐ ์๊ธฐ๋ ๊ฒ์ด ์๋๋ผ์ ๋ฌด์กฐ๊ฑด ๋ถ์ฌ์ผํ๋ ๊ฒ๋ ์๋๋ค. ํ์ง๋ง ๋ง์ฝ ๊ฐ์ ํ์ ์ ๋น์ด 2๊ฐ ์ด์์ธ ๊ฒฝ์ฐ ๊ตฌ๋ถ์๋ฅผ ๋ถ์ด์ง ์์ ๋ค๋ฅธ ๋น์ ๊ฐ์ ธ์ค๊ณ ์ ํ ๋ ๊ตฌ๋ถ์๋ฅผ ๋ถ์ด์ง ์์ ๋ ๋ค๋ฅธ ๋น๊ณผ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๋ค. ๊ทธ๋ ๊ธฐ์ ๋ค๋ฅธ ๋น์๋ @Qualifier์ ์ฌ์ฉํ์ฌ ์ ํํ๊ฒ ๊ตฌ๋ถ์ง์ด์ฃผ๋ ๊ฒ์ด ์ข์๋ณด์ธ๋ค.
โบ ์์ฑ์ ์๋ ์ฃผ์
public OrderServiceImpl(MemberRepository memberRepository
,@Qualifier("mainDiscountPolicy") DiscountPolicy discountPolicy) {
์ฌ๊ธฐ์ @Qulifier์ ๋ถ์ฌ์ฃผ๋ฉด ์๋ก ๊ฐ์ @Qulifier์ ์ฐพ์ผ๋ฌ ๋ค๋๋ค. ๋ง์ผ ๋ถ์ด์ง ์์๋ค๊ณ ํด๋ mainDiscountPolicy์ธ ์คํ๋ง ๋น์ ์ฐพ์ผ๋ฌ ๋ค๋ ๊ฒ์ด๋ค.
โ๏ธ @Primary ์ฌ์ฉ
@Component
@Primary
public class RateDiscountPolicy implements DiscountPolicy {}
@Primary๋ฅผ ๋ถ์ฌ์ DiscountPolicy์ ํ์ ์์ RateDiscountPolicy ๋น์ด ๊ฐ์ฅ ์ฐ์ ์ ์ผ๋ก ์์กด์ฑ ์ฃผ์ ๋๋๋ก ํ๋ ๋ฐฉ์์ด๋ค. ๋ฉ์ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ปค๋ฅ์ ํ๋์ด ํ์ํ ๊ฒฝ์ฐ @Primary๋ฅผ ์ฌ์ฉํ๊ณ ์๋ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค๋ฅ์ ํ๋์ด ํ์ํ ๊ฒฝ์ฐ @Qualify๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ฉ์ดํ๋ค.
โ๏ธ MainDiscountPolicy
์ ๋ ธํ ์ด์ ์ง์ ๋ง๋ค๊ธฐ
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER,
ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Qualifier("mainDiscountPolicy")
@Target
: ์ ๋ ธํ ์ด์ ์ ์ฉ ๋์
@Retention
: ์ ๋ ธํ ์ด์ ์ง์ ์๊ฐ ๊ฒฐ์
@Documented
: ์ ๋ ธํ ์ด์ ์ ๋ณด๋ฅผ javadoc์ผ๋ก ์์ฑํ ๋ฌธ์์ ํฌํจ
@Qualifier("mainDiscountPolicy")` ์ด๋ ๊ฒ ๋ฌธ์๋ฅผ ์ ์ผ๋ฉด ์ปดํ์ผ์ ํ์ ์ฒดํฌ๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ์ ๋ ธํ ์ด์ ์ ์ง์ ๋ง๋ค์ฃผ์๋ค.
@MainDiscountPolicy
public class RateDiscountPolicy implements DiscountPolicy { }
์ด๋ ๊ฒ ์ฌ์ฉ์ด ๊ฐ๋ฅํด์ง๋ค. ์์ฑ์ ์ฃผ์ ์ด๋ ์์ ์ ์ฃผ์ ์๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฌ์ฉ๊ฐ๋ฅํ๋ค.
โ๏ธ AllBeanTest
ํด๋น ํ์ ์ ๋ชจ๋ ๋น์ด ํ์ํ ๊ฒฝ์ฐ Map๊ณผ List๋ฅผ ์ฌ์ฉํ๋ค.
โบ findAllBean( )
ApplicationContext ac
= new AnnotationConfigApplicationContext(AutoAppConfig.class, DiscountService.class);
DiscountService discountService = ac.getBean(DiscountService.class);
Member member = new Member(1L, "userA", Grade.VIP);
int discountPrice = discountService.discount(member, 10000, "fixDiscountPolicy");
AutoAppConfig์ DiscountService ํด๋์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์คํ๋ง ์ปจํ ์ด๋ ac๋ฅผ ๋ง๋ค์๋ค. ๊ทธ๋ฆฌ๊ณ DiscountService ๊ฐ์ฒด๋ฅผ ์ฐพ์ DiscountService ํ์ ์ discountService ์ด๋ฆ์ผ๋ก ํด๋น ๋น์ ๋ฐํํ๋ค. member๋ 10000์ ์ฃผ๋ฌธํ๊ณ , Vip ๋ฑ๊ธ์ผ๋ก fixDiscountPolicy๋ฅผ ์จ์ discount๋ฅผ ์งํํ๋ค.
โบ DiscountService
public DiscountService(Map<String, DiscountPolicy> policyMap,List<DiscountPolicy> policies){
this.policyMap = policyMap;
this.policies = policies;
}
์์ฑ์๋ฅผ ๋ง๋ค์๋ค. ์์ฑ์๋ DiscountPolicy ํ์ ์ <๋น์ด๋ฆ, ๋น> ์์ผ๋ก ๋ฐ๋ Map์ด ์๊ณ , ๋ชจ๋ DiscountPolicy ๋น์ ๋ฆฌ์คํธ ํํ๋ก ๋ฐ๋ List๋ก ๋ง๋ค์๋ค.
••• ์ด์ด์ ๋ค๋ฅธ ์ฝ๋ ๋ถ๋ถ •••
public int discount(Member member, int price, String discountCode) {
DiscountPolicy discountPolicy = policyMap.get(discountCode);
return discountPolicy.discount(member, price);
}
์ด ๋ฉ์๋๊ฐ ํ ์ธ ์ ์ฑ ์ ์ ์ฉํ๊ฒ ํ๋ค. discountCode๋ Test ์ฝ๋์์ fixDiscountPolicy๋ก ๋ฐ์๋ค. ๊ทธ๋ฌ๋ฉด policyMap์ ํตํด fixDiscountPolicy ๋น์ ์ฐพ์ discountPolicy๋ผ๋ ์ด๋ฆ์ผ๋ก ๋ฐ๋๋ค. ๊ทธ๋ฌ๋ฉด discountPolicy๋ fixDiscountPolicy๊ฐ ๋๋๊ฑฐ๊ณ fixDiscountPolicy์ ์ ์ฑ ์ธ 'Vip๋ ์ผ๋ง๋ฅผ ๊ตฌ๋งคํ๋ 1000์์ ํ ์ธํด์ฃผ๋ ๊ฒ'์ ๋ง์ถฐ ํ ์ธ์ด ์งํ๋๋ค. ๊ทธ๋ ๋ค๋ฉด member๋ vip์ด๋ฉฐ 10000์์ ๊ตฌ๋งคํ๋ค๋ test ์ฝ๋์ ๋ง์ถฐ 1000์์ ํ ์ธํด์ฃผ๋ฉด ๋๋ ๊ฒ์ด๋ค.
Map๊ณผ List๋ฅผ ์ฌ์ฉํ์ฌ ํ์ ์ ๋ง๋ ๋ชจ๋ ๋น์ ๊ฐ์ ธ์จ ํ, ๊ณ ๊ฐ ํน์ ํ ์คํธ์ ๋ง๋ ๋น์ ์ฐพ์ ๋ฉ์๋๋ฅผ ์ํํ๋ ๋ฐฉ์์ด๋ค.
Q. ๋ชจ๋ ๋น์ ๊ฐ์ ธ์ฌ ๋ ๊ผญ Map๊ณผ List ๋ ๋ค ์จ์ผํ๋๊ฑธ๊น?
A. ํ๋๋ง ์ฌ์ฉํ๋ค๊ณ ํด์ ์ด๋ค ๋ฌธ์ ๊ฐ ์๊ธฐ๋ ๊ฒ์ ์๋๋ค. Map์ <ํค ํน์ ์ด๋ฆ>์ ๊ฐ์ง๊ณ ๋น์ ๋น ๋ฅด๊ฒ ์ฐพ๋ ๊ฒ์ด๊ณ , List๋ ์์์ ๋ฐ๋ผ ๋ชจ๋ ๋น์ ์ฒ๋ฆฌํ ์ ์๋ ํน์ฑ์ ๊ฐ์ง๊ณ ์๋ค. ํ์ฌ๋ ์ ์ ๋น์ผ๋ก ํ ์คํธ๋ฅผ ์งํํ๊ณ ์์ง๋ง ์ค๋ฌด๋ ํจ์ฌ ๋ง์ ๋น์ผ๋ก ํ ์คํธ ํน์ ํ๋ก๊ทธ๋จ์ ๋๋ฆฌ๊ธฐ ๋๋ฌธ์ ๋ ํน์ฑ์ ๋ชจ๋ ๊ฐ์ง๊ณ ์์ด์ผ ์ ์ฐํ๊ฒ ์ ์ฉํ ์ ์๋ค.