스프링 컨테이너(Spring Container) 및 설정 파일

2022. 2. 7. 21:49Spring & Spring Boot

이미지 출처: https://wan-blog.tistory.com/16

스프링 프레임워크의 동작 원리를 알기 위해서는 스프링 프레임워크 설정 파일들에 대한 이해가 필요하다. 스프링 프레임워크에 대해 알아보기 전에 서블릿 컨테이너에 대한 사전 이해가 있어야지 해당 내용을 이해하는 데 수월하다. 서블릿 컨테이너 관련된 포스팅을 참조하길 바란다.

 

이번 포스팅은 스프링 프레임워크 동작 원리를 이해하기 위한 스프링 설정 파일에 대한 포스팅이다. 우선 스프링 설정 파일의 가장 기본이 되는 파일은 web.xml, servlet-context.xml, applicationContext.xml 이다.


web.xml (배포서술자)

web.xml은 배포 서술자라고 하며 WAS(톰켓) 가동시 WEB-INF 하위에 있는 web.xml을 읽고, 웹 어플리케이션 설정을 구성한다. 스프링 프레임워크를 사용하지 않고 서블릿 컨테이너로 요청/응답 처리를 처리할 때는 web.xml에 서블릿 객체를 작성해두고 들어오는 요청 URL에 따라 서블릿 객체를 생성하거나 이미 만들어져 있을 경우 메모리에 저장되어 있는 서블릿 객체를 호출하여 재사용 했다.

스프링 프레임워크에서는 FrontController(DispatcherServlet) 개념이 도입되어 모든 요청을 하나의 정해진 서블릿으로 받아서 다른 서블릿으로 매핑처리를 수행한다. web.xml에 모든 서블릿을 작성하는 것이 아닌 DispatcherServlet이라는 서블릿을 작성해서 모든 요청을 DispatcherServlet으로 받고 DispatcherServlet 설정파일에 설정해둔 서블릿에 매핑되어 처리된다.

DispatcherServlet을 사용함에 따라 web.xml의 역할이 줄어들었다. URL요청을 처리하기  위해 모든 서블릿을 web.xml에 등록할 필요가 없어졌기 때문이다. 그럼에도 web.xml의 역할은 중요하다. 모든 URL 요청을 받기 위한 DispatcherServlet을 서블릿으로 등록해줘야하며 <filter>나 <listener> 설정하는 역할 또한 web.xml의 역할이기 때문이다.


servlet-context.xml (Servlet Context)

servlet-context.xml은 앞서 web.xml에서 DispatcherServlet으로 설정한 파일이다. 해당 파일을 DispatcherServlet 설정파일, 서블릿용 컨테이너, 서블릿 컨텍스트 등으로 부른다. 서블릿용 컨테이너라고 부른 이유는 서블릿 컨테이너(WAS)와 혼동할 수 있기 때문에 서블릿용 컨테이너라고 부른다(물론 정식 용어는 아니고 컨테이너 구분을 위해서 붙인 이름이다)
servlet-context와 ApplicationContext는 둘 다 스프링 컨테이너이지만 ApplicationContext는 루트 컨테이너이고 servlet-context는 그 하위의 자식 컨테이너이다.(정확한 구분인지는 모르겠으나 대부분의 사람들이 두 스프링 컨테이너를 부모-자식으로 구분하는 듯하다.) 

servlet-context.xml의 역할은 앞서 말했듯이 DispatcherServlet의 역할을 설정해두는 역할을 한다. 그러므로 URL요청을 매핑할 서블릿을 등록하거나 component-scan을 통해 어노테이션을 스캔할 base-packege를 설정한다. 또한 서블릿(컨트롤러)에서 비즈니스 로직 처리 후 반환된 view파일의 이름을 viewResolver로 받아서 조립 후 해당 view로 보내서 처리 후 완료된 view페이지를 클라이언트로 응답하는 역할을 수행한다. 그리고 intercepter의 역할 또한 servlet-context.xml에서 처리한다. filter와 intercepter의 차이는 추후 포스팅할 예정이다.


applicationContext.xml (Root Context)

스프링 컨테이너로 BeanFactory 인터페이스가 있는데 ApplicationContext는 BeanFactory를 상속한 인터페이스로 여러 서블릿에서 공용으로 사용할 Bean을 등록하는 Context이다. BeanFactory는 클라이언트 요청에 의해서 Bean객체가 사용되는 시점(Lazy Loading)에 객체를 생성하는 방식을 사용하는 반면에 ApplicationContext는 컨테이너가 구동되는 시점에 객체들을 생성하는 Pre-Loading 방식이라는 차이점이 있다. 또한 트랜잭션 관리, 메시지 기반의 다국어 처리, AOP 처리 등 DI(Dependency Injection)와 IoC(Inverse of Conversion) 외에도 많은 부분을 지원하기 때문에 Bean 객체를 생성하고 관리하는 스프링 컨테이너로 ApplicationContext를 주로 사용한다. Application Context의 종류는 여러개가 있는데 해당 내용은 다음에 포스팅 하도록 하겠다.


정리

  • web.xml은 servlet, DispatcherServlet(FrontController), ApplicationContext(스프링 Bean 컨테이너), filter, listner 웹 어플리케이션의 설정을 구성한다.
  • servlet-context.xml은 DispatcherServlet 설정 역할한다. 웹 어플리케이션에서 사용하는 서블릿을 등록하고 요청에 맞는 서블릿을 찾아서 서비스 로직의 처리하고 서블릿에서 처리한 결과를 반환 받아 알맞는 view로 보내주고 처리된 view페이지를 클라이언트로 보내주는 DispatcherServlet을 설정하는 파일이다.
  • applicationContext.xml은 서블릿에서 공용으로 사용한 Bean 객체를 등록하고 관리하는 ApplicationContext 설정파일이다. ApplicationContext는 트랜잭션 관리, 다국어 처리, AOP 등 다양한 기능을 지원하며, 컨테이너가 구동되는 시점에 객체들을 생성하는 Pre-Loading 방식이라는 특징이 있다.