<์ค๋์ ๋ณต์ต>
- spring
๐ง ๊ฐ์ฒด ์งํฅ ์๋ฆฌ ์ ์ฉ
๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ
- ์ค์ ์คํ๋๋ ๊ฐ์ฒด๋ค์ ๋ณธ์ธ์ ์ญํ ๋ง ์ํํ๋๋ก ํด์ค์ผ ํจ
- ์ด๋ค ๊ตฌํ์ฒด๋ค์ด ์ธํฐํ์ด์ค์ ํ ๋น ๋ ์ง๋ '๋ณ๋์ ์ค์ ํด๋์ค'๋ฅผ ๋ง๋ค์ด์ผ ๋จ!
- ๋ณธ์ธ์๊ฒ ํ ๋น๋ ์ฑ ์์ ํ์คํ ๋ถ๋ฆฌํด์ผ ๋๋ค
AppConfig
- ์ดํ๋ฆฌ์ผ์ด์ ์ ์ ์ฒด ๋์ ๋ฐฉ์์ ๊ตฌ์ฑ(config = ์ค)ํ๊ธฐ ์ํด, ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ์ฐ๊ฒฐํ๋ ์ฑ ์์ ๊ฐ์ง๋ ๋ณ๋์ ์ค์ ํด๋์ค๋ฅผ ๋ง๋ค๊ธฐ
- ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ ๋ํ ์ด์์ ์ฑ ์์ง๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค
- ์ดํ๋ฆฌ์ผ์ด์ ์ ์ฒด๋ฅผ ์ค์ ํ๊ณ ๊ตฌ์ฑํ๋ค
โก๏ธ ํ์ฌ๊น์ง ์์ฑํ ์ฝ๋์์ ๊ตฌํ์ฒด๊ฐ ๊ตฌํ์ฒด๋ฅผ ์ ํํ๊ณ ์ฌ์ฉํ๊ณ ์์
- AppConfig
public class AppConfig {
public MemberService memberService() {
return new MemberServiceImpl(new MemoryMemberRepository());
}
public OrderService orderService() {
return new OrderServiceImpl(
new MemoryMemberRepository(),
new FixDiscountPolicy());
}
}
- ์์ฑ์๋ฅผ ์ฃผ์ (์์ฑ์๋ฅผ ํตํด์ ๊ฐ์ฒด๊ฐ(new ์ธ์คํด์ค) ์์ฑ๋๊ฒ ๋ค์ด ๊ฐ๋ค)
- ์์ฑ์๋ฅผ ํตํด์ MemberRepository์ ์ด๋ค ๊ตฌํ์ฒด๊ฐ ๋ค์ด๊ฐ์ง๋ฅผ ์ ํ
- final → ๊ธฐ๋ณธ์ผ๋ก ํ๋ ์์ฑ์๋ฅผ ํ ๋นํ๋ ๋ ์ค์ ํ๊ฐ์ง๋ก!
- ์์ฑํ ๊ฐ์ฒด ์ธ์คํด์ค์ ์ฐธ์กฐ(์ธ์คํด์ค)๋ฅผ ์์ฑ์๋ฅผ ํตํด ์ฃผ์
(์ฐ๊ฒฐ)ํด ์ค๋ค
- MemberServiceImpl → MemoryMemberREpository
- OrderService → MemoryMemberRepository, FixDiscountPolicy
- return new MemberServiceImpl(new MemoryMemberRepository()); โก๏ธ MemberServiceImpl์ MemoryMemberRepository๋ฅผ ์ฌ์ฉํ ๊ฒ์ด๋ค (๋ผ๋ ๋ป)
- MemberServiceImpl ์์
public class MemberServiceImpl implements MemberService {
private final MemberRepository memberRepository;
public MemberServiceImpl(MemberRepository memberRepository) { // ์์ฑ์ ์์ฑ
this.memberRepository = memberRepository;
}
- ์์ฑ์๋ฅผ ํตํด์ memberRepository์ ๊ตฌํ์ฒด๊ฐ ๋ญ๊ฐ ๋ค์ด๊ฐ์ง ์ ํ
- AppConfig๋ฅผ ํตํด์ memberService๋ฅผ ํธ์ถํด์ ์ฌ์ฉ
- MemberServiceImpl์ MemberRepository์ ๋ํ ์ฝ๋ x โก๏ธ MemberRepository๋ผ๋ ์ธํฐํ์ด์ค๋ง ์๋ค(์ถ์ํ์๋ง ์์กดํ๋ค)
- MemberServiceImpl → ๊ตฌ์ฒด์ ์ธ ๊ฒ์ ์ ํ ๋ชจ๋ฆ! (์ด๋ค ๊ฐ์ฒด๊ฐ ๋ค์ด์ฌ์ง?)
- ์ค๊ณ ๋ณ๊ฒฝ์ผ๋ก MemberServiceImpl์ MemoryMemberRepository๋ฅผ ์์กดํ์ง ์์! → MemberRepository ์ธํฐํ์ด์ค๋ง ์์กดํจ
- MemberServiceImpl์ ์์ฑ์๋ฅผ ํตํด ์ด๋ค ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์ฃผ์ ํ ์ง๋ โก๏ธ ์ค์ง ์ธ๋ถ(AppConfig)์์ ๊ฒฐ์ ๋จ
- MemberServiceImpl์ ์์กด๊ด๊ณ์ ๋ํ ๊ณ ๋ฏผ์ ์ธ๋ถ์ ๋งก๊ธฐ๊ณ ์คํ์๋ง ์ง์ค!
- OrderServiceImpl ์์
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;
}
- ์ฌ์ฉํ๋ ํ๋๊ฐ 2๊ฐ - MemberRepository, discountPolicy
- final - ๊ธฐ๋ณธ์ผ๋ก ํ ๋น์ ํ๋ , ์์ฑ์๋ก ํ ๋น์ ํ๋ → ๋ ๊ฐ์ง์ค์์ ์ ํ
- this๋ฅผ ํตํด ๊ฐ์ด ๋์ด๊ฐ๋ฉด์ ํ ๋น๋๋ค
- discountPolicy์์ fix๊ฐ ๋ค์ด์ฌ์ง rate๊ฐ ๋ค์ด์ฌ์ง ๋ชจ๋ฅธ๋ค → OrderServiceImpl (createOrder()๋ก์ง๋ง ์คํํ๋ฉด ๋จ)
- ์ค๊ณ ๋ณ๊ฒฝ์ผ๋ก OrderServiceImpl์ FixDiscountPolicy๋ฅผ ์์กด x โก๏ธ DiscountPolicy ์ธํฐํ์ด์ค๋ง ์์กดํจ
- OrderServiceImpl → ์ด๋ค ์์ฑ์๋ฅผ ํตํด ๊ตฌํ ๊ฐ์ฒด๊ฐ ๋ค์ด์ฌ์ง ๋ชจ๋ฆ
- OrderServiceImpl ์์ฑ์๋ฅผ ํตํด ์ด๋ค ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์ฃผ์ ํ ์ง๋? โก๏ธ AppConfig์์ ๊ฒฐ์
- OrderServiceImpl : ์คํ์๋ง ์ง์ค!
- OrderServiceImpl๋ : MemoryMemberRepository , FixDiscountPolicy๊ฐ์ฒด์ ์์กด๊ด๊ณ๊ฐ ์ฃผ์ ๋จ
โก๏ธ DIP๋ฅผ ์งํค๊ณ ์์ - ์ธํฐํ์ด์ค๋ง ์์กดํจ, ๊ตฌ์ฒด์ ์ธ ์์ฑ์๋ฅผ ์ฃผ์ ์์ผ์ค์ผ ํ๋ค

- ๊ฐ์ฒด์ ์์ฑ, ์ฐ๊ฒฐ โก๏ธ AppConfig๊ฐ ๋ด๋น
- DIP ์์ฑ : MemberServiceImpl์ MemberRepository์ธ '์ถ์'์๋ง ์์กดํ๋ฉด ๋จ, ๊ตฌ์ฒด ํด๋์ค๋ฅผ ๋ชฐ๋ผ๋ ๋๋ค
- ๊ด์ฌ์ฌ ๋ถ๋ฆฌ : ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์ฐ๊ฒฐํ๋ ์ญํ ๊ณผ ์คํํ๋ ์ญํ ์ด ๋ช ํํ ๋ถ๋ฆฌ๋จ
- appConfig ๊ฐ์ฒด๋ memoryMemberRepository๋ฅผ ์์ฑ →๊ทธ ์ฐธ์กฐ๊ฐ์ memberServiceImpl์ ์์ฑํ๋ฉด์ ์์ฑ์๋ก ์ ๋ฌ
- ํด๋ผ์ด์ธํธ์ธ memberServiceImpl์
์ฅ์์ ๋ณด๋ฉด ์์กด๊ด๊ณ๋ฅผ ๋ง์น ์ธ๋ถ์์ ์ฃผ์
ํด์ฃผ๋ ๊ฒ ๊ฐ๋ค๊ณ ํด์ DI - ์ฐ๋ฆฌ๋ง๋ก '์์กด๊ด๊ณ ์ฃผ์
or ์์กด์ฑ ์ฃผ์
' ์ด๋ผ๊ณ ํ๋ค
- ์์กด์ ๊ด๊ณ๊ฐ ์ค์ํจ!

- ํ์ํ ์ฝ๋์ ๋ฌธ์ ๊ฐ ์๋ค๋ ๋ป!
- MemberApp (ํ ์คํธ)
public class MemberApp {
public static void main(String[] args) {
AppConfig appConfig = new AppConfig();
MemberService memberService = appConfig.memberService();
Member member = new Member(1L, "memberA", Grade.VIP);
memberService.join(member);
Member findMember = memberService.findMember(1L);
System.out.println("new Member = " + member.getName());
System.out.println("find Member = " + findMember.getName());
}
}
- AppConfig๋ฅผ ๋ง๋ค์ด์ผ ๋๋ค
- appconfig.memberService()๊ฐ ํ์ํ๋ค(์ธํฐํ์ด์ค ํธ์ถ) โก๏ธ memberServiceImpl์ด ๋ค์ด๊ฐ
- ๊ธฐ์กด์๋ → MemberServiceImpl์ ์ง์ ๋ฉ์ธ ๋ฉ์๋์์ ์์ฑ → memoryMemberRepository๋ฅผ ์์ฑ
- ์ ์ฝ๋์์๋ appConfig์์ ๋ชจ๋ ๊ฒฐ์ ์ ํ๋ค

- ํ ์คํธ๊ฐ ์ ์คํ๋๋ ๊ฒ์ ๋ณผ ์ ์์
- OrderApp ํ ์คํธ ์คํ
public class OrderApp {
public static void main(String[] args) {
AppConfig appConfig = new AppConfig();
MemberService memberService = appConfig.memberService();
OrderService orderService = appConfig.orderService();
Long memberId = 1L;
Member member = new Member(memberId, "memberA", Grade.VIP);
memberService.join(member);
Order order = orderService.createOrder(
memberId, "itemA", 10000);
System.out.println("order = " + order);
}
}
- ๋์ด์ ๊ตฌ์ฒด ํด๋์ค์ ์์กดํ ํ์ x
- ์ธํฐํ์ด์ค์๋ง ์์กด

- ์คํ์ด ๋๋ ๊ฒ์ ํ์ธ
- ํ ์คํธ ์ฝ๋ ์์ !
public class MemberServiceTest {
MemberService memberService;
@BeforeEach
public void beforeEach() { // ์คํํ๊ธฐ ์ ์ ๋๋ฆด๊บผ์ผ
AppConfig appConfig = new AppConfig();
memberService = appConfig.memberService();
}
public class OrderServiceTest {
MemberService memberService;
OrderService orderService;
@BeforeEach
public void beforeEach() {
AppConfig appConfig = new AppConfig();
memberService = appConfig.memberService();
orderService = appConfig.orderService();
}

- ๋ชจ๋ ํ ์คํธ๊ฐ ์ฑ๊ณตํ๋ ๊ฑธ ํ์ธํ ์ ์์
<์ถ์ฒ - ์ธํ๋ฐ(์คํ๋ง ํต์ฌ ์๋ฆฌ - ๊ธฐ๋ณธํธ) , ๊น์ํ >
์คํ๋ง ํต์ฌ ์๋ฆฌ - ๊ธฐ๋ณธํธ - ์ธํ๋ฐ | ๊ฐ์
์คํ๋ง ์ ๋ฌธ์๊ฐ ์์ ๋ฅผ ๋ง๋ค์ด๊ฐ๋ฉด์ ์คํ๋ง์ ํต์ฌ ์๋ฆฌ๋ฅผ ์ดํดํ๊ณ , ์คํ๋ง ๊ธฐ๋ณธ๊ธฐ๋ฅผ ํ์คํ ๋ค์ง ์ ์์ต๋๋ค., - ๊ฐ์ ์๊ฐ | ์ธํ๋ฐ
www.inflearn.com
- (์คํ๋ง ํต์ฌ ์๋ฆฌ - ๊ธฐ๋ณธํธ) ๊ฐ์๋ฅผ ๋ฃ๊ณ ํ์ต์ ์ํด ์์ฑํ์ต๋๋ค.