김영한님의 스프링 핵심 원리 - 기본편 강의
24강 IoC, DI, 그리고 컨테이너를 듣고 작성했습니다.
제어의 역전 IoC (Inversion of Control)
프로그램의 제어 흐름을 직접 제어하는 것이 아니라 외부에서 관리하는 것이다.
ex.지금까지 실습한 예시 중 프로그램에 대한 제어 흐름 권한을 AppConfig가 가지고 있었다.
프레임 워크 vs 라이브러리
프레임워크: 내가 작성한 코드를 제어하고, 대신 실행하면 프레임워크 (JUnit)
라이브러리: 내가 작성한 코드가 직접 제어의 흐름을 담당한다면 그것은 프레임워크가 아니라 라이브러리
ex. 자바 객체를 xml or json으로 바꿈. 라이브러리 불러다가 직접 호출.
의존관계 주입 DI (Dependency Injection)
정적인 클래스 의존관계
- import 코드만 보고 의존관계 쉽게 파악할 수 있다.
- 애플리케이션을 실행하지 않고도 분석할 수 있다.
- inteliij 내에서 Diagram 으로 확인 가능하다.
- 클래스 의존관계만으로도 실제 어떤 객체가 주입되는지 알 수 없다.
private final MemberRepository memberRepository;
public MemberServiceImpl(MemberRepository memberRepository) {
this.memberRepository = memberRepository; # 뭐가 주입되는지 알 수 없음
}
}
실행 시점에 결정되는 동적인 객체 의존관계
애플리케이션 실행 시점에 외부에서 실제 구현 객체를 생성하고 클라이언트에 전달해서 클라이언트와 서버의 실제 의존관계가 열결되는 것을 의존 관계 주입한다.
의존 관계 주입을 사용하면
- 클라이언트 코드를 변경하지 않고, 클라이언트가 호출하는 대상의 타입 인스턴스를 변경 가능
- 정적인 클래스 의존관계를 변경하지 않고, 동적인 객체 인스턴스 타입 변경 가능 (메모리 저장소 / 외부 저장소)
IoC 컨테이너, DI 컨테이너
- AppCofig처럼 객체를 생성하고 관리하면서 의존관계를 연결해 주는 것
- 최근에는 주로 DI컨테이너라고 한다.
- 어샘블러, 오브젝트 팩토리라고도 함 (애플리케이션에 대한 전체 조립한다고 해서)
'Study > 인프런' 카테고리의 다른 글
Spring Container에 등록된 모든 빈(Bean) 조회하기 (0) | 2023.01.24 |
---|---|
스프링 컨테이너(Spring Container)의 배경 (0) | 2023.01.24 |
관심사의 분리 - DIP 지키기 (0) | 2023.01.01 |
OCP와 DIP를 지키기 위한 발걸음 (0) | 2023.01.01 |
좋은 객체 지향 설계의 5가지 원칙 (SOLID) (0) | 2022.12.23 |