๊ด์ฌ์ฌ๋ฅผ ๋ถ๋ฆฌํ์
์ ํ๋ฆฌ์ผ์ด์ ์ ํ๋์ ๊ณต์ฐ์ด๋ผ ์๊ฐํด๋ณด์.
๊ฐ๊ฐ์ ์ธํฐํ์ด์ค๋ฅผ ๋ฐฐ์ญ(๋ฐฐ์ฐ ์ญํ )์ด๋ผ ์๊ฐํ์.
๊ทธ๋ฐ๋ฐ! ์ค์ ๋ฐฐ์ญ ๋ง๋ ๋ฐฐ์ฐ๋ฅผ ์ ํํ๋ ๊ฒ์ ๋๊ฐ ํ๋๊ฐ?
๋ก๋ฏธ์ค์ ์ค๋ฆฌ์ฃ ๊ณต์ฐ์ ํ๋ฉด ๋ก๋ฏธ์ค ์ญํ ์ ๋๊ฐ ํ ์ง ์ค๋ฆฌ์ฃ ์ญํ ์ ๋๊ฐ ํ ์ง๋ ๋ฐฐ์ฐ๋ค์ด ์ ํ๋๊ฒ ์๋๋ค.
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository = new MemoryMemberRepository();
// private final DiscountPolicy discountPolicy = new FixDiscountPolicy();
private final DiscountPolicy discountPolicy = new RateDiscountPolicy();
์ฝ๋๋ ๋ง์น ๋ก๋ฏธ์ค ์ญํ (์ธํฐํ์ด์ค)์ ํ๋ ๋ ์ค๋๋ฅด๋ ๋์นดํ๋ฆฌ์ค(๊ตฌํ์ฒด, ๋ฐฐ์ฐ)๊ฐ
์ค๋ฆฌ์ฃ ์ญํ (์ธํฐํ์ด์ค)์ ํ๋ ์ฌ์ ์ฃผ์ธ๊ณต(๊ตฌํ์ฒด, ๋ฐฐ์ฐ)์ ์ง์ ์ด๋นํ๋ ๊ฒ๊ณผ ๊ฐ๋ค.
๋ณธ์ธ์ ์ญํ ๋ง ์ํํ๊ฒ ํด์ผํ๋ค
์ด๋ค ๊ตฌํ์ฒด๊ฐ ํ ๋น๋ ์ง๋ ๊ณต์ฐ ๊ธฐํ์๊ฐ ํด์ผํ๋ค .
AppConfig ๋ฑ์ฅ
๊ตฌํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ์ฐ๊ฒฐํ๋ ์ฑ ์์ ๊ฐ์ง๋ ๋ณ๋์ ์ค์ ํด๋์ค๋ฅผ ๋ง๋ค์.
public class AppConfig {
public MemberService memberService() {
return new MemberServiceImpl(new MemoryMemberRepository());
}
public OrderService orderService() {
return new OrderServiceImpl(new MemoryMemberRepository(), new FixDiscountPolicy());
}
}
AppConfig๋
์์ฑํ ๊ฐ์ฒด ์ธ์คํด์ค( new MemoryMemberRepository() ) ์ ์ฐธ์กฐ(๋ ํผ๋ฐ์ค)๋ฅผ
OrderServiceImpl ํด๋์ค ์์ฑ์๋ฅผ ํตํด์ ์ฃผ์ (์ฐ๊ฒฐ)ํด์ค๋ค.
Appconfig ์ orderService() ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด
( MemoryMemberRepository() ๊ฐ์ฒด ์์ฑ ,FixDiscountPolicy() ๊ฐ์ฒด ์์ฑ )
--> OrderServiceImpl ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ์์ฑ์ ํธ์ถ์ ํตํด ๊ฐ์ฒด์ ์ฐธ์กฐ๊ฐ์ ์ ๋ฌํ๋ค.
appConfig ๊ฐ์ฒด๋ memoryMemberRepository ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ
๊ทธ ์ฐธ์กฐ๊ฐ์ memberServiceImpl ์ ์์ฑํ๋ฉด์ ์์ฑ์๋ก ์ ๋ฌํ๋ค.
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
OrderServiceImpl ์ ์์ฑ์ ํธ์ถ - ์ฐธ์กฐ๊ฐ์ด ๋์ด๊ฐ
OrderServiceImpl ๊ฐ์ฒด์
MemberRepository ์ MemoryMemberRepository ํ ๋น
DiscountPolicy ์ FixDiscountPolicy ํ ๋น
๋์ค์ ํ ์ธ ์ ์ฑ ์ด ๋ณ๊ฒฝ๋์ด ์์ ํด์ผํ๋ค๋ฉด
OrderServiceImpl ๋ณ๊ฒฝํ์ง์๊ณ AppConfig ์์๋ง ๋ณ๊ฒฝํ๋ฉด ๋จ
FixDiscountPolicy RateDiscountPolicy ๋ก ๋ณ๊ฒฝํด๋ ๊ตฌ์ฑ ์์ญ๋ง ์ํฅ์ ๋ฐ๊ณ , ์ฌ์ฉ ์์ญ์ ์ ํ ์ํฅ์ ๋ฐ์ง ์๋๋ค.
public DiscountPolicy discountPolicy() {
return new FixDiscountPolicy();
}
ํ ์ธ ์ ์ฑ ๋ณ๊ฒฝ --->
public DiscountPolicy discountPolicy() {
return new RateDiscountPolicy();
}
๊ฐ์ฒด์ ์์ฑ๊ณผ ์ฐ๊ฒฐ์ AppConfig ๊ฐ ๋ด๋นํ๋ค.
DIP ์์ฑ: MemberServiceImpl ์ MemberRepository ์ธ ์ถ์์๋ง ์์กดํ๋ฉด ๋๋ค. ์ด์ ๊ตฌ์ฒด ํด๋์ค๋ฅผ ๋ชฐ๋ผ๋ ๋๋ค.
๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ: ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์ฐ๊ฒฐํ๋ ์ญํ ๊ณผ ์คํํ๋ ์ญํ ์ด ๋ช
ํํ ๋ถ๋ฆฌ๋์๋ค.
public class AppConfig {
public MemberService memberService() {
return new MemberServiceImpl(new MemoryMemberRepository());
}
public class MemberServiceImpl implements MemberService {
private final MemberRepository memberRepository;
public MemberServiceImpl(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
์ค๊ณ ๋ณ๊ฒฝ์ผ๋ก MemberServiceImpl ์ MemoryMemberRepository ๋ฅผ ์์กดํ์ง ์๋๋ค!
๋จ์ง MemberRepository ์ธํฐํ์ด์ค๋ง ์์กดํ๋ค.
MemberServiceImpl ์ ์์ฑ์๋ฅผ ํตํด์ ์ด๋ค ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์ฃผ์ ํ ์ง๋ ์ค์ง ์ธ๋ถ( AppConfig )์์ ๊ฒฐ์ ๋๋ค.
ํด๋ผ์ด์ธํธ์ธ memberServiceImpl ์ ์ฅ์์ ๋ณด๋ฉด ์์กด๊ด๊ณ๋ฅผ ๋ง์น ์ธ๋ถ์์ ์ฃผ์ ํด์ฃผ๋ ๊ฒ ๊ฐ๋ค๊ณ ํด์
DI(Dependency Injection) ์ฐ๋ฆฌ๋ง๋ก ์์กด๊ด๊ณ ์ฃผ์ ๋๋ ์์กด์ฑ ์ฃผ์ ์ด๋ผ ํ๋ค.
AppConfig ์์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊บผ๋ด์ ์ฐ๊ธฐ
AppConfig appConfig = new AppConfig();
OrderService orderService = appConfig.orderService();
MemberService memberService = appConfig.memberService();
ํ ์คํธ ์ฝ๋์์ @BeforeEach ๋ ๊ฐ ํ ์คํธ๋ฅผ ์คํํ๊ธฐ ์ ์ ํธ์ถ๋๋ค.
@BeforeEach
public void beforeEach() {
AppConfig appConfig = new AppConfig();
memberService = appConfig.memberService();
}
AppConfig ๋ฆฌํฉํฐ๋ง
๋ฆฌํฉํฐ๋ง ์
public class AppConfig {
public MemberService memberService() {
return new MemberServiceImpl(new MemoryMemberRepository());
}
public OrderService orderService() {
return new OrderServiceImpl(new MemoryMemberRepository(), new FixDiscountPolicy());
}
}
ํ์ฌ AppConfig๋ฅผ ๋ณด๋ฉด ์ค๋ณต์ด ์๊ณ , ์ญํ ์ ๋ฐ๋ฅธ ๊ตฌํ์ด ์ ์๋ณด์ธ๋ค.
๋ฆฌํฉํฐ๋ง ํ
public class AppConfig {
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
public OrderService orderService() {
return new OrderServiceImpl(memberRepository(), discountPolicy());
}
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
public DiscountPolicy discountPolicy() {
return new FixDiscountPolicy();
}
}
new MemoryMemberRepository() ์ด ๋ถ๋ถ์ด ์ค๋ณต ์ ๊ฑฐ๋์๋ค.
์ด์ MemoryMemberRepository ๋ฅผ ๋ค๋ฅธ ๊ตฌํ์ฒด๋ก ๋ณ๊ฒฝํ ๋ ํ ๋ถ๋ถ๋ง ๋ณ๊ฒฝํ๋ฉด ๋๋ค.
AppConfig ๋ฅผ ๋ณด๋ฉด ์ญํ ๊ณผ ๊ตฌํ ํด๋์ค๊ฐ ํ๋์ ๋ค์ด์จ๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด ๊ตฌ์ฑ์ด ์ด๋ป๊ฒ ๋์ด์๋์ง ๋น ๋ฅด๊ฒ ํ์ ํ ์ ์๋ค.
์ ๋ฆฌ
AppConfig๋ฅผ ํตํด์ ๊ด์ฌ์ฌ๋ฅผ ํ์คํ๊ฒ ๋ถ๋ฆฌํ๋ค.
AppConfig๋ ๊ตฌ์ฒด ํด๋์ค๋ฅผ ์ ํํ๋ค.
๋ฐฐ์ญ์ ๋ง๋ ๋ด๋น ๋ฐฐ์ฐ๋ฅผ ์ ํํ๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ด๋ป๊ฒ ๋์ํด์ผ ํ ์ง ์ ์ฒด ๊ตฌ์ฑ์ ์ฑ ์์ง๋ค.