์คํ๋ง ํต์ฌ ์๋ฆฌ - ๊ธฐ๋ณธํธ์ ์๊ฐํ๋ฉด์ ๋์จ ๊ฐ๋ ์ด๋ค.
Appconfig๋ฅผ ๋ง๋ค์ด์ ์ฐ๊ฒฐํด์ฃผ๊ธฐ ์ ์๋ OrderServiceImpl ๊ฐ์ ํด๋ผ์ด์ธํธ ์ฝ๋์ ์ํฅ์ ์ฃผ๋ ์ฝ๋๋ฅผ ์งฐ์๋ค.
public class OrderServiceImpl implements OrderService {
private final DiscountPolicy discountPolicy = new FixDiscountPolicy();
private final MemberRepository memberRepository = new MemoryMemberRepository();
...
}
๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ์ง๊ฒ๋๋ฉด ํด๋ผ์ด์ธํธ ์ฝ๋(OrderServiceImpl)์์
DiscountPolicy์ ๊ฐ์ ์ธํฐํ์ด์ค ์ฝ๋ ๋ฟ๋ง ์๋๋ผ ๊ตฌ์ฒด์ ์ธ ํด๋์ค๋ ์์กดํ๊ฒ ๋๋ค.
์ด๋ ๊ฒ ๋๋ฉด OCP, DIP๋ฅผ ์๋ฐํ๊ฒ ๋๋ค.
์ด๋ ๊ฒ ๊ตฌ์ฒด์ ์ธ ํด๋์ค๋ฅผ ์์กดํ์ง ์๊ฒ ์ง๊ธฐ ์ํด์, ์ธํฐํ์ด์ค์ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ๋์ ์์ฑํ๊ณ ์ฃผ์ ํ๋ Appconfig๋ฅผ ์์ฑํด์ฃผ์๋ค.
public class Appconfig {
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
public DiscountPolicy discountPolicy() {
return new FixDiscountPolicy();
}
public OrderService orderService() {
return new OrderServiceImpl(memberRepository(), discountPolicy());
}
...
}
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์ ํ์ํ ์ธํฐํ์ด์ค๋ค์ ํธ์ถํ์ง๋ง ์ด๋ค ๊ตฌํ ๊ฐ์ฒด๋ค์ด ์คํ๋ ์ง ๋ชจ๋ฅธ๋ค.
( โก๏ธ discountPolicy๊ฐ Fix์ธ์ง Rate์ธ์ง OrderServiceImpl๋ ์์ง ๋ชปํจ, DIP)
๊ทธ๋ฆฌ๊ณ ์ํํธ์จ์ด ์์๋ฅผ ์๋กญ๊ฒ ํ์ฅํด๋ ์ฌ์ฉ ์์ญ์ ๋ณ๊ฒฝ์ ๋ซํ์๊ฒ ๋๋ค. (OCP)
โ๏ธ ์ฆ, ํ๋ก๊ทธ๋จ์ ๋ํ ์ ์ด ํ๋ฆ์ ๋ํ ๊ถํ์ด ๋ชจ๋ Appconfig์๊ฒ ์๋ค.
๐ ์ด๋ ๊ฒ ํ๋ก๊ทธ๋จ์ ์ ์ดํ๋ฆ์ ์ง์ ์ ์ดํ๋ ๊ฒ์ด ์๋๋ผ ์ธ๋ถ์์ ๊ด๋ฆฌํ๋ ๊ฒ์ ์ ์ด์ ์ญ์ (loC)์ด๋ผ ํ๋ค.
์์กด๊ด๊ณ ์ฃผ์ DI
์์กด๊ด๊ณ๋ ์ ์ ์ธ ํด๋์ค ์์กด ๊ด๊ณ์, ์คํ ์์ ์ ๊ฒฐ์ ๋๋ ๋์ ์ธ ๊ฐ์ฒด(์ธ์คํด์ค) ์์กด ๊ด๊ณ ๋์ ๋ถ๋ฆฌํด ์๊ฐํด์ผํ๋ค.
์ ์ ์ธ ํด๋์ค ์์กด ๊ด๊ณ
โ๏ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ์ง ์์๋ ๋ถ์ ๊ฐ๋ฅ
โ๏ธ OrderServiceImpl์ MemberRepositiry์ DiscountPolicy์ ์์กด
๐ ๊ทธ๋ฌ๋ ์ด๋ฌํ ํด๋์ค ์์กด๊ด๊ณ๋ง์ผ๋ก๋ ์ค์ ์ด๋ค ๊ฐ์ฒด๊ฐ OrderServiceImpl์ ์ฃผ์ ๋ ์ง ์ ์ ์์
โ๏ธ ๋ฐํ์(์คํ ์์ )์ ์ธ๋ถ์์ ์ค์ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ํด๋ผ์ด์ธํธ์ ์ ๋ฌํด์
ํด๋ผ์ด์ธํธ์ ์๋ฒ์ ์ค์ ์์กด๊ด๊ณ๊ฐ ์ฐ๊ฒฐ ๋๋ ๊ฒ์ ์์กด ๊ด๊ณ ์ฃผ์ ์ด๋ผ๊ณ ํจ
โ๏ธ ์์กด๊ด๊ณ ์ฃผ์ ์ ์ฌ์ฉํ๋ฉด ํด๋ผ์ด์ธํธ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ , ํด๋ผ์ด์ธํธ๊ฐ ํธ์ถํ๋ ๋์์ ํ์ ์ธ์คํด์ค๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค.
( โก๏ธ OrderServiceImpl์ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ DiscountPolicy์ ๊ตฌํ ๊ฐ์ฒด์ธ Fix~ ์ Rate ์ค ๋ณ๊ฒฝํ ์ ์์)
๐ ์์กด๊ด๊ณ ์ฃผ์ ์ ์ฌ์ฉํ๋ฉด ์ ์ ์ธ ํด๋์ค ์์กด๊ด๊ณ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ , ๋์ ์ธ ๊ฐ์ฒด ์ธ์คํด์ค ์์กด ๊ด๊ณ๋ฅผ ์ฝ๊ฒ ๋ณ๊ฒฝํ ์ ์๋ค.
Appconfig ์ฒ๋ผ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํ๋ฉฐ ์์กด๊ด๊ณ๋ฅผ ์ฐ๊ฒฐํด์ฃผ๋ ๊ฒ์ loC ์ปจํ ์ด๋, DI ์ปจํ ์ด๋๋ผ๊ณ ํ๋ค.