스프링 컨테이너란?
스프링에서 자바 객체들을 관리하는 공간
스프링 빈의 생성부터 소멸까지 관리해주는 곳
스프링 컨테이너의 생성 과정
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
- ApplicationContext를 스프링 컨테이너라고 지칭
- ApplicationContext는 인터페이스이다.
스프링 컨테이너는 XML기반과 어노테이션 기반으로 생성할 수 있다.
어노테이션 기반의 스프링 컨테이너를 사용하려면
ApplicationContext를 구현한 AnnotationConfigApplicationContext를 구현체로 사용한다.
그렇다면 생성자 파라미터로 들어간 Appconfig.class는 무엇일까?-
- 어플리케이션 실제 동작에 필요한 구현 객체를 생성하는 기능
- 또한 객체 인스턴스의 참조를 생성자를 통해서 주입해준다.
정리하자면, Appconfig.class는 구현체로 하여금 추상에만 의존하게 도와주며
DIP를 완성하는 기능을 수행한다.
다시 주제로 돌아와서 스프링 컨테이너의 생성과정을 살펴보자면
스프링 컨테이너 생성 - 스프링 빈 등록 - 의존 관계 설정 순으로 진행된다.
1. 스프링 컨테이너 생성

key를 빈 이름 value를 빈 객체로 하는 저장소를 생성한다.
스프링 컨테이너를 생성할 때는 구성 정보를 지정해야 하는데 이를 Appconfig.class가 수행한다.
2. 스프링 빈 등록

다음과 같이 스프링 컨테이너는 Appconfig.class를 활용하여
메서드 명을 빈 이름으로, 반환된 구현체를 빈 객체로 등록한다.
3. 의존관계 설정

다음과 같이 AppConfig의 설정 정보를 참고하여
스프링 컨테이너는 의존관계를 주입한다.
이상 스프링 컨테이너의 생성 과정과 빈이 어떻게 등록되는지 알아 보았다.
그런데 실제 프로젝트 안에서는 빈이 어떻게 등록되는걸까?

위에서 살펴본 AppConfig와 같은 클래스를 따로 만들어 주고 Bean 어노테이션을 활용하며
빈을 생성하진 않았는데도 빈을 조회하면 정삭적으로 등록된 것을 알 수 있다.

컨트롤러 어노테이션을 까보면 다음과 같이 되어있다.
주목해야 될 부분이 @Component 이부분인데
컴포넌트 어노테이션을 활용하면,
Appconfig.class와 같은 파일에 빈을 등록하지 않아도쓸수 있게 된다!
@Service, @Repository 어노테이션이 붙은 것 모두도 Component annotation이 붙어있다.
따라서 해당 어노테이션을 활용하면 굳이 설정파일에 빈을 등록하지 않아도
스프링이 자동으로 등록해주는 것이다.

설정 파일 없이 빈이 컨테이너에 등록이 어떻게 되는지 알겠는데,
빈들의 의존 관계 설정은 어떻게 자동으로 해주는 걸까?
의존 관계를 설정해주는 방법에는 크게 2가지가 있는데
하나는 Appconfig.class와 같이 Configuration을 활용하여 의존관계를 설정하는 방법과
다른 하나는 어노테이션을 활용하는 방법이 있다.
보통 @Autowired와 같은 어노테이션을 활용하여
의존관계를 설정해주게 되는데 해당 로직은 어떤 방식으로 작동되는 걸까?
BeanPostProcessor와 AutowiredAnnotationBeanPostProcessor
BeanPostProcessor는 빈의 초기화 이전과 이후에 필요한 부가 작업을 할 수 있는 라이프 사이클 콜백이다.
해당 부분에서 용어가 몇가지 정리가 안되서 찾아보았다.
콜백의 정의는 다음과 같다.
어떤 이벤트가 발생했거나 특정 시점에 도달했을 때 시스템에서 호출되는 함수
초기화의 뜻은 다음과 같다
객체를 선언하고 값을 '최초'로 할당하는 것
다시 말해 빈을 생성하고 그것을 실제 빈으로 최초 할당하기 이전에 필요한
부가작업을 할 수 있는 기능을 수행하는 것이 BeanPostProcessor이다
그리고 이를 구현한 구현체가 AutowiredAnnotationBeanPostProcessor이다.
그리고 해당 구현체는 빈의 초기화 이전에
@autowired 어노테이션이 붙어있는 빈들을 찾아 의존관계를 주입해주는 역할을 수행한다.
'Spring' 카테고리의 다른 글
DI 인젝션이 필요한 이유는? (0) | 2022.11.19 |
---|---|
스프링 시큐리티를 쓰는 이유는? (0) | 2022.11.09 |
스프링 mvc 동작 원리에 대하여 (0) | 2022.10.23 |
@Transactional 어노테이션 정리 (0) | 2022.05.27 |
서블릿과 JSP- 02 정리 (0) | 2022.03.09 |