서블릿에서 XML 매핑과 어노테이션 매핑은 둘 다 서블릿과
URL을 연결하는 방법이다.
현재는 어노테이션 방식을 훨씬 더 많이 사용한다.
그 이유는 어노테이션이 가지는 여러 가지 장점 때문이다.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd"
version="6.0">
<servlet>
<servlet-name>xmlmapping</servlet-name>
<!-- 이름 지정 -->
<servlet-class>com.ohgiraffers.section01.xml.LifeCycleTestServlet</servlet-class>
<!-- 클래스 경로 지정 -->
<load-on-startup>1</load-on-startup>
<!-- 서버가 시작될 때 인스턴스를 생성한다. 태그 안의 숫자가 낮을 수록 서블릿의 우선순위가 높다. -->
</servlet>
<!-- *서블릿 만듦 -->
<servlet-mapping>
<servlet-name>xmlmapping</servlet-name>
<!-- 어느 서블릿에 연결할지 -->
<url-pattern>/xml-lifecycle</url-pattern>
<!-- 연결할 요청 -->
</servlet-mapping>
<!-- * 요청에 서블릿 매핑 -->
</web-app>
package com.ohgiraffers.section01.xml;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.http.HttpServlet;
import java.io.IOException;
public class LifeCycleTestServlet extends HttpServlet {
private int initCount = 1;
private int serviceCount = 1;
private int destroyCount = 1;
// 서블릿 컨테이너에 의해 최초 요청에만 실행되는 메소드
// - 서블릿을 처리하기 전에 준비 (DB 연결 등)
@Override
public void init() throws ServletException {
System.out.println("xml 매핑 init() 호출 : " + initCount++);
}
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("xml 매핑 service() 호출 : " + serviceCount++);
// 최초 요청 시에는 init() 이후에 동작하고,
// 두 번째 요청 부터는 init() 호출 없이 바로 호출된다.
}
// 모든 HTTP 요청이 먼저 전달되는 메소드이다.
// 요청의 HTTP 메소드에 따라 적절하게 doGet(), doPost() 등을 호출한다. - 따로 오버라이드 안해도 됨
// 컨테이너가 종료될 때 호출되는 메소드이며, 주로 자원을 반납하는 용도로 사용한다.
@Override
public void destroy() {
System.out.println("xml 매핑 destroy() 호출 : " + destroyCount++);
}
}
package com.ohgiraffers.section02.annotation;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import java.io.IOException;
@WebServlet(value = "/annotation-lifecycle", loadOnStartup = 2)
//@WebServlet(value = "/annotation-lifecycle")
//loadOnStartUp 이 없으면 실행 시 init됨
public class LifeCycleTestServlet extends HttpServlet {
private int initCount = 1;
private int serviceCount = 1;
private int destroyCount = 1;
// 서블릿 컨테이너에 의해 최초 요청에만 실행되는 메소드
// - 서블릿을 처리하기 전에 준비 (DB 연결 등)
@Override
public void init() throws ServletException {
System.out.println("annotation 매핑 init() 호출 : " + initCount++);
}
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("annotation 매핑 service() 호출 : " + serviceCount++);
// 최초 요청 시에는 init() 이후에 동작하고,
// 두 번째 요청 부터는 init() 호출 없이 바로 호출된다.
}
// 모든 HTTP 요청이 먼저 전달되는 메소드이다.
// 요청의 HTTP 메소드에 따라 적절하게 doGet(), doPost() 등을 호출한다. - 따로 오버라이드 안해도 됨
// 컨테이너가 종료될 때 호출되는 메소드이며, 주로 자원을 반납하는 용도로 사용한다.
@Override
public void destroy() {
System.out.println("annotation 매핑 destroy() 호출 : " + destroyCount++);
}
}