Java Servlet @WebServlet 어노테이션의 구성과 활용

@WebServlet 어노테이션의 구조 분석

Servlet 3.0 규격부터 도입된 @WebServlet 어노테이션은 과거 web.xml 배포 서술자에서 수행하던 서블릿 등록 및 매핑 작업을 소스 코드 레벨에서 직접 처리할 수 있게 해줍니다. 이 어노테이션은 jakarta.servlet.annotation 패키지에 정의되어 있으며, 주요 속성은 다음과 같습니다.

package jakarta.servlet.annotation;

import java.lang.annotation.*;

/**
 * Servlet 3.0 이상에서 서블릿 설정을 위해 사용됩니다.
 */
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface WebServlet {

    // 서블릿의 이름을 정의 (xml의 servlet-name에 해당)
    String name() default "";

    // 서블릿 매핑을 위한 URL 패턴 (단일 패턴 설정 시 편리)
    String[] value() default {};

    // 복수 개의 URL 패턴을 설정할 때 사용 (value와 혼용 불가)
    String[] urlPatterns() default {};

    // 서블릿 인스턴스 생성 우선순위 설정 (양수일 경우 컨테이너 가동 시 로드)
    int loadOnStartup() default -1;

    // 서블릿 초기화 파라미터 설정
    WebInitParam[] initParams() default {};

    // 비동기 처리 지원 여부
    boolean asyncSupported() default false;

    // 기타 메타데이터 속성
    String smallIcon() default "";
    String largeIcon() default "";
    String description() default "";
    String displayName() default "";
}

주요 속성 상세 설명

  • name: 서블릿의 식별 이름을 지정합니다. 생략 시 클래스의 정규화된 이름이 기본값이 됩니다.
  • urlPatterns / value: 서블릿에 접근할 수 있는 경로를 지정합니다. @WebServlet("/api/data")와 같이 사용하면 value 속성이 자동으로 채워집니다.
  • loadOnStartup: 애플리케이션 시작 시 서블릿 초기화 순서를 결정합니다. 값이 0보다 크면 숫자가 작을수록 먼저 로드됩니다.
  • initParams: @WebInitParam 어노테이션 배열을 통해 서블릿 내부에서 사용할 환경 변수값을 주입할 수 있습니다.

@WebServlet 구현 예제

기존의 XML 설정 방식에서 탈피하여 어노테이션을 기반으로 특정 요청을 처리하고 초기화 파라미터를 읽어오는 서블릿 예제입니다.

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebInitParam;
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(
    name = "ProductProcessServlet",
    urlPatterns = {"/product/view", "/product/detail"},
    initParams = {
        @WebInitParam(name = "region", value = "Seoul"),
        @WebInitParam(name = "apiKey", value = "KEY_12345")
    },
    loadOnStartup = 1
)
public class ProductServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        
        // 서블릿 초기화 파라미터 추출
        String regionCode = getServletConfig().getInitParameter("region");
        
        // 요청 파라미터 검증 로직
        String productId = request.getParameter("pid");
        response.setContentType("text/html;charset=UTF-8");

        if (productId != null && productId.startsWith("P-")) {
            response.getWriter().println("<h3>Region: " + regionCode + "</h3>");
            response.getWriter().println("Product ID [" + productId + "] is valid.");
        } else {
            response.getWriter().println("Invalid Access: Product ID is missing or incorrect.");
        }
    }
}

위 예제에서 ProductServlet은 두 개의 URL 경로에 매핑되어 있으며, region이라는 초기화 파라미터를 활용합니다. 서버 기동 시 loadOnStartup 설정에 의해 즉시 인스턴스화됩니다.

태그: java Servlet WebServlet JakartaEE WebDevelopment

8월 8일 07:07에 게시됨