IoC 컨테이너 계층 구조
스프링 어플리케이션은 최소한 하나 이상의 IoC 컨테이너는 가져야만 합니다.
모든 스프링 컨테이너는 계층 구조를 가질 수 있습니다. 즉 부모 컨테이너는 하나 이상의 자식 컨테이너를 가질 수 있습니다. 계층 구조 안에 있는 모든 컨텍스트는 각자 독립적인 설정 정보를 이용해 빈 오브젝트를 만들고 관리합니다. DI를 위해 빈을 찾을 때는 부모 어플리케이션 컨텍스트의 빈까지 모두 검색합니다. 부모 컨테이너에 등록된 빈은 자식 컨테이너에서도 사용할 수 있지만, 자식 컨테이너에 등록된 빈은 부모 컨테이너에서 사용할 수 없기 때문입니다.
먼저 자신이 관리하는 빈을 찾아보고 없다면 부모 컨텍스트에게 빈을 찾아달라고 요청하여 찾는다. 만약 부모 컨텍스트에 없으면 그 부모의 부모 컨텍스트에게 까지 요청을 하고 이렇게 루트 컨텍스트까지 요청이 전달된다.
정리하면 빈을 검색하면 자신에게서 먼저 찾고 그 다음 직계 부모 순서로 검색한다.
이런 방식으로 작동함으로 갖는 장점들은 다음과 같습니다.
1. 모듈화와 재사용성
계층 구조를 사용하면 애플리케이션을 여러 개의 모듈로 분리하여 개발할 수 있습니다. 각 모듈은 독립적인 자식 컨테이너를 가질 수 있고, 부모 컨테이너에 등록된 빈을 상속받아 사용할 수 있습니다. 이를 통해 모듈 간의 높은 재사용성과 모듈화된 구조를 유지할 수 있습니다.
2. 환경 분리와 설정 오버라이딩
부모 컨테이너와 자식 컨테이너 간에는 설정의 우선순위가 있습니다. 자식 컨테이너에서는 부모 컨테이너에 등록된 빈을 오버라이드할 수 있습니다. 이를 통해 다양한 환경(예: 개발, 테스트, 프로덕션)에 대한 설정을 구분하고 관리할 수 있습니다.
3. 컨테이너의 범위 지정
부모 컨테이너와 자식 컨테이너는 각각 독립된 스프링 컨테이너이기 때문에 자식 컨테이너는 부모 컨테이너의 빈을 참조할 수 있지만, 부모 컨테이너는 자식 컨테이너의 빈을 참조할 수 없습니다. 이를 통해 빈의 범위를 지정하고 관리할 수 있습니다.
스프링 컨테이너의 계층 구조는 주로 웹 애플리케이션에서 사용됩니다. 웹 애플리케이션의 전역적인 설정은 부모 컨테이너에서 관리하고, 각각의 요청 또는 세션마다 발생하는 동적인 빈은 자식 컨테이너에서 관리하는 것이 일반적입니다. 이를 통해 전역 설정과 동적인 요청 처리를 분리하여 관리할 수 있습니다.
웹(Web) 어플리케이션의 컨텍스트 계층 구조
웹 어플리케이션 컨텍스트 계층 구조의 일반적으로 다음과 같은 형태입니다.
Root 컨텍스트 (Root ApplicationContext)
- Root 컨텍스트는 웹 어플리케이션의 전역 설정을 담당하는 부모 컨텍스트입니다.
- 일반적으로 `ContextLoaderListener`를 통해 생성되고 초기화됩니다.
- Root 컨텍스트는 웹 어플리케이션의 생명주기와 무관하게 유지됩니다.
- Root 컨텍스트 역할
- 전역 설정 정보 관리 (예: 데이터베이스 연결 설정, 서비스 빈 등)
- 보안, 트랜잭션 관리와 같은 공통 기능의 설정
- 다중 웹 모듈 간의 빈 공유와 재사용성 확보
Web 컨텍스트 (WebApplicationContext)
- Web 컨텍스트는 웹 어플리케이션에서 동적인 요청과 관련된 설정을 담당하는 자식 컨텍스트입니다.
- 일반적으로 `DispatcherServlet`을 통해 생성되고 초기화됩니다.
- DispatcherServlet은 클라이언트로부터의 HTTP 요청을 받아 해당 요청을 처리하기 위해 적절한 핸들러(컨트롤러)를 호출하고, 뷰를 선택하여 응답을 생성합니다.
- Web 컨텍스트는 각각의 웹 요청마다 생성되고 해당 요청의 생명주기와 일치합니다.
- Web 컨텍스트의 역할
- 웹 관련 설정 정보 관리 (예: 컨트롤러 빈, 뷰 리졸버 등)
- 요청 단위로 생성되는 빈 관리
- 요청 스코프 빈 관리 (예: 사용자 세션에 대한 빈)
Root 컨텍스트와 Web 컨텍스트는 각각 독립적인 ApplicationContext입니다. Root 컨텍스트는 Web 컨텍스트에서 참조할 수 있지만, Web 컨텍스트는 Root 컨텍스트의 빈에 접근할 수 없습니다. 이렇게 구성된 계층 구조를 통해 전역 설정과 동적인 요청 처리를 분리하고 각각을 적절하게 관리할 수 있습니다.
Servlet WebApplicationContext (자식 컨텍스트)
- 각각의 서블릿(DispatcherServlet)마다 생성되는 컨텍스트입니다. 각 서블릿마다 별도의 컨텍스트를 가질 수 있으며, 서블릿마다 별개의 빈들을 관리합니다.
- Servlet은 웹 어플리케이션에서 HTTP 요청을 처리할 때 쓰이는 컴포넌트로, 주로 `DispatcherServlet`이 웹 어플리케이션의 진입점으로 사용됩니다.
예시) 하나의 웹 어플리케이션 내에 두 개의 스프링 서블릿이 존재하는 경우
서블릿 A와 B는 각각 자신의 전용 어플리케이션 컨텍스트를 갖고 있습니다. 동시에 두 컨텍스트가 공유해서 사용하는 빈을 담아놓을 수 있는 별도의 컨텍스트가 존재합니다. 이 컨텍스트는 각 서블릿에 존재하는 컨텍스트의 부모 컨텍스트이며, 최상단에 위치하므로 계층구조에서 볼 때 루트 컨텍스트입니다.
이렇게 함으로 자식 컨텍스트들의 공통적인 빈을 부모 컨텍스트로 두어 유연함과 편한 관리에 대한 용이함을 증가시켜주고 전체 어플리케이션에서 웹 기술에 의존적인 부분과 그렇지 않은 부분을 구분하여 구성할 수 있게 됩니다. 또한 언제든 간단히 웹 기술을 확장하거나 변경, 조합해서 사용할 수 있게 해줍니다.
💡DispatcherServlet
DispatcherServlet은 웹 어플리케이션의 진입점이자 중앙 제어 컨트롤러입니다.
DispatcherServlet은 클라이언트로부터의 HTTP 요청을 받아 해당 요청을 처리하기 위해 적절한 핸들러(컨트롤러)를 호출하고, 뷰를 선택하여 응답을 생성합니다.
DispatcherServlet은 웹 컨텍스트를 생성하고 초기화하는 역할을 수행합니다. 이 때, DispatcherServlet은 WebApplicationContext를 생성하여 웹 관련 설정 정보를 활용합니다. DispatcherServlet은 웹 컨텍스트와 연결되어 요청 단위로 새로운 WebApplicationContext를 생성하고 관리합니다. 이를 통해 요청 스코프 빈을 관리하고, 해당 요청에 특화된 빈 설정을 적용할 수 있습니다.
DispatcherServlet은 다양한 기능을 제공하기 위해 다음 기능을 사용하고 요청 처리합니다.
- 핸들러 매핑(Handler Mapping)
- 핸들러 어댑터(Handler Adapter)
- 뷰 리졸버(View Resolver) 등
WebApplicationContext는 DispatcherServlet의 초기화에 사용되며, DispatcherServlet은 WebApplicationContext를 생성하고 관리하여 웹 어플리케이션의 동적인 요청 처리를 담당합니다.
'Spring Framework' 카테고리의 다른 글
Spring @Autowried: 의존 관계 자동 주입 (0) | 2022.08.21 |
---|---|
Spring 빈(Bean) 등록 방법 ( XML, Annotation, Java 설정 클래스 ) (0) | 2022.08.20 |
Spring 스프링 컨테이너(IoC 컨테이너)와 빈(Bean) (0) | 2022.08.20 |
Spring 스프링의 핵심 이해: IoC/DI, AOP, PSA (0) | 2022.08.17 |
Spring 스프링이란? ( + POJO ) (0) | 2022.08.17 |