1. IoC(Inversion of Control, 제어의 역전)

- 프로그램의 제어 흐름을 직접 제어하는 것이 아니라 외부에서 관리하는 것을 의미한다.

- 일반적으로는 개발자가 필요한 구현 객체를 직접 생성하고, 연결하고, 실행한다. 개발자가 직접 의존성을 만들기 때문에, 의존성에 대한 제어권을 가지고 있다고 볼 수 있다.

- 그러나 IoC가 일어나면, 개발자가 직접 의존성을 만드는 것이 아닌 외부에서 의존성을 주입 받게 된다. 이것을 DI(Dependency Injection)라고 한다.

//IoC 적용 전
public class UserService {
	private UserRepository userRepository = new UserRepository();
}

//IoC 적용 후
public class UserService {
	private final UserRepository userRepository;
    
	public UserService(UserRepository userRepository) {
		this.userRepository = userRepository;
	}
}

 

2. DI(Dependency Injection, 의존관계 주입)

- 애플리케이션 실행 시점(런타임)에 외부에서 실제 구현 객체를 생성하고, 이를 전달 받아 의존관계가 연결 되는 것을 의미한다.

 

3. Bean

- 스프링 컨테이너가 관리하는 객체를 의미한다. 컨테이너 밖에 존재하는 객체는 bean이 아니다.

 

4. 스프링 컨테이너(IoC container, DI container)

- 객체를 만들어 bean으로 등록해 주고, 등록한 bean들의 의존성을 관리해준다.

- 싱글톤 패턴을 따로 적용하지 않아도 객체 인스턴스를 싱글톤으로 관리한다. 컨테이너에 빈을 등록할 때 해당 객체를 유일하게 하나만 등록해서 관리하는 것이다. 따라서 같은 스프링 빈이면 모두 같은 인스턴스라고 볼 수 있다.

- ApplicationContext 인터페이스를 스프링 컨테이너라고 한다.

- ApplicationContext에 기능을 상속하는 BeanFactory도 스프링 컨테이너로 불린다.

 

4.1 스프링 컨테이너 생성 과정

① 스프링 컨테이너 생성

비어있는 스프링 컨테이너가 생성된다.

② 스프링 빈 등록

스프링 설정 파일을 기반으로 컨테이너에 스프링 빈이 등록된다.

③ 스프링 빈 의존관계 설정

스프링 설정 파일을 기반으로 스프링 빈의 의존관계를 주입한다. 여기서 DI가 이루어진다.

 

4.2 BeanFactory와 ApplicationContext

 

BeanFactory를 상속받는 ApplicationContext는 수 많은 부가기능을 갖고 있다.

종류 설명
BeanFactory - 스프링 컨테이너의 최상위 인터페이스이다.
- 스프링 빈을 관리하고 조회하는 역할을 담당한다.
ApplicationContext - BeanFactory 기능을 모두 상속받아서 제공한다.
- BeanFactory가 제공하는 기능 뿐만 아니라, 수 많은 부가기능을 제공한다.
- BeanFactory를 직접 사용할 일은 거의 없고, 대부분 부가기능이 포함된 ApplicationContext를 사용한다.

 

참고

- https://chanhuiseok.github.io/posts/spring-4/

- https://dev-aiden.com/spring/Spring-Container/

- 『스프링 핵심 원리 - 기본편』