Go, Vantage point
가까운 곳을 걷지 않고 서는 먼 곳을 갈 수 없다.
Github | https://github.com/overnew/
Blog | https://everenew.tistory.com/
티스토리 뷰
* 김영한님의 스프링 핵심원리 기본편 강좌를 수강하며 정리한 글입니다. *
이전 글에서는 DI로 구성영역과 사용영역을 분리하였다.
제어의 역전, Ioc(Inversion of Control)
제어의 역전은 구현 객체가 직접 코드를 호출하는 것(스스로 프로그램의 코드를 제어)이 아니라, 이전 글의 AppConfig 처럼 프레임 워크와 같이 외부에서 코드를 대신 호출, 관리해 주는 것을 의미한다. 말 그대로 제어 권이 넘어가기 때문에 제어의 역전 (Inversion of Control) 이라고 한다.
사실 단순히 책으로 프로그래밍 언어를 배웠던 나를 포함한 대부분의 개발자에게는 구현 객체가 직접 코드를 호출하는 것이 당연한 흐름일 것이다. 하지만 제어의 역전으로 구현 객체는 자신의 역할 수행만을 담당하게 된다. 이전 글에서 확인했듯이 객체의 생성과 같은 모든 제어를 AppConfig가 담당하게 된다.
제어의 역전은 라이브러리와 프레임워크의 구분 기준이 될수도 있다.
라이브러리는 보통 해당 라이브러리를 import하여 함수나 객체를 직접 호출해 사용한다.
하지남 프레임워크는 필요한 부분을 작성하면 프레임워크가 직접 이를 실행하여 코드의 제어권이 넘어가게된다.
동적 의존 관계, Dependency Injection
런타임 시점에서 외부에서 구현 객체를 생성하여 클라이언트에 전달하는 것, 일종의 서버와 클라이언트의 의존관계가 연결되는 것은 의존관계 주입(Dependency Injection, 동적으로 의존 관계 주입)이라고 한다.
이는 정적 의존관계와 다르다. 정적 의존관계는 클래스의 상속, import등의 관계만 보고도 파악이 가능한 의존 관계를 말한다.
동적 의존 관계에서는 제어의 역전을 통해 객체가 생성되고 참조값이 전달 된다.
따라서 어플리케이션의 정적 의존관계(클라이언트 코드)를 변경하지 않아도, 동적으로 주입할 의존 관계를 쉽게 변경이 가능하다. (이전 글에서 AppConfig로 쉽게 구현체를 바꾼 것과 동일하다.)
AppConfig는 제어의 역전과 의존 관계 주입을 담당한다. 사실 이 두가지 다른 역할을 한다기 보다는, 제어의 역전이 좀더 상위의 개념인 것으로 생각하면 쉽다.
DI 컨테이너
객체 생성과 관리, 의존 관계를 해주는 것을 DI 컨테이너라고 부른다.
따라서 AppConfig는 DI 컨테이너라 할 수 있다.
'개발 > Spring' 카테고리의 다른 글
[Spring] 6. 스프링 컨테이너 설정 정보와 BeanDefinition (0) | 2022.06.25 |
---|---|
[Spring] 5. 스프링 빈 조회, getBean() (0) | 2022.06.25 |
[Spring] 4. 스프링 컨테이너와 스프링 빈 (0) | 2022.06.23 |
[Spring] 2. 구성 영역의 분리와 DI(Dependency Injection) (0) | 2022.05.30 |
[Spring] 1. 스프링의 시작과 SOLID 원칙 (0) | 2022.05.09 |