반응형
DispatcherServlet web.xml
WEB-INF/web.xml은 서블릿 기반의 스프링 MVC 애플리케이션에서 설정 파일로 사용되며, DispatcherServlet을 정의하고 애플리케이션의 주요 서블릿을 설정하는 역할을 합니다.
최근에는 Spring Boot에서 자동 설정을 제공하기 때문에 web.xml을 사용하지 않는 경우가 많지만, 전통적인 스프링 MVC 프로젝트에서는 여전히 중요한 설정 파일입니다.
1. DispatcherServlet이란?
DispatcherServlet은 프론트 컨트롤러(Front Controller) 역할을 수행하며, 들어오는 모든 HTTP 요청을 중앙에서 제어합니다.
- 클라이언트의 요청을 받아서 적절한 컨트롤러로 전달
- 컨트롤러에서 반환한 데이터를 기반으로 뷰를 렌더링
- web.xml에서 서블릿 매핑을 통해 URL 패턴을 지정
2. web.xml에서 DispatcherServlet 설정 방법
전통적인 web.xml 파일을 사용해 스프링 MVC 애플리케이션을 설정하는 기본적인 방법을 살펴보겠습니다.
예제 web.xml 설정
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<!-- DispatcherServlet 서블릿 정의 -->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 초기화 파라미터: 스프링 설정 파일 위치 지정 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-mvc-config.xml</param-value>
</init-param>
<!-- 서블릿 초기화 시 로드 순서 (0: 서버 시작 시 즉시 로드) -->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- DispatcherServlet URL 매핑 설정 -->
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 인코딩 필터 설정 (UTF-8) -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
3. 주요 설정 요소 설명
- <servlet> 태그
- DispatcherServlet을 선언하고 애플리케이션에 등록하는 부분
- servlet-name: 서블릿의 이름 정의 (ex: dispatcher)
- servlet-class: 서블릿 클래스 지정 (org.springframework.web.servlet.DispatcherServlet)
- contextConfigLocation: 스프링 설정 파일(spring-mvc-config.xml)의 위치 지정
- load-on-startup: 값이 0이면 지연 로딩, 1이면 서버 시작 시 즉시 로딩
- <servlet-mapping> 태그
- 특정 URL 패턴을 서블릿과 연결
- 예시에서 /는 모든 요청을 DispatcherServlet이 처리하도록 설정 (기본 루트)
- <filter> 태그 (선택 사항)
- 캐릭터 인코딩 필터를 추가하여 UTF-8 인코딩 강제 적용
4. DispatcherServlet의 동작 흐름
- 클라이언트 요청 (http://localhost:8080/app/home)
- 요청이 DispatcherServlet으로 전달됨
- spring-mvc-config.xml을 로드하여 빈(Bean) 및 핸들러 매핑 설정
- 적절한 컨트롤러로 요청을 전달 (@Controller)
- 컨트롤러에서 데이터를 처리하고 뷰 이름 반환 (return "home";)
- 뷰 리졸버(ViewResolver)가 뷰를 찾고 렌더링
- 최종 HTML 페이지를 클라이언트에 반환
5. web.xml 없이 Java 기반 설정 (@Configuration 사용)
최근에는 XML 대신 자바 기반 설정을 사용하는 방식이 선호됩니다.
Java 설정에서는 WebApplicationInitializer 인터페이스를 활용하여 설정할 수 있습니다.
public class AppInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) {
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
context.register(AppConfig.class);
ServletRegistration.Dynamic dispatcher = servletContext.addServlet("dispatcher",
new DispatcherServlet(context));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
}
}
- AnnotationConfigWebApplicationContext → 스프링 컨텍스트를 JavaConfig 기반으로 등록
- ServletRegistration.Dynamic → DispatcherServlet 수동 등록
- XML 없이 자바 코드만으로 설정 가능
6. web.xml과 Spring Boot의 차이점
비교 항목 | 전통적인 web.xml 사용 | Spring Boot 사용 |
---|---|---|
설정 방식 | XML 기반 설정 | Java 기반 자동 설정 (Annotation) |
Dispatcher 설정 | 수동 등록 필요 (web.xml) | 자동 등록 (@SpringBootApplication) |
유연성 | 낮음 (파일 수정 필요) | 높음 (환경 기반 설정 가능) |
부트스트랩 속도 | 상대적으로 느림 | 빠름 |
7. 정리
- web.xml을 사용하면 서블릿을 명시적으로 등록할 수 있지만, 최신 프로젝트에서는 Java 설정(Spring Boot)을 선호
- DispatcherServlet은 스프링 MVC의 핵심이며, 요청을 받아 적절한 컨트롤러로 전달
- 전통적인 web.xml에서는 서블릿 매핑과 초기화 파라미터 등을 설정
- 최신 방식에서는 WebApplicationInitializer 또는 Spring Boot로 XML 없이 설정 가능
반응형
'프론트엔드' 카테고리의 다른 글
스프링 MVC 요청 처리 흐름으로 알아본 스프링 MVC 설계구조 (0) | 2025.01.26 |
---|---|
AI VS Code 코드 자동 완성 플러그인 비교 및 Codeium 사용법 (0) | 2025.01.18 |
Vite 프로젝트 설정 파일 vite.config.js (1) | 2025.01.17 |
Vite 사용법 (1) | 2025.01.17 |
초간단 서버 클라이언트 예시 (0) | 2025.01.03 |