스프링을 공부하면 처음 접하는 용어들이 있다. 컨테이너, IoC, DI 등 용어들에 대해서 간단하게 다뤄보자.
IoC(Inversion of Control)란?
IoC는 Inversion of Control의 줄임 말로, 제어의 역전이라는 뜻이다. 프로그램의 흐름을 개발자가 제어하지 않고, 프로그램이나 프레임웤이 직접 제어를 한다는 말이다. 컴포넌트의 의존 관계 결정(Component dependency resolution), 객체의 생명 주기(life cycle)와 같은 일을 대신 수행해준다.
흔히 스프링 프레임웤을 이용해서 개발할 때 여러가지 Bean을 사용 할 것이다. 사용자의 요청이 들어오면, 요청에 알맞은 Bean을 생성해서 필요한 일을 하도록 시킨다. 해당 Bean이 할 일을 마치면 Bean을 삭제해준다. 하지만 이런 객체의 생성과 소멸이 어떻게 이루어지는지 알 필요가 없다. 프로그래머가 직접 제어 할 필요가 없이 프레임웤이 직접 제어해주기 때문이다. 이것이 IoC 제어의 역전이다.
컨테이너란?
컨테이너 혹은 IoC컨테이너라고 부른다. 컨테이너는 코드의 처리 과정을 위임 받은 독립적인 존재이다.
적절한 설정을 해주면, 프로그래머가 작성한 코드를 스스로 참조한 뒤 알아서 객체의 생성과 소멸(객체의 생애 주기)을 관리한다.
DI(Dependency Injection)란?
DI는 Dependency Injection의 줄임 말로, 의존성 주입이라는 뜻이다. 각 클래스의 의존 관계를 Bean 설정 정보를 바탕으로 컨테이너가 자동으로 주입 해준다.
DI는 IoC 프로그래밍 모델을 구현하는 방식 중 하나 이다.
IoC가 범용적인 의미이기 때문에 스프링이 제공하는 기능의 특징을 명확하게 설명하지 못한다. 그렇기 때문에 스프링이 제공하는 IoC방식의 핵심을 표현하기 위해 의존성 주입(Dependency Injection)이라는 용어를 사용하기 시작했다. (DI가 스프링에서 시작된 개념은 아니다)
DI의 핵심은 외부에서 주입되는 다이나믹한(동적인) 의존 관계 이다. 스프링 DI의 3가지 조건은 아래와 같다.
- 클래스 모델이나 코드에는 의존 관계가 드러나지 않는다.
- 런타임 시점의 의존 관계는 컨테이너나 팩토리 같은 존재가 결정한다.
- 의존 관계는 사용 할 오브젝트에 대한 레퍼런스를 외부에서 제공(주입) 해 줌으로써 만들어진다.
클래스 간에 의존 관계는 런타임 환경에서 동적으로 결정된다. 그렇기 때문에 유연한 코드로 인해 개발에 어려움이 적다.
참조
'Spring' 카테고리의 다른 글
스프링 트랜잭션 전파 속성(Transaction Propagation in Spring) (0) | 2021.05.19 |
---|