Spring

[Spring] 두 개의 레이어로 나눈 2-Layered 아키텍처

bkuk 2023. 4. 29. 05:05

일반적으로 프레임워크 기반의 웹 프로젝트를 보면 아래와 같이 두 개의 레이어로 나누어 시스템을 개발한다.

이를 '2-Layered' 아키텍처 스타일이라고 한다.

 

ConextLoaderListener 등록

Listener는 Servlet이나 Filter 클래스와 마찬가지로 web.xml 파일에 등록한다. <listener> 태그 하위에 <listener-class 태그를 이용하여 스프링에서 제공하는 ContextLoaderListener 클래스를 등록하면 된다.

중요한 것은 ContextLoaderListener 클래스는 서블릿 컨테이너가 web.xml 파일을 읽어서 구동될 때, 자동으로 메모리에 생성된다.

즉, ContextLoaderListener는 클라이언트의 요청이 없어도 컨테이너가 구동될 때 Pre-Loading 되는 객체다.

<listener>
    <listener-class>
        org.springframework.web.context.ContextLoaderListener
    </listener-class>
</listener>

 

스프링 컨테이너와의 관계

 

tomcat 서버를 처음 구동한다면 아래와 같은 순서로 구동된다.

  1. web.xml 파일을 Loading 하면 Servlet Container가 구동된다.
  2. Servlet Container는 web.xml 파일에 등록된 ContextLoaderListener 객체를 생성(Pre-Loading)한다. 
    • ContextLoaderListener 객체는 applicationContext.xml 파일을 Loading 하여 스프링 컨테이너(Root Container)를 구동한다. 
    • 이때, Service 구현 클래스나 DAO 객체들이 메모리에 생성된다. 
    • 이후, 사용자의 요청이 있으면 Servlet Container는 Dispatcher 객체를 생성한다.
  3. Dispatcher 객체는 presentation-layer.xml 파일을 Loading 하여 두 번째 스프링 컨테이너를 구동한다.
    • Controller 객체를 메모리에 생성한다.

 

분명히 스프링 컨테이너는 두 개가 구동된다.

즉, ContextLoaderListener와 DispatcherServlet이 각각 XmlWebApplicationContext를 생성하는데, 이때 두 스프링 컨테이너의 역할과 기능이 다르다.

ContextLoaderListener가 생성하는 스프링 컨테이너를 Root 컨테이너, 부모 컨테이너라고 생각하면된다.

DispatcherServlet이 생성한 컨테이너는 Root 컨테이너가 생성한 객체를 이용하는 자식 컨테이너가 된다.

따라서 부모 컨테이너가 생성한 비즈니스 객체를 자식 컨테이너가 생성한 Controller에서 참조하여 사용할 수 있다.