IoC, DI, ๊ทธ๋ฆฌ๊ณ ์ปจํ ์ด๋
์ ์ด์ ์ญ์ IoC(Inversion of Control)
ํ๋ก๊ทธ๋จ์ ์ ์ด ํ๋ฆ์ ์ง์ ์ ์ดํ๋ ๊ฒ์ด ์๋๋ผ ์ธ๋ถ์์ ๊ด๋ฆฌํ๋ ๊ฒ์ ์ ์ด์ ์ญ์ (IoC)์ด๋ผ ํ๋ค.
public class MemberServiceImpl implements MemberService {
private final MemberRepository memberRepository = new MemoryMemberRepository();
๊ธฐ์กด ํ๋ก๊ทธ๋จ์ ํด๋ผ์ด์ธํธ ๊ตฌํ ๊ฐ์ฒด๊ฐ ์ค์ค๋ก ํ์ํ ์๋ฒ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ์ฐ๊ฒฐํ๊ณ , ์คํํ๋ค.
๋ฐ๋ฉด์ AppConfig๊ฐ ๋ฑ์ฅํ ์ดํ์ ๊ตฌํ ๊ฐ์ฒด๋ ์์ ์ ๋ก์ง์ ์คํํ๋ ์ญํ ๋ง ๋ด๋นํ๋ค.
public class AppConfig {
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
ํ๋ก๊ทธ๋จ์ ์ ์ด ํ๋ฆ์ ์ด์ AppConfig๊ฐ ๊ฐ์ ธ๊ฐ๋ค.
ํ๋ ์์ํฌ vs ๋ผ์ด๋ธ๋ฌ๋ฆฌ
ํ๋ ์์ํฌ๊ฐ ๋ด๊ฐ ์์ฑํ ์ฝ๋๋ฅผ ์ ์ดํ๊ณ , ๋์ ์คํํ๋ฉด ๊ทธ๊ฒ์ ํ๋ ์์ํฌ๊ฐ ๋ง๋ค. (JUnit)
๋ฐ๋ฉด์ ๋ด๊ฐ ์์ฑํ ์ฝ๋๊ฐ ์ง์ ์ ์ด์ ํ๋ฆ์ ๋ด๋นํ๋ค๋ฉด ๊ทธ๊ฒ์ ํ๋ ์์ํฌ๊ฐ ์๋๋ผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค.
์์กด๊ด๊ณ ์ฃผ์
DI(Dependency Injection)
์ ์ ์ธ ํด๋์ค ์์กด๊ด๊ณ
OrderServiceImpl ์ MemberRepository , DiscountPolicy ์ ์์กดํ๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
์ค์ ์ด๋ค ๊ฐ์ฒด๊ฐ OrderServiceImpl ์ ์ฃผ์ ๋ ์ง ์ ์ ์๋ค.
๋์ ์ธ ๊ฐ์ฒด ์ธ์คํด์ค ์์กด ๊ด๊ณ
์ ํ๋ฆฌ์ผ์ด์ ์คํ ์์ ์ ์ค์ ์์ฑ๋ ๊ฐ์ฒด ์ธ์คํด์ค์ ์ฐธ์กฐ๊ฐ ์ฐ๊ฒฐ๋ ์์กด ๊ด๊ณ๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์คํ ์์ (๋ฐํ์)์ ์ธ๋ถ์์ ์ค์ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ํด๋ผ์ด์ธํธ์ ์ ๋ฌํด์
ํด๋ผ์ด์ธํธ์ ์๋ฒ์ ์ค์ ์์กด๊ด๊ณ๊ฐ ์ฐ๊ฒฐ ๋๋ ๊ฒ์ ์์กด๊ด๊ณ ์ฃผ์
์ด๋ผ ํ๋ค.
์์กด๊ด๊ณ ์ฃผ์ ์ ์ฌ์ฉํ๋ฉด ์ ์ ์ธ ํด๋์ค ์์กด๊ด๊ณ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ , ๋์ ์ธ ๊ฐ์ฒด ์ธ์คํด์ค ์์กด๊ด๊ณ๋ฅผ ์ฝ๊ฒ ๋ณ๊ฒฝํ ์ ์๋ค.
IoC ์ปจํ
์ด๋, DI ์ปจํ
์ด๋
AppConfig ์ฒ๋ผ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํ๋ฉด์ ์์กด๊ด๊ณ๋ฅผ ์ฐ๊ฒฐํด ์ฃผ๋ ๊ฒ์ IoC ์ปจํ ์ด๋ ๋๋ DI ์ปจํ ์ด๋๋ผ ํ๋ค.