์ธํ๋ฐ ์คํ๋ง ํต์ฌ ์๋ฆฌ ๊ธฐ๋ณธํธ์ ์ ๋ฆฌํ ๊ธ์ ๋๋ค.
๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository = new MemoryMemberRepository;
private final DiscountPolicy discountPolicy = new FixDiscountPolicy(); //DIP ์๋ฐ
private final DiscountPolicy discountPolicy = new RateDiscountPolicy(); //DIP ์๋ฐ
@Override
public Order createOrder(Long memberId, String itemName, int itemPrice) {...}
}
A๋ฐฐ์ญ(์ธํฐํ์ด์ค)์ ํ๋ ๋ฐฐ์ฐ(๊ตฌํ์ฒด)๊ฐ B๋ฐฐ์ญ(์ธํฐํ์ด์ค)์ ํ๋ ๋ฐฐ์ฐ(๊ตฌํ์ฒด)๋ฅผ ์ง์ ์บ์คํ ํ๋ ๊ฒ๊ณผ ๊ฐ๋ค → ๋ค์ํ ์ฑ ์
๋ฐฐ์ฐ๋ ๋ณธ์ธ ์ญํ ์ ๋ฐฐ์ญ์ ์ํํ๋ ๊ฒ์๋ง ์ง์ค! ์๋ ๋ฐฐ์ฐ๊ฐ ๋๊ฐ ์ค๋ ๋ณธ์ธ ๋ฐฐ์ญ์๋ง ์ง์ค!
์ญํ ์ ๋ง๋ ๋ฐฐ์ฐ๋ฅผ ์บ์คํ ํ๋ ๊ฒ์ ๊ณต์ฐ ๊ธฐํ์(AppConfig)์ ๋ชซ!
AppConfig
//๊ธฐ์กด ์ฝ๋ : DIP ์๋ฐ
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository = new MemoryMemberRepository;
private final DiscountPolicy discountPolicy = new FixDiscountPolicy(); //DIP ์๋ฐ
private final DiscountPolicy discountPolicy = new RateDiscountPolicy(); //DIP ์๋ฐ
@Override
public Order createOrder(Long memberId, String itemName, int itemPrice) {...}
}
//๋ณ๊ฒฝ๋ ์ฝ๋ : ์์ฑ์๋ฅผ ํตํด ๊ตฌํ์ฒด ๊ฒ์ → ์ ํ๋ ๊ตฌํ์ฒด๋ฅผ ๋ชจ๋ฅด๊ฒ ํด๋ผ!
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy; //์ธํฐํ์ด์ค์๋ง ์์กด(BUT NPE(null pointer exception) ๋ฐ์ → ์์ฑ์ ์์ฑ, AppConfig)
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
@Override
public Order createOrder(Long memberId, String itemName, int itemPrice) {...}
}
public class AppConfig {
public OrderService orderService() {
//์์ฑ์๋ฅผ ํตํด ์ฃผ์
(์ฐ๊ฒฐ)
//OrderServiceImpl์ MemoryMemberRepository, FixDiscountPolicy๋ฅผ ์ฌ์ฉํ ๊ฑฐ์ผ!
return new OrderServiceImpl(new MemoryMemberRepository(), new FixDiscountPolicy());
}
}
public class OrderApp {
public static void main(String[] args) {
AppConfig appConfig = new AppConfig();
MemberService memberService = appConfig.memberService();
OrderService orderService = appConfig.orderService();
...
}
}
AppConfig ๋ฆฌํฉํ ๋ง
//์ญํ ์ ๋ฐ๋ฅธ ๊ตฌํ์ด ์ ๋ณด์ด๊ฒ ๋ฆฌํฉํ ๋ง
public class AppConfig {
public OrderService orderService() {
return new OrderServiceImpl(memberRepository(), discountPolicy());
}
private MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
private DiscountPolicy discountPolicy() {
return new FixDiscountPolicy();
}
}
์ ์ด์ ์ญ์ IoC (Inversion of Control)
ํ๋ก๊ทธ๋จ์ ์ ์ด ํ๋ฆ์ ์ง์ ์ ์ดํ๋ ๊ฒ์ด ์๋๋ผ ์ธ๋ถ์์ ๊ด๋ฆฌํ๋ ๊ฒ
ํ๋ ์์ํฌ vs ๋ผ์ด๋ธ๋ฌ๋ฆฌ
ํ๋ ์์ํฌ : ๋ด๊ฐ ์์ฑํ ์ฝ๋๋ฅผ ์ ์ดํ๊ณ , ๋์ ์คํ
๋ผ์ด๋ธ๋ฌ๋ฆฌ : ๋ด๊ฐ ์์ฑํ ์ฝ๋๊ฐ ์ง์ ์ ์ด์ ํ๋ฆ์ ๋ด๋น
์์กด๊ด๊ณ ์ฃผ์ DI (Dependency Injection)
์์กด๊ด๊ณ๋ ์ ์ ์ธ ํด๋์ค ์์กด ๊ด๊ณ์ ์คํ ์์ ์ ๊ฒฐ์ ๋๋ ๋์ ์ธ ๊ฐ์ฒด(์ธ์คํด์ค) ์์กด ๊ด๊ณ๋ฅผ ๋ถ๋ฆฌํด์ ์๊ฐํด์ผ ํ๋ค
์ ์ ์ธ ํด๋์ค ์์กด ๊ด๊ณ
ํด๋์ค๊ฐ ์ฌ์ฉํ๋ import ์ฝ๋๋ง ๋ณด๊ณ ์์กด๊ด๊ณ๋ฅผ ์ฝ๊ฒ ํ๋จ ๊ฐ๋ฅ, ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ์ง ์์๋ ๋ถ์ ๊ฐ๋ฅ
๋์ ์ธ ๊ฐ์ฒด ์์กด ๊ด๊ณ
์ ํ๋ฆฌ์ผ์ด์ ์คํ ์์ (๋ฐํ์)์ ์ค์ ์์ฑ๋ ๊ฐ์ฒด ์ธ์คํด์ค์ ์ฐธ์กฐ๊ฐ ์ฐ๊ฒฐ๋ ์์กด ๊ด๊ณ
์์กด๊ด๊ณ ์ฃผ์ : ์ ํ๋ฆฌ์ผ์ด์ ์คํ ์์ (๋ฐํ์)์ ์ธ๋ถ์์ ์ค์ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ํด๋ผ์ด์ธํธ์ ์ ๋ฌํด์ ํด๋ผ์ด์ธํธ์ ์๋ฒ์ ์ค์ ์์กด๊ด๊ณ๊ฐ ์ฐ๊ฒฐ๋๋ ๊ฒ
์์กด๊ด๊ณ ์ฃผ์ ์ ์ฌ์ฉํ๋ฉด ์ ์ ์ธ ํด๋์ค ์์กด๊ด๊ณ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ , ๋์ ์ธ ๊ฐ์ฒด ์ธ์คํด์ค ์์กด๊ด๊ณ๋ฅผ ์ฝ๊ฒ ๋ณ๊ฒฝ ๊ฐ๋ฅ
AppConfig ์ฒ๋ผ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํ๋ฉด์ ์์กด๊ด๊ณ๋ฅผ ์ฐ๊ฒฐํด์ฃผ๋ ๊ฒ์ IoC ์ปจํ ์ด๋ ๋๋ DI ์ปจํ ์ด๋๋ผ ํ๋ค
'๐ Spring > Lecture' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ์คํ๋ง์ ๋น ์๋ช ์ฃผ๊ธฐ ์ฝ๋ฐฑ ์ง์ (2) | 2025.03.24 |
|---|---|
| Annotation ์ง์ ์์ฑ (0) | 2025.03.24 |
| ์กฐํ ๋น์ด 2๊ฐ ์ด์์ผ ๋ (0) | 2025.03.24 |
| ์์กด๊ด๊ณ ์ฃผ์ (0) | 2025.03.24 |
| ์คํ๋ง์ผ๋ก ์ ํํ๊ธฐ (0) | 2025.03.23 |
