IoC컨테이너 계층구조
빈의 개수가 많아져서 설정파일이 커지는게 문제라면 파일을 여러개로 쪼개서 만들고 하나의 애플리케이션 컨텍스트가 여러 개의 설정파일을 사용하게하면 그만이다. 하지만 한 개 이상의 IoC컨테이너를 만들어두고 사용해야 할 경우가 있다. 바로 트리 모양의 계층구조를 만들때다.
부모컨텍스트를 이용한 계층구조 효과
모든 애플리케이션 컨텍스트는 부모 애플리케이션 컨텍스트를 가질 수 있다.
모든 컨텍스트는 각자 독립적인 설정정보를 이용해 빈 오브젝트를 만들고 관리
독립적으로 자신이 관리하는 빈을 갖고 있지만, DI를 위해 빈을 찾을 때는 부모 애플리케이션 컨텍스트의 빈까지 모두 검색
(필요한 빈을 찾고 없으면 부모 컨텍스트에게 빈을 찾아달라고 요청. 없으면 부모의 부모.. 루트 컨텍스트까지 전달)
중요한 건 자신의 부모 컨텍스트에게만 빈 검색을 요청하지 자식 컨텍스트에게는 요청하지 않는다는 점(형제 컨텍스트의 빈도 찾을 수없다.)
검색순서
자기자신 => 직계부모
계층구조를 이용하는 이유
여러 애플리케이션 컨텍스트가 공유하는 설정을 만들기 위해서 사용한다.
여러 개의 웹 모듈이 공유해서 사용하도록 구성하는 방식을 많이 사용(엔터프라이즈 애플리케이션)
각자 용도와 성격이 달라서 웹 모듈을 여러 개로 분리하긴 했지만 핵심 로직을 담은 코드는 공유하고 싶을 때 이런식으로 구성. 마찬가지로 애플리케이션 안에 성격이 다른 설정을 분리해서 두 개 이상의 컨텍스트를 구성하면서 각 컨텍스트가 공유하고 싶은게 있을 때 계층구조를 이용한다.
(자신의 애플리케이션이 어떻게 만들어지고, 어느 것이 루트이고 어느것이 자식인지 분명하게 알아야 한다.)
AOP처럼 컨텍스트 안의 많은 빈에 일괄적으로 적용되는 기능은 대부분 해당 컨텍스트로 제한된다는 점도 주의!! 때론 의도적으로 부모 컨텍스트를 무시하고 현재 컨텍스트에서만 원하는 빈을 찾는 기능도 있다.
기본적으로 스프링 웹 애플리케이션은 부모/자식 관계를 가진 두 개의 애플리케이션 컨텍스트로 구성된 계층구조로 만들어진다.
웹 애플리케이션의 IoC 컨테이너 구성
웹 애플리케이션 안에 WebApplicationContext 타입의 IoC컨테이너를 두는 방법
=> 예전에는 url당 서블릿 하나 였지만, 몇 개의 서블릿이 중앙집중식으로 모든 요청을 다 받아서 처리하는 방식(프론트 컨트롤러 패턴)으로 변했다. 스프링도 프론트 컨트롤러 패턴을 사용한다. (dispatcherServlet)
웹 애플리케이션 안에서 동작하는 IoC컨테이너는 두 가지 방법으로 만들어진다.
하나는 스프링 애플리케이션의 요청을 처리하는 서블릿 안에서 만들어지는 것이고, 다른 하나는 웹 애플리케이션 레벨에서 만들어지는 것이다.
스프링 웹 애플리케이션에서는 두개의 컨테이너, 즉 WebApplicationContext 오브젝트가 만들어진다. 스프링 애플리케이션의 진입창구 역할을 하는 프론트 컨트롤러 서블릿이 한 개 이상 등록된다면, 그만큼 전체 컨테이너 개수는 더 늘어날 것이다.
웹 애플리케이션의 컨텍스트 계층구조
웹 애플리케이션 레벨에 등록되는 컨테이너는 보통 루트 웹 애플리케이션 컨텍스트라고 불린다.
이 컨텍스트는 서블릿 레벨에 등록되는 컨테이너들의 부모 컨테이너가 되고, 일반적으로 전체 계층구조 내에서 가장 최상단에 위치한 루트 컨텍스트가 된다.
웹 애플리케이션에는 하나 이상의 프론트 컨트롤러 역할을 하는 서블릿이 등록될 수 있다. 이 서블릿에는 각각 독립적으로 애플리케이션이 만들어진다.
이런 경우 각 서블릿이 공유하게 되는 공통적인 빈들이 있을 것이고, 이런 빈들을 웹 애플리케이션 레벨의 컨텍스트에 등록하면 된다. (공통되는 빈들이 서블릿 별로 중복되서 생성되는 걸 방지할 수 있다.)
Spring sts를 사용하여 Spring MVC Project를 만들면 생성되는 application-context.xml 은 서블릿 레벨의 컨텍스트, root-context.xml은 루트 웹 애플리케이션 컨텍스트라고 보면된다.
대부분의 스프링 웹애플리케이션은 웹 기술에 의존적인 부분과 그렇지 않은 부분을 구분하기 위해서 이런 계층구조를 사용한다.
데이터엑세스 계층이나 서비스 계층은 스프링 기술을 사용하고 스프링 빈으로 만들지만
웹을 담당하는 프레젠테이션 계층은 스프링 외의 기술을 사용하는 경우도 종종있기 때문에 사용
- 서블릿의 컨텍스트는 빈은 루트 애플리케이션 컨텍스트의 빈을 참조할 수 있지만 그 반대는 안된다.
- 또한 루트 컨텍스트에 정의된 빈은 이름이 같은 서블릿 컨텍스트의 빈이 존재하면 무시될 수있다.
- 하나의 컨텍스트에 정의된 AOP 설정은 다른 컨텍스트 빈에는 영향을 미치지 않는다.
'프로그래밍 노트 > SPRING' 카테고리의 다른 글
[Spring] IoC(InversionOfControl) 컨테이너 5 (빈 등록방법) (0) | 2018.08.27 |
---|---|
[Spring] IoC(InversionOfControl) 컨테이너 4 (0) | 2018.08.27 |
[Spring] IoC(InversionOfControl) 컨테이너 2 (0) | 2018.08.08 |
[Spring] IoC(InversionOfControl) 컨테이너 1 (0) | 2018.08.08 |
[Spring] 스프링프레임워크의 특징 (0) | 2018.08.08 |