1. 제어의 역전 IoC(Inversion of Control)
프로그램의 제어 흐름을 직접 제어하는 것이 아니라 외부에서 관리하는 것
- AppConfig가 등장한 이후에 구현 객체는 자신의 로직을 실행하는 역할만 담당한다. OrderServiceImpl은 필요한 인터페이스들을 호출하지만 어떤 구현 객체들이 실행될지 모른다.
- 프로그램에 대한 제어 흐름에 대한 권한은 모두 AppConfig가 가지고 있다.
2. 의존관계 주입 DI(Dependency Injection)
애플리케이션 실행 시점에 필요한 객체들의 인스턴스를 생성하고 클라이언트에 전달하여 서버와 클라이언트를 연결하는 것
(1) 정적인 클래스 의존관계
실행 이전에 코드상으로의 의존 관계
- 클래스가 사용하는 import 코드만 보고 의존관계를 쉽게 판단할 수 있다.
- 이미 정해진 객체들을 참조한다.
package hello.core.order;
import hello.core.discount.DiscountPolicy;
import hello.core.member.Member;
import hello.core.member.MemberRepository;
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);
}
}
OrderServiceImpl 클래스는 MemberRepository, DiscountPolicy 인터페이스에 정적으로 의존하고 있다.
(2) 동적인 객체 인스턴스 의존관계
애플리케이션 실행 시점에 실제 생성된 객체 인스턴스의 참조가 연결된 의존 관계
- 다른 객체의 참조값만 만들고 있다가, 애플리케이션이 실제 실행될 때 인스턴스 값을 넘기는 방식이다.
- 실제 구현체는 AppConfig라는 외부 객체에 의해 실행 전에 결정된다.
3. IoC 컨테이너, DI 컨테이너
객체를 생성하고 관리하면서 의존관계를 연결해 주는 컨테이너
- AppConfig와 같은 역할을 하는 것을 IoC 컨테이너 또는 DI 컨테이너라 한다.
- 의존관계 주입에 초점을 맞추어 최근에는 주로 DI 컨테이너라 한다.
- 또는 어샘블러, 오브젝트 팩토리 등으로 불리기도 한다.
본 글은 김영한 님의 "스프링 핵심 원리"(인프런) 유료 강의를 들으며 요약, 정리하고 일부 정보를 추가 작성한 것입니다.
저작권 문제시 903yh@naver.com으로 연락 주시면 삭제하겠습니다.
반응형
'Spring(JAVA Framework) > Spring Core' 카테고리의 다른 글
스프링 빈 조회 (0) | 2021.08.17 |
---|---|
스프링 컨테이너와 생성과정 (0) | 2021.08.16 |
스프링 핵심 원리 이해3 (0) | 2021.08.15 |
스프링 핵심 원리 이해2 (0) | 2021.08.15 |
스프링 핵심 원리 이해1 (0) | 2021.08.14 |
댓글