public class AppConfig { // ์๋ก์ด ์ญํ . ์ฌ๊ธฐ์ ์์ฑํ ๊ตฌํ์ฒด๋ ์์ฑ์๋ก ์ฃผ์
๋ฐ๋๋ค.
public MemberService memberService() {
return new MemberServiceImpl(new MemoryMemberRepository()); // MemoryMemberRepository๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ ๋(๊ตฌ์ฒด์ ์ธ ๊ณณ์ ์ฌ๊ธฐ์ ์ง์ ํ๋ค.)
}
public OrderService orderService() {
return new OrderServiceImpl(new MemoryMemberRepository(), new FixDiscountPolicy());
}
}- AppConfig๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์ค์ ๋์์ ํ์ํ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
- MemberServiceImpl
- MemoryMemberRepository
- OrderServiceImpl
- MemoryMemberRepository
- FixDiscountPolicy
- MemberServiceImpl
AppConfig๋ ์์ฑํ ๊ฐ์ฒด ์ธ์คํด์ค์ ์ฐธ์กฐ(๋ ํผ๋ฐ์ค)๋ฅผ ์์ฑ์๋ฅผ ํตํด์ ์ฃผ์ (์ฐ๊ฒฐ)ํด์ค๋ค. MemberServiceImpl MemoryMemberRepository
- OrderServiceImpl
- MemoryMemberRepository
- FixDiscountPolicy
์ด์ ์ธํฐํ์ด์ค์๋ง ์์กดํ๊ณ ์๊ธฐ ๋๋ฌธ์ DIP๋ฅผ ๋ง์กฑํ๊ณ , ํด๋ผ์ด์ธํธ ์ชฝ ์ฝ๋ ๋ณ๊ฒฝ์ด ํ์ ์์ผ๋ฏ๋ก OCP๋ ๋ง์กฑํ๊ฒ ๋๋ ๊ฒ.
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
public OrderServiceImpl(final MemberRepository memberRepository, final DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}์ด์ DIP๊ฐ ์์ฑ๋จ! ใ ใ ใ
class MemberServiceTest {
private MemberService memberService ;
@BeforeEach
void setUp() {
AppConfig appConfig = new AppConfig();
memberService = appConfig.memberService();
}
@Test
void join() {
Member member = new Member(1L, "memberA", Grade.VIP);
memberService.join(member);
Member findMember = memberService.findMember(1L);
assertEquals(findMember, member);
}
}- AppConfig๋ก ๊ด์ฌ์ฌ๋ฅผ ํ์คํ๊ฒ ๋ถ๋ฆฌํ์
- AppConfig๋ ๊ตฌ์ฒด ํด๋์ค๋ฅผ ์ ํํ๋ค.
- ๊ฐ์ฒด์ ์์ฑ๊ณผ ์ฐ๊ฒฐ์ AppConfig ๊ฐ ๋ด๋นํ๋ค.
- DIP ์์ฑ: MemberServiceImpl ์ MemberRepository ์ธ ์ถ์์๋ง ์์กดํ๋ฉด ๋๋ค. ์ด์ ๊ตฌ์ฒด ํด๋์ค๋ฅผ ๋ชฐ๋ผ๋ ๋๋ค.
- ๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ: ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์ฐ๊ฒฐํ๋ ์ญํ ๊ณผ ์คํํ๋ ์ญํ ์ด ๋ช ํํ ๋ถ๋ฆฌ๋์๋ค.
- ์ง๊ธ ์ญํ ์ด ๋๋ฌ๋์ง ์๊ณ ์์
- ์ญํ ์ ๋๋ฌ๋๊ฒ ํ๋ ๊ฒ์ด ์ค์ํจ
public class AppConfig { // ์๋ก์ด ์ญํ . ์ฌ๊ธฐ์ ์์ฑํ ๊ตฌํ์ฒด๋ ์์ฑ์๋ก ์ฃผ์
๋ฐ๋๋ค.
public MemberService memberService() {
return new MemberServiceImpl(memberRepository()); // MemoryMemberRepository๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ ๋(๊ตฌ์ฒด์ ์ธ ๊ณณ์ ์ฌ๊ธฐ์ ์ง์ ํ๋ค.)
}
private MemoryMemberRepository memberRepository() {
return new MemoryMemberRepository();
}
public OrderService orderService() {
return new OrderServiceImpl(memberRepository(), discountPolicy());
}
public DiscountPolicy discountPolicy() {
return new FixDiscountPolicy();
}
}- ๋ฉ์๋ ๋ช ์ผ๋ก ์ญํ ์ด ๋๋ฌ๋จ
- ๋์ค์ MemoryMemberRepository -> JdbcMemberRepository ์ด๋ ๊ฒ ๋ฐ๋๋ค๊ณ ํ๋ค๋ฉด ์์ ๊ตฌํ์ฒด์ชฝ๋ง ๋ฐ๊ฟ์ฃผ๋ฉด ๋จ
- ์ ์ง ๋ณด์์๋ ๋์์ด ๋๋ค.
- ์ญํ ๊ณผ ๊ตฌํ์ด ํ ๋์ ๋ณด์ธ๋ค.
- new MemoryMemberRepository() ์ด ๋ถ๋ถ์ด ์ค๋ณต ์ ๊ฑฐ๋์๋ค.
- ์ด์ MemoryMemberRepository ๋ฅผ ๋ค ๋ฅธ ๊ตฌํ์ฒด๋ก ๋ณ๊ฒฝํ ๋ ํ ๋ถ๋ถ๋ง ๋ณ๊ฒฝํ๋ฉด ๋๋ค.
- AppConfig ๋ฅผ ๋ณด๋ฉด ์ญํ ๊ณผ ๊ตฌํ ํด๋์ค๊ฐ ํ๋์ ๋ค์ด์จ๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด ๊ตฌ์ฑ์ด ์ด๋ป๊ฒ ๋์ด์๋์ง ๋น ๋ฅด๊ฒ ํ์ ํ ์ ์๋ค.
๊ตฌ์ฑ์์ญ๊ณผ ์ฌ์ฉ์์ญ์ด ๋ช ํํ ๊ตฌ๋ถ๋์๋ค๋ ๊ฒ. ์ด๊ฒ ์ง์ง ํฐ ์ฅ์ ์ ๊ตฌ์ฑ ์์ญ์ ๋น์ฐํ ๋ณ๊ฒฝ๋๋ค! ๊ณต์ฐ ๊ธฐํ์๋ ๊ณต์ฐ ์ฐธ์ฌ์์ธ ๊ตฌํ ๊ฐ์ฒด๋ค์ ๋ชจ๋ ์์์ผํ๋ ๊ฒ์ ํฉํธ์ด๋! ๋์ ์ฌ์ฉ ์์ญ์ ์๋ ์ฝ๋๋ ์ ํ ์ ๋ ํ์๊ฐ ์๋ค!!!
- ๋๋ถ์ DIP / OCP๋ฅผ ๋ชจ๋ ์งํค๊ฒ ๋์๋ค.
- AppConfig๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด ๋์ ๋ฐฉ์์ ๊ตฌ์ฑํ๊ธฐ ์ํด ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์ฐ๊ฒฐํ๋ ์ฑ ์์ ๊ฐ์ง!(๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ)
- ํด๋ผ์ด์ธํธ ๊ฐ์ฒด๋ ์์ ์ ์ญํ ์ ์คํํ๋ ๊ฒ๋ง ์ง์ค, ์ฑ ์์ด ๋ช ํํด์ง