Notice
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
01-09 04:37
Today
Total
관리 메뉴

그날그날 공부기록

IoC, DI, 컨테이너 본문

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 컨테이너)

  • 외부에서 객체를 생성하고 관리하며 의존관계를 연결해준다.

'Spring 공부' 카테고리의 다른 글

스프링 빈 조회  (0) 2022.07.11
스프링 컨테이너 생성 과정  (0) 2022.07.07
스프링 DI 이해하기  (0) 2022.07.05
SOLID  (0) 2022.07.05
스프링과 객체지향  (0) 2022.07.05
Comments