๐๏ธ ๋ณธ ํฌ์คํธ๋ ์ธํ๋ฐ ๊น์ํ ์คํ๋ง ๊ธฐ๋ณธํธ์ ๋ณด๊ณ ์ ๋ฆฌํ ๋ด์ฉ์
๋๋ค.
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8
์คํ๋ง ํต์ฌ ์๋ฆฌ - ๊ธฐ๋ณธํธ| ๊น์ํ - ์ธํ๋ฐ ๊ฐ์
ํ์ฌ ํ์ 5.0์ ์๊ฐ์ 48,140๋ช ์ธ ๊ฐ์๋ฅผ ๋ง๋๋ณด์ธ์. ์คํ๋ง ์ ๋ฌธ์๊ฐ ์์ ๋ฅผ ๋ง๋ค์ด๊ฐ๋ฉด์ ์คํ๋ง์ ํต์ฌ ์๋ฆฌ๋ฅผ ์ดํดํ๊ณ , ์คํ๋ง ๊ธฐ๋ณธ๊ธฐ๋ฅผ ํ์คํ ๋ค์ง ์ ์์ต๋๋ค. ์คํ๋ง ๊ธฐ๋ณธ ๊ธฐ๋ฅ, ์คํ
www.inflearn.com

1. ์๋ก์ด ํ ์ธ ์ ์ฑ ์ ์ฉ๊ณผ ๋ฌธ์ ์
ํ ์ธ ์ ์ฑ
์ ๋ณ๊ฒฝํ๋ ค๋ฉด ํด๋ผ์ด์ธํธ์ธ OrderServiceImpl ์ฝ๋๋ฅผ ๊ณ ์ณ์ผ ํ๋ค.
public class OrderServiceImpl implements OrderService {
// private final DiscountPolicy discountPolicy = new FixDiscountPolicy();
private final DiscountPolicy discountPolicy = new RateDiscountPolicy();
}
์ด ์ฝ๋๋ OrderServiceImpl์ด new ํค์๋๋ก ํ ์ธ ์ ์ฑ
๊ตฌํ์ฒด๋ฅผ ์ง์ ์์ฑํด์ ์ฌ์ฉํ๋ ๊ฒ !
- OrderServiceImpl์ DiscountPolicy ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๊ณ ์์ → "์ธํฐํ์ด์ค์ ์์กดํ๋ค" = ๋คํ์ฑ ํ์ฉ
- FixDiscountPolicy, RateDiscountPolicy ๊ฐ์ ๊ตฌํ์ฒด๋ฅผ ๊ฐ์๋ผ์ธ ์ ์์ → ํ์ฅ ๊ฐ๋ฅํด ๋ณด์
ํ์ง๋ง ์ด ์ฝ๋๋ DIP ์๋ฐํ๋ค
โญ DIP๋?
DIP (Dependency Inversion Principle, ์์กด๊ด๊ณ ์ญ์ ์์น)
"๊ณ ์์ค ๋ชจ๋์ ์ ์์ค ๋ชจ๋์ ์์กดํ๋ฉด ์ ๋๋ค. ๋ ๋ค ์ถ์(์ธํฐํ์ด์ค)์ ์์กดํด์ผ ํ๋ค."
- ๊ณ ์์ค ๋ชจ๋: ๋น์ฆ๋์ค ๋ก์ง (์: ์ฃผ๋ฌธ ์๋น์ค)
- ์ ์์ค ๋ชจ๋: ์ธ๋ถ ๊ตฌํ (์: ํ ์ธ ์ ์ฑ
, ๊ฒฐ์ ๋ฐฉ์ ๋ฑ)
- DIP ์์น: ํด๋ผ์ด์ธํธ(=OrderServiceImpl)๋ ์ถ์(์ธํฐํ์ด์ค)์๋ง ์์กดํด์ผ ํ๋ค.
- ๊ทธ๋ฐ๋ฐ ์ง๊ธ ์ฝ๋ ๋ณด๋ฉด?
- ์ฌ๊ธฐ์ OrderServiceImpl์
- ์ถ์(์ธํฐํ์ด์ค) DiscountPolicy์๋ ์์กด
- ๋์์ ๊ตฌ์ฒด ํด๋์ค RateDiscountPolicy์๋ ์ง์ ์์กดํ๊ณ ์๋ค โญ
- ์ฌ๊ธฐ์ OrderServiceImpl์
=> ๋ฐ๋ผ์ ํ์ฅํ ๋๋ง๋ค ๊ธฐ์กด ์ฝ๋(OrderServiceImpl)๊ฐ ๊นจ์ง๋ ๊ตฌ์กฐ → OCP ์๋ฐ
โญ OCP๋?
OCP (Open-Closed Principle, ๊ฐ๋ฐฉ-ํ์ ์์น)
"ํ์ฅ์๋ ์ด๋ ค ์์ด์ผ ํ๊ณ , ๋ณ๊ฒฝ์๋ ๋ซํ ์์ด์ผ ํ๋ค."
- ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ ๋ ๊ธฐ์กด ์ฝ๋๋ฅผ ์์ ํ์ง ์๊ณ
- ๊ธฐ์กด ์ฝ๋๋ฅผ ํ์ฅํด์ ์ฒ๋ฆฌํด์ผ ํ๋ค.
์๋ ๊ธฐ๋ํ๋ ์์กด๊ด๊ณ๋ ๋ค์๊ณผ ๊ฐ์ง๋ง
OrderServiceImpl ---> DiscountPolicy (์ธํฐํ์ด์ค)
ํ์ฌ ์ฝ๋๋ ๊ตฌํ์ฒด์๋ ์ง์ ์์กดํด๋ฒ๋ฆฐ ๊ด๊ณ๊ฐ ๋๋ค
OrderServiceImpl ---> DiscountPolicy (์ธํฐํ์ด์ค)
โ
โโ> RateDiscountPolicy (๊ตฌํ์ฒด) ← ์ง์ ์์กด
์ธํฐํ์ด์ค๋ง ์์กดํ๋๋ก ์ฝ๋๋ฅผ ์์ ํ๋ค
public class OrderServiceImpl implements OrderService {
//private final DiscountPolicy discountPolicy = new RateDiscountPolicy();
private DiscountPolicy discountPolicy;
}
ํ์ง๋ง ๋ค์ ์ฝ๋์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
์ฝ๋๋ฅผ ์ธํฐํ์ด์ค๋ง ์์กดํ๋๋ก ๋ฐ๊ฟจ์ง๋ง, ์ด์ ๋ ๊ตฌํ์ฒด๊ฐ ์์ผ๋๊น ์คํ ์์ฒด๊ฐ ๋ถ๊ฐ๋ฅํด์ง๋ ๋ฌธ์ ๊ฐ ์๊ธด๋ค
๋ฐ๋ผ์ ์ฌ๋ฐ๋ฅธ ๊ตฌ์กฐ๋ OrderServiceImpl์ ์ธํฐํ์ด์ค๋ง ์๊ณ , ์ค์ ๊ตฌํ์ฒด ์ ํ์ ์ธ๋ถ(์คํ๋ง ์ปจํ
์ด๋)๊ฐ ํ๋๋ก ๋ถ๋ฆฌํด์ผ ํ๋ค!
2. AppConfig ๋ฆฌํฉํฐ๋ง
AppConfig๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์ ์ฒด ๋์ ๋ฐฉ์์ ๊ตฌ์ฑ(config) ํ๊ธฐ ์ํด ๋ง๋ ์ค์ ํด๋์ค
- ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ
- ์์ฑ์๋ฅผ ํตํด ํ์ํ ์์กด๊ด๊ณ๋ฅผ ์ฃผ์ (์ฐ๊ฒฐ) ํ๋ ์ฑ ์์ ๊ฐ์ง
AppConfig๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์ค์ ๋์์ ํ์ํ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค
- MemberServiceImpl
- MemoryMemberRepository
- OrderServiceImpl
- FixDiscountPolicy
public class AppConfig {
public MemberService memberService() {
// MemoryMemberRepository ๊ฐ์ฒด ์์ฑ → MemberServiceImpl์ ์ฃผ์
return new MemberServiceImpl(new MemoryMemberRepository());
}
public OrderService orderService() {
// MemoryMemberRepository์ FixDiscountPolicy๋ฅผ ์์ฑํด์ OrderServiceImpl์ ์ฃผ์
return new OrderServiceImpl(
new MemoryMemberRepository(),
new FixDiscountPolicy());
}
}
ํ์ฌ ์ค๋ณต์ ์ ๊ฑฐํ๊ณ , ์ญํ ์ ๋ฐ๋ฅธ ๊ตฌํ์ด ๋ณด์ด๋๋ก ๋ฆฌํฉํ ๋ง ํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
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() ์ค๋ณต์ ๊ฐ์ ํ ์ฝ๋์ด๋ค
public DiscountPolicy discountPolicy() {
// return new FixDiscountPolicy();
return new RateDiscountPolicy();
}
AppConfig์์ ํ ์ธ ์ ์ฑ
์ญํ ์ ๋ด๋นํ๋ ๊ตฌํ์ FixDiscountPolicy์์ RateDiscountPolicy ๊ฐ์ฒด๋ก ๋ณ๊ฒฝํ๋ค
ํ ์ธ ์ ์ฑ
์ด ๋ณ๊ฒฝํด๋ AppConfig๋ง ์์ ํ๋ฉด๋๊ณ ํด๋ผ์ด์ธํธ ์ฝ๋๋ ์์ ํ ํ์๊ฐ ์์ด์ง ๊ฒ์ด๋ค.
3. IoC, DI, ๊ทธ๋ฆฌ๊ณ ์ปจํ ์ด๋
์ ์ด์ ์ญ์ IoC(Inversion of Control)
์์ ์๋ ํด๋ผ์ด์ธํธ ์ฝ๋(์: OrderServiceImpl)๊ฐ ์ง์ ํ์ํ ๊ฐ์ฒด๋ฅผ new๋ก ๋ง๋ค๊ณ , ์ฐ๊ฒฐํ๊ณ , ์คํ๊น์ง ๋ด๋นํ๋ค. ์ฆ, ํ๋ก๊ทธ๋จ ์ ์ด ํ๋ฆ์ ๊ฐ๋ฐ์๊ฐ ์ง์ ์ฝ๋ ์์์ ์ ์ดํ๋ค.
=> ์์ฐ์ค๋ฝ์ง๋ง, ํด๋ผ์ด์ธํธ ์ฝ๋๊ฐ ๊ตฌ์ฒด ๊ตฌํ์ฒด์ ๋ฑ ๋ฌ๋ผ๋ถ๊ฒ ๋์ด ํ์ฅ์ฑ์ด ์ค์ด๋ค๊ณ , ์ ์ง๋ณด์์ ์์ด์ ํ๋ค๋ค.
OrderServiceImpl orderService = new OrderServiceImpl(new MemoryMemberRepository(),
new FixDiscountPolicy());
IoC ์ ์ฉ (์ ์ด๊ถ ์ธ๋ถ๋ก ์์)
์๊น์ ๊ฐ์ ๋จ์ ์ผ๋ก ์ด์ AppConfig๊ฐ ๊ฐ์ฒด ์์ฑ & ์ฐ๊ฒฐ ์ ์ด๋ฅผ ๋ด๋นํ๋ค. OrderServiceImpl์ ์ค์ง ๋ณธ์ธ์ ๋น์ฆ๋์ค ๋ก์ง๋ง ์ํํ๋ค.
=> ๋ฐ๋ผ์ ์ด๋ค ๊ฐ์ฒด๊ฐ ์ฃผ์
๋ ์ง๋ AppConfig๊ฐ ๊ฒฐ์ ํ๊ณ ๊ด๋ฆฌ → ์ ์ด์ ํ๋ฆ์ด ์ญ์ ๋จ(IoC)
public OrderService orderService() {
return new OrderServiceImpl(memberRepository(), discountPolicy());
}
ํ๋ ์์ํฌ vs ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- ํ๋ ์์ํฌ: ๋ด๊ฐ ์์ฑํ ์ฝ๋๋ฅผ ํ๋ ์์ํฌ๊ฐ ์ ์ดํ๊ณ ์คํ (์: JUnit)
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ: ๋ด๊ฐ ์์ฑํ ์ฝ๋๊ฐ ์ง์ ์ ์ด (์: Java ์ ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ)
์์กด๊ด๊ณ ์ฃผ์ DI(Dependency Injection)
OrderServiceImpl์ DiscountPolicy ์ธํฐํ์ด์ค์๋ง ์์กดํ๋ค. ํ์ง๋ง ์ค์ ๋ก ์ด๋ค ๊ตฌํ์ฒด(FixDiscountPolicy, RateDiscountPolicy)๊ฐ ๋ค์ด์ฌ์ง๋ ๋ชจ๋ฅธ๋ค.
=> ์ด ๊ตฌํ์ฒด ์ ํ/์ฃผ์
์ ์ธ๋ถ(AppConfig, ์คํ๋ง ์ปจํ
์ด๋)๊ฐ ๋์ ํด์ฃผ๋ ๊ฒ์ด DI
์ ํ๋ฆฌ์ผ์ด์
์คํ ์์ (๋ฐํ์) ์ ์ธ๋ถ์์ ์ค์ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ํด๋ผ์ด์ธํธ์ ์ ๋ฌํด์ ํด๋ผ์ด์ธํธ์ ์๋ฒ์ ์ค์ ์์กด๊ด๊ณ๊ฐ ์ฐ๊ฒฐ ๋๋ ๊ฒ์ ์์กด๊ด๊ณ ์ฃผ์
์ด๋ผ ํ๋ค
=> ์ฆ FixDiscountPolicy๋ RateDiscountPolicy์ธ๊ฐ๋ AppConfig/์คํ๋ง ์ค์ ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค.
โญ์ ์ ์์กด๊ด๊ณ vs ๋์ ์์กด ๊ด๊ณ
- ์ ์ ์์กด๊ด๊ณ: ์ฝ๋(import)๋ง ๋ณด๊ณ ์ ์ ์์
- ๋์ ์์กด๊ด๊ณ: ์คํ ์์ ์ ์ค์ ์ด๋ค ๊ตฌํ์ฒด๊ฐ ๋ค์ด์ฌ์ง ๊ฒฐ์ ๋จ
IoC ์ปจํ
์ด๋
- ๊ธฐ์กด์๋ ๊ฐ๋ฐ์๊ฐ ์ง์ ๊ฐ์ฒด๋ฅผ new ํด์ ๊ด๋ฆฌํ๋ค
- ์ด์ ๋ ์ปจํ ์ด๋(์: AppConfig)๊ฐ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํ๋ค
- ์ ์ด์ ํ๋ฆ์ ๊ฐ๋ฐ์๊ฐ ์๋ ์ธ๋ถ(์ปจํ ์ด๋)๊ฐ ๋ด๋น → IoC ์์น์ ๊ตฌํํ๋ ๊ฒ
DI ์ปจํ
์ด๋
- IoC ์ปจํ ์ด๋์ ์ญํ ์ค ํนํ ์์กด๊ด๊ณ ์ฃผ์ (DI)์ ์ด์ ์ ๋ง์ถ ์ด๋ฆ
- ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ฟ ์๋๋ผ, ๋๊ฐ ๋๊ตฌ๋ฅผ ์ฐธ์กฐํ ์ง(์ฐ๊ฒฐ)๊น์ง ๊ด๋ฆฌ
- ์์ฆ์ IoC๋ผ๋ ๋ง๋ณด๋ค DI๋ผ๋ ์ฉ์ด๊ฐ ๋ ์์ฃผ ์ฐ์