Spring 공부
IoC, DI, 컨테이너
given_dragon
2022. 7. 6. 17:13
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;
}
@Override
public Order createOrder(Long memberId, String itemName, int itemPrice) {
Member member = memberRepository.findById(memberId);
int discountPrice = discountPolicy.discount(member, itemPrice);
return new Order(memberId, itemName, itemPrice, discountPrice);
}
}
제어의 역전 IoC(Inversion of Control)
- 프로그램의 제어 흐름을 직접 하는 것이 아니라 외부에서 관리하는 것.
- 이 전에 포스팅한 OrderServiceImpl의 초반 코드는 구현 객체가 스스로 필요한 구현체들을 생성하고 사용했다. 하지만 이후의 OrderServiceImpl은 필요한 인터페이스만 호출하고 자신의 로직에만 집중한다. 외부의 AppConfig가 그 인터페이스에 대한 구현체를 주입해준다.
의존관계 주입 DI(Dependency Injection)
- 정적인 클래스 의존 관계, 싱행시점에 결정되는 동적인 객체(인스턴스) 의존관계 둘을 분리하여 생각
- 정적인 클래스 의존관계
- 정적 관계는 애플리케이션을 실행하지 않아도 분석할 수 있다.
- OrderServiceImpl은 MemberRepository와 DiscountPolicy에 의존 → 정적 의존 관계
- 하지만 이런 의존관계만으로는 어떤 객체가 OrderServiceImpl에 주입될지 알 수 없음 → 동적 의존 관계
- 동적인 객체 인스턴스 의존 관계
- 애플리케이션 실행 시점에 생성되어야 알 수 있다.
- 실행 시점에 외부에서 객체가 생성되고 클라이언트에 전달하여 연결 되는 것을 **의존관계 주입(DI)**이라 한다.
의존관계 주입을 사용하면 정적인 클래스 의존관계를 변경하지 않고 동적인 객체 인스턴스 의존관계를 쉽게 변경 가능하다. → 클라이언트 코드를 수정하지 않아도 된다.
DI 컨테이너(IoC 컨테이너)
- 외부에서 객체를 생성하고 관리하며 의존관계를 연결해준다.