스프링 MVC에서 서블릿 컨테이너 초기화는 서블릿 기반의 웹 애플리케이션이 실행될 때 컨테이너가 애플리케이션을 시작하고, 요청을 처리하는 구조를 설정하는 중요한 단계이다. 이를 이해하려면 서블릿 컨테이너와 스프링의 역할을 각각 분리해서 설명할 필요가 있다.
# 서블릿 컨테이너의 역할
서블릿 컨테이너는 Java EE (지금은 Jakarta EE) 웹 애플리케이션 서버에서 제공되는 컴포넌트로, 서블릿을 실행하고 관리한다. 서블릿은 HTTP 요청을 처리하고 응답을 생성하는 역할을 한다. 대표적인 서블릿 컨테이너는 Tomcat, Jetty, Undertow 등이 있습니다.
서블릿 컨테이너는 애플리케이션이 시작될 때 다음과 같은 일들을 수행한다:
- 서블릿 등록 및 초기화: web.xml 파일이나 애노테이션 기반 설정을 통해 서블릿 클래스를 인식하고, 해당 서블릿을 초기화한다.
- HTTP 요청 수신 및 전달: HTTP 요청이 들어오면 적절한 서블릿으로 요청을 전달하고, 서블릿이 응답을 생성하면 클라이언트에게 반환한다.
# 스프링 MVC의 역할
스프링 MVC는 서블릿 컨테이너 위에서 동작하는 웹 프레임워크로, 사용자 요청을 효과적으로 처리하고, 비즈니스 로직과 프레젠테이션 로직을 분리하는 역할을 한다. 스프링 MVC는 자체적으로 서블릿을 포함하지 않지만, 스프링 MVC를 동작시키기 위해 서블릿 컨테이너에 통합된다.
# DispatcherServlet
스프링 MVC의 중심이 되는 것은 DispatcherServlet다. 이 서블릿은 스프링에서 제공하는 프론트 컨트롤러로, 모든 HTTP 요청을 받아서 적절한 컨트롤러로 전달하고, 그 결과를 뷰로 변환하여 응답을 반환한다.
DispatcherServlet의 초기화 과정:
- 서블릿 컨테이너가 실행되면 스프링 애플리케이션에서 정의된 DispatcherServlet이 서블릿 컨테이너에 의해 로드된다.
- 서블릿 초기화 단계: DispatcherServlet이 초기화될 때, 스프링의 WebApplicationContext가 생성된다. 이 WebApplicationContext는 애플리케이션의 전반적인 설정과 빈(bean)들을 관리한다.
- 핸들러 매핑과 뷰 리졸버 설정: WebApplicationContext는 컨트롤러, 서비스, 레포지토리 등의 빈을 생성하고, 요청을 처리할 핸들러(컨트롤러 메서드)를 찾기 위한 매핑 정보도 설정한다. 또한 뷰를 어떻게 렌더링할 것인지 결정하는 뷰 리졸버도 설정된다.
- 요청 처리: 서블릿 컨테이너가 HTTP 요청을 수신하면 DispatcherServlet이 그 요청을 처리하고, 적절한 컨트롤러로 요청을 전달한 후, 결과를 다시 클라이언트에게 반환한다.
# ServletContext 초기화
DispatcherServlet을 서블릿 컨테이너에 등록하려면 ServletContext와 같은 객체를 사용해야 한다. 전통적으로 web.xml 파일을 사용하여 서블릿을 등록했지만, 최근에는 애노테이션과 자바 기반 설정이 더 많이 사용된다.
예시: 자바 기반 설정을 사용한 DispatcherServlet 등록
WebApplicationInitializer 인터페이스를 사용하여 서블릿 초기화 과정을 정의할 수 있다. 이 인터페이스는 서블릿 컨테이너가 초기화될 때 호출된다.
public class MyWebAppInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
context.register(AppConfig.class); // 설정 클래스 등록
DispatcherServlet dispatcherServlet = new DispatcherServlet(context);
ServletRegistration.Dynamic registration = servletContext.addServlet("dispatcher", dispatcherServlet);
registration.setLoadOnStartup(1);
registration.addMapping("/");
}
}
# 서블릿 3.0 이상에서의 편리한 초기화
서블릿 3.0 이상에서는 web.xml을 사용하지 않고 서블릿을 등록할 수 있는 애노테이션 기반 설정을 사용할 수 있다. @WebServlet, @WebFilter, @WebListener 같은 애노테이션을 사용하여 서블릿, 필터, 리스너를 직접 코드에서 설정할 수 있다.
스프링 MVC에서는 이를 더욱 편리하게 하기 위해 AbstractAnnotationConfigDispatcherServletInitializer 클래스를 제공하여, 개발자가 간단하게 서블릿 컨테이너에 DispatcherServlet을 등록할 수 있도록 돕는다.
public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] { RootConfig.class };
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[] { WebConfig.class };
}
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
}
# 서블릿 컨테이너 초기화 지원 요약
- 스프링 MVC에서 DispatcherServlet은 서블릿 컨테이너에 의해 관리되며, 모든 HTTP 요청을 프론트 컨트롤러 패턴을 사용해 처리한다.
- 스프링은 자바 기반 설정이나 애노테이션을 사용하여 서블릿 초기화를 쉽게 지원하며, 서블릿 3.0 이후로는 코드 기반 서블릿 등록이 가능해졌다.
- WebApplicationInitializer 또는 AbstractAnnotationConfigDispatcherServletInitializer 등을 사용하면 서블릿을 유연하게 초기화할 수 있다.
이 과정을 통해 스프링 MVC는 서블릿 컨테이너에서 실행되며, HTTP 요청을 받아서 적절한 핸들러(컨트롤러)로 전달하고, 결과를 클라이언트에게 반환하는 구조를 갖춘다.
'Java > Spring' 카테고리의 다른 글
스프링 컨테이너 정리 (0) | 2024.09.20 |
---|