Container?
- Container은 Spring의 핵심이다.
- 스프링 컨테이너는 스프링에서 자바 객체들을 관리하는 공간을 말한다. 자바 객체를 스프링에서는 빈(Bean)이라고 한다.
Container는 개발자를 대신해서 Bean을 생성, 관리, 제거한다. Container가 Bean을 관리해주기 때문에, 개발자는 모듈간에 의존 및 결합으로 인해 발생하는 문제로 자유로워졌다.- 독립적인 코드를 작성해서 Annotation만 남겨주면, container가 개발자가 원하는 상황에 알아서 코드를 실행해준다. 따라서 개발자는 메서드가 언제, 어디서 호출돼야하는지 그리고 메서드를 호출하기 위해서 필요한 매개변수를 준비해서 전달하지 않아도 된다.
- 이렇게 container가 개발자를 대신하여 메서드가 호출될 때와 메서드가 필요한 자원을 전달하는 설계구조를
Inversion of Control(IoC)
라고 한다.- IoC는 메서드가 필요로 하는 자원을 코드가 실행되는 타임에 전달하는데, 이를
Dependency Injection(DI)
라고 한다.
예를 들어, Container가 알아서 greeting 메서드가 필요로하는 name 매개변수를 전달하는 과정과 run 메서드가 필요로하는 RestTemplate 매개변수를 전달하는 과정 모두 Dependency Injection(DI) 이다.
- DI는 Reflection이라는 기술을 기초로 구현돼있다.
Reflection이란, 런타임에 코드의 metaData를 읽는 기술이다. 특히 메서드의 signature를 읽을 수 있고, signature에는 메서드가 필요로하는 매개변수 정보가 있다.
DI는 reflection으로 얻은 코드데이터로 메서드가 필요로 하는 자원을 런타임에 제공한다.
컨테이너 종류
: 컨테이너는 크게 두 종류로 나눌 수 있다.
1. BeanFactory
2. ApplicationContext : BeanFactory의 기능을 포괄하면서 추가적인 기능을 제공하기 때문에 대부분의 경우 이것을 사용한다.
- (+ 이벤트 발행, 구독모델지원, 리소스 조회편의성 제공, 환경변수 구분, 국제화 를 지원해줌)
출처