해당 포스팅은 김영한 님의 인프런 강의 "스프링 핵심 원리 - 기본편" 을 통해 얻은 지식을 정리한 자료 입니다.
[참고 자료]
IoC (제어의 역전 ; Inversion of Control)
클라이언트 구현 객체가 직접 필요한 서버 구현 객체를 생성, 연결, 실행함
(구현 객체가 프로그램의 제어 흐름을 조절)
▼
AppConfig 의 등장!
(AppConfig 에서 필요한 구현 객체를 주입해줌.)
▼
구현 객체는 자신의 로직을 실행하는 역할만 담당
(OrderServiceImpl은 필요한 인터페이스를 호출하지만, 어떤 구현 객체가 실행되는지 알지 못함. AppConfig가 주입해준 것을 그대로 사용.)
=> 프로그램의 제어 흐름 권한을 AppConfig가 가지고 있다.
* 프로그램의 제어 흐름을 직접 제어하는 것이 아니라 외부에서 관리하는 것 = "제어의 역전 (IoC)"
DI (의존관계 주입 ; Dependency Injection)
"의존관계"는 2가지로 나뉨
1. 정적인 클래스 의존관계
: 'import' 를 통해 파일 내에서 서로서로를 참고하는 관계
2. 동적인 객체 인스턴스 의존관계
: 애플리케이션 실행 시점에 실제 생성된 객체 인스턴스의 참조가 연결된 의존 관계
" 애플리케이션 실행 시점에 외부에서 실제 구현 객체를 생성하고 클라이언트에 전달해서 클라이언트와 서버의 실제 의존관계가 연결 되는 것을 '의존관계 주입' 이라 한다. "
애플리케이션 실행 시점에 : RunTime
외부에서 실제 구현 객체를 생성하고 : AppConfig 에서 OrderServiceImpI을 생성(매개변수도 주입)
클라이언트에 전달해서 클라이언트와 서버의 실제 의존관계가 연결되는 것
: 클라이언트 (OrderApp) 에 전달해서 클라이언트와 서버의 실제 의존관계가 연결되는 것
<AppConfig 통해 연결된 의존관계>
[클라이언트의 OrderService] - [AppConfig를 통해 주입된 구현객체] - [서버]
객체 인스턴스를 생성하고, 그 참조값을 전달하여 연결된다.
의존관계 주입을 이용하는 이유
1. 클라이언트 코드를 변경하지 않고, 클라이언트가 호출하는 대상의 타입 인스턴스를 변경하기 위함.
2. 정적인 클래스의 의존관계를 변경하지 않고, 동적인 객체의 인스턴스 의존관계를 쉽게 변경할 수 있음.
Container
AppConfig 처럼 객체를 생성하고 관리하면서 의존관계를 연결해 주는 것
=> IoC 컨테이너 / DI 컨테이너
애플리케이션 전체에 대한 흐름을 AppConfig에서 조립을 한다고 해서,
'어셈블러', '오브젝트 팩토리' 라고도 한다.
'Spring' 카테고리의 다른 글
[Spring] ComponentScan (컴포넌트 스캔) (0) | 2023.11.18 |
---|---|
[Spring] 싱글톤(Singleton) 과 스프링 컨테이너 (0) | 2023.11.12 |
[Spring] 스프링 빈 생성과정 / 스프링 빈 구성 정보 파일 지원 과정 (0) | 2023.11.10 |
[Spring] 스프링 빈 조회 테스트(이름 / 타입 / 중복 조회) (0) | 2023.11.07 |
[Spring] 순수 JAVA 코드에서 Spring으로 전환하기 (1) | 2023.11.06 |