Web.xml
web.xml의 주요 역할
- 서블릿 매핑: 서블릿 클래스와 URL 경로를 연결하여 특정 URL 요청이 들어올 때 해당 서블릿이 실행되도록 합니다.
- 필터와 리스너 설정: 요청 전/후 작업을 처리하는 필터와 애플리케이션 상태 변화에 대한 이벤트 처리를 담당하는 리스너를 설정할 수 있습니다.
- 초기화 매개변수 설정: 애플리케이션과 서블릿에 필요한 초기 매개변수를 설정할 수 있습니다.
- 보안 설정: 보안 설정을 통해 특정 URL에 접근 권한을 부여하거나, 인증을 적용할 수 있습니다.
기본 web.xml 구조
web.xml 파일은 WEB-INF 폴더에 위치하며, 웹 애플리케이션의 설정을 XML 형식으로 정의합니다.
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/hello") // 서블릿 URL 매핑 설정
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
resp.getWriter().write("<h1>Hello, Servlet with Annotation!</h1>");
}
}
web.xml의 주요 구성 요소
- <servlet>: 서블릿 클래스를 정의합니다. 서블릿 이름과 클래스 경로를 설정합니다.
- <servlet-name>: 서블릿의 이름을 지정합니다. <servlet-mapping>과 연결됩니다.
- <servlet-class>: 서블릿 클래스의 전체 경로를 지정합니다.
- <servlet-mapping>: 특정 URL 요청이 해당 서블릿으로 매핑되도록 설정합니다.
- <servlet-name>: 요청을 처리할 서블릿의 이름을 지정합니다. <servlet>의 servlet-name과 일치해야 합니다.
- <url-pattern>: 서블릿과 연결할 URL 패턴을 지정합니다. 예를 들어, /hello 경로에 매핑하여 http://localhost:8080/프로젝트명/hello로 요청이 들어오면 HelloServlet이 실행됩니다.
- <context-param>: 웹 애플리케이션 전체에서 사용할 수 있는 전역 매개변수를 정의합니다.
- <param-name>과 <param-value>를 통해 전역적으로 필요한 설정 값을 지정할 수 있습니다. 예: 설정 파일 경로.
- <init-param>: 특정 서블릿에 대한 초기화 매개변수를 설정합니다.
- <servlet> 태그 내부에서 설정하여 특정 서블릿에만 적용되는 초기 설정 값을 지정할 수 있습니다.
web.xml을 사용한 서블릿 설정 예제
HelloServlet 서블릿을 web.xml에 설정
<web-app xmlns="<http://xmlns.jcp.org/xml/ns/javaee>"
xmlns:xsi="<http://www.w3.org/2001/XMLSchema-instance>"
xsi:schemaLocation="<http://xmlns.jcp.org/xml/ns/javaee>
<http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd>"
version="3.1">
<!-- HelloServlet 서블릿 설정 -->
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.example.HelloServlet</servlet-class>
</servlet>
<!-- HelloServlet 매핑 설정 -->
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
- HelloServlet 서블릿 설정: servlet-name과 servlet-class를 사용하여 서블릿 이름과 클래스를 지정합니다.
- 서블릿 매핑 설정: url-pattern을 /hello로 지정하여 클라이언트가 /hello로 요청하면 HelloServlet이 실행되도록 설정합니다.
추가 기능
1. 초기화 매개변수 설정 (서블릿에 대한 init-param)
서블릿에 특정 초기 설정 값을 전달하려면 <init-param> 태그를 사용할 수 있습니다. 예를 들어, message라는 초기 매개변수를 설정할 수 있습니다.
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.example.HelloServlet</servlet-class>
<init-param>
<param-name>message</param-name>
<param-value>Hello from init-param!</param-value>
</init-param>
</servlet>
- 이 초기화 매개변수는 HelloServlet 내에서 getServletConfig().getInitParameter("message")로 접근할 수 있습니다.
2. 필터 설정
필터는 요청과 응답의 전후에 처리할 작업을 수행할 수 있게 해줍니다. 예를 들어, 요청 로깅, 응답 압축, 인증 등을 수행할 수 있습니다.
<filter>
<filter-name>LoggingFilter</filter-name>
<filter-class>com.example.LoggingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LoggingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
- LoggingFilter라는 필터를 설정하고, 모든 URL 패턴 (/*)에 대해 요청을 가로채서 필터가 처리하도록 설정합니다.
3. 리스너 설정
리스너는 웹 애플리케이션의 상태 변화를 감지하고 처리할 수 있습니다. 예를 들어, 애플리케이션 시작 시 초기화 작업을 수행하는 리스너를 추가할 수 있습니다.
<listener>
<listener-class>com.example.AppListener</listener-class>
</listener>
- AppListener 클래스는 ServletContextListener를 구현하여, 애플리케이션 시작과 종료 시 특정 작업을 수행할 수 있습니다.
요약
- web.xml은 서블릿 매핑, 초기화 매개변수, 필터, 리스너 등을 설정하여 웹 애플리케이션의 전반적인 동작을 정의하는 역할을 합니다.
- *<servlet>와 <servlet-mapping>을 통해 서블릿 클래스를 정의하고, 요청이 들어올 URL 패턴과 연결하여 특정 요청이 어떤 서블릿에서 처리될지 설정합니다.
- *<context-param>과 <init-param>을 사용하여 전역 및 서블릿에 대한 초기화 설정을 적용할 수 있습니다.
web.xml은 특히 대규모 애플리케이션에서 구조적 설정을 관리하는 데 유용하며, 서블릿의 동작과 웹 애플리케이션 전반의 설정을 한 곳에서 관리할 수 있게 해줍니다.
@WebServlet
Servlet 애너테이션(@WebServlet)을 사용하면, web.xml 파일에 서블릿 설정을 작성하지 않고도 서블릿의 URL 매핑을 쉽게 지정할 수 있습니다. 애너테이션 방식은 코드 내에서 직접 서블릿을 설정할 수 있어 직관적이고, 설정이 간단하다는 장점이 있습니다.
@WebServlet 애너테이션의 기본 사용법
@WebServlet 애너테이션을 통해 서블릿의 URL 패턴을 지정할 수 있습니다. 애너테이션은 서블릿 클래스 위에 추가하며, web.xml에 별도로 서블릿을 등록할 필요 없이 자동으로 매핑됩니다.
기본 예제
@WebServlet("/hello") // 서블릿 URL 매핑 설정
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
resp.getWriter().write("<h1>Hello, Servlet with Annotation!</h1>");
}
}
- @WebServlet("/hello"): /hello 경로로 요청이 오면 HelloServlet이 실행되도록 설정합니다.
- 서블릿 컨테이너는 애너테이션을 통해 web.xml 파일 없이도 서블릿을 인식하고, 매핑 설정을 자동으로 처리합니다.
@WebServlet 애너테이션의 주요 속성
@WebServlet 애너테이션은 다양한 속성을 통해 서블릿의 동작을 세부적으로 설정할 수 있습니다.
- value 또는 urlPatterns: 서블릿이 매핑될 URL 패턴을 지정합니다.
@WebServlet(value = "/hello") // 단일 URL 패턴
@WebServlet(urlPatterns = {"/hello", "/greet"}) // 여러 URL 패턴
- name: 서블릿 이름을 지정합니다. 기본값은 클래스 이름이 사용됩니다.
@WebServlet(name = "HelloServlet", urlPatterns = "/hello")
- loadOnStartup: 서블릿의 로드 우선순위를 설정합니다. 값이 0 이상이면 서버 시작 시 서블릿이 로드됩니다.
@WebServlet(urlPatterns = "/hello", loadOnStartup = 1)
- initParams: 서블릿에 초기화 매개변수를 전달합니다. 여러 매개변수를 설정할 수 있습니다.
@WebServlet(urlPatterns = "/hello", initParams = {
@WebInitParam(name = "param1", value = "value1"),
@WebInitParam(name = "param2", value = "value2")
})
@WebServlet 방식과 web.xml 방식의 차이점
| 항목 | @WebServlet | Web.xml |
| 설정 위치 | 코드 내부 | 외부 설정 파일(web.xml) |
| 가독성 | 코드와 설정이 함께 있어 가독성 증가 | 설정이 코드와 분리되어 가독성 떨어질 수 있음 |
| 유연성 | 간단한 설정에 적합 | 복잡한 설정, 필터, 리스너, 보안 설정에 유리 |
| 변경 용이성 | 코드 수정 시 서블릿 설정 자동 반영 | 설정을 수정하려면 web.xml을 따로 수정해야 함 |
| 사용 시기 | 단일 서블릿이거나 간단한 설정에 적합 | 대규모 애플리케이션이나 복잡한 설정에 적합 |
언제 애너테이션을 사용하고, 언제 web.xml을 사용할까?
- 애너테이션 사용 시기:
- 서블릿, 필터, 리스너의 설정이 단순할 때.
- 소규모 애플리케이션에서, 설정이 복잡하지 않고 코드와 설정이 함께 있으면 더 직관적일 때.
- 빠르게 프로토타입을 개발하거나 테스트하는 경우.
- web.xml 사용 시기:
- 복잡한 설정이 필요한 경우(예: 여러 URL 패턴, 보안 설정, 필터 체인 설정 등).
- 설정 파일을 따로 관리하여 설정의 유연성과 유지보수성을 높여야 하는 경우.
- 환경마다 설정이 달라질 수 있는 대규모 애플리케이션에서, 배포 환경에 따라 설정을 쉽게 변경할 수 있어야 하는 경우.
애너테이션과 web.xml 혼합 사용
애너테이션과 web.xml을 함께 사용할 수도 있습니다. 예를 들어, 주로 간단한 서블릿 매핑은 애너테이션을 사용하고, 복잡한 필터와 리스너 설정이나 환경별 설정이 필요한 경우에는 web.xml을 사용하는 방식으로 혼합 사용이 가능합니다.
요약
- @WebServlet 애너테이션은 서블릿 매핑을 간단하고 직관적으로 설정할 수 있는 방법입니다.
- 코드와 설정을 한 곳에서 관리할 수 있어, 소규모 프로젝트나 간단한 서블릿 매핑에는 애너테이션이 유리합니다.
- web.xml은 복잡한 설정이 필요한 경우에 유리하며, 보안 설정, 필터, 리스너 등 전체 애플리케이션 설정이 필요한 경우 여전히 중요한 역할을 합니다.
- 두 방식을 혼합하여 사용하는 것도 가능하며, 애플리케이션의 요구 사항에 따라 유연하게 선택할 수 있습니다.
'Backend > Web' 카테고리의 다른 글
| MVC Model1 (0) | 2024.11.13 |
|---|---|
| 터미널에서 서버 종료하기 (0) | 2024.11.13 |
| Servlet⭐️ (0) | 2024.11.12 |
| [JSP] include 액션 태그와 디렉티브 | forward, JavaBean 액션태그 (0) | 2024.11.11 |
| [JSP]DTO & DAO⭐️ (0) | 2024.11.11 |