@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 설정에 의해 즉시 인스턴스화됩니다.