[Servlet] LifeCycle

컨테이너·2025년 11월 18일
0

SpringFramework

목록 보기
6/15
post-thumbnail

01. Servlet

01-01. Servlet 개요

01-01-01. Servlet이란 무엇인가

Servelt = Server + Applet

  • 자바로 작성된 서버 측 프로그램
  • 클라이언트의 요청을 받아 처리하고, 처리 결과를 다시 클라이언트에게 응답하는 클래스
  • 웹에서 동적인 페이지를 JAVA로 구현한 서버 프로그램으로 이해할 수 있음

관련 API 문서

01-01-02. Servelt 설계 시 알아야 할 것

  1. 모든 Servlet은 javax.servlet.Servlet 인터페이스를 기반으로 한다.
  2. ServletServletConfig 구현을 모아 둔 추상 클래스가 GenericServlet 이다.
  3. HTTP 프로토콜을 사용하는 서블릿은 HttpServlet 클래스를 상속한다.
    • HttpServletGenericServlet을 상속
  4. 예외 처리는 javax.servlet.ServletException (현재는 jakarta.servlet.ServletException) 사용.

실제로 우리가 작성하는 서블릿은 대부분 다음 형태이다.

@WebServlet("/example")
public class ExampleServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        // 로직
    }
}

01-02. Servlet 동작 구조와 컨테이너

01-02-01. Servlet의 동작 구조(큰 흐름)

  1. 클라이언트가 특정 URL로 요청을 보냄
  2. 웹 서버(Tomcat)가 URL을 보고 어떤 서블릿으로 보낼지 매핑 정보를 확인
  3. 해당 서블릿 인스턴스를 컨테이너가 준비
    • 최초 요청이면 객체 생성 + init() 호출
  4. 요청이 들어올 때마다 service() 호출
    • 내부에서 doGet(), doPost() 등으로 분기
  5. 서버 종료 또는 재배포 시 destroy() 호출

01-02-02. Servlet Container란

역할 요약

  • 서블릿의 매니지먼트를 다룸.
  • 서블릿의 생명주기를 관리하고, 요청에 맞는 서블릿을 찾아 service()를 호출한다.

주요 특징

  1. 웹 서버/앱 서버 안에 포함된 서블릿 실행 환경
  2. web.xml VS @annotaion 을 기반으로 서블릿을 등록·매핑
  3. 서버 기동 시 필요한 서블릿은 미리 생성하고(load-on-startup), 종료 시 destroy() 호출
  4. Tomcat의 핵심이 바로 이 서블릿 컨테이너

01-03. Deployment Descriptor (web.xml)

01-03-01. 배포 서술자

  • 애플리케이션 전체 설정 정보가 들어있는 XML 파일
  • 위치: webapp/WEB-INF/web.xml
  • 웹 컨테이너는 이 파일을 읽고 서블릿을 구동

설정할 수 있는 내용

  • 서블릿 정의, 초기화 파라미터
  • 세션 설정
  • URL 매핑
  • MIME 타입 매핑
  • 에러 페이지, 필터, 리스너
  • 보안 설정, welcome 파일 등

01-03-02. web.xml의 주요 태그

대표적인 태그들

  • <web-app>: 루트 태그
  • <servlet>: 서블릿 정의 (servlet-name, servlet-class, init-param 등)
  • <servlet-mapping>: 서블릿 매핑 정보
  • <context-param>: 애플리케이션 전체에서 공유하는 초기값
  • <error-page>: 에러 코드에 따른 페이지 설정
  • <session-config>: 세션 타임아웃 설정
  • <filter>, <listener>

01-04. Servlet 매핑

01-04-01. 매핑 개념

  • 클라이언트는 클래스 이름이 아닌 URL로 서블릿에 접근
  • 매핑 방식
    • web.xml 기반 매핑
    • @WebServlet 애노테이션 매핑

01-04-02. web.xml을 이용한 매핑

사용 예시

<servlet>
    <servlet-name>xmlmapping</servlet-name>
    <servlet-class>com.section01.xml.LifeCycleTestServlet</servlet-class>
    <load-on-startup>100</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>xmlmapping</servlet-name>
    <url-pattern>/xml-lifecycle</url-pattern>
</servlet-mapping>

포인트

  • <servlet><servlet-mapping>은 세트로 묶어서 사용
  • <load-on-startup> 숫자가 낮을수록 서버 구동 시 먼저 로딩
  • 장점: 설정을 한곳에서 관리 가능, 한눈에 전체 구조 파악 용이
  • 단점: 서블릿 추가/변경 때마다 web.xml 수정 필요

01-04-03. @WebServlet 애노테이션 매핑

기본 형태

@WebServlet("/annotation-lifecycle")
public class LifeCycleTestServlet extends HttpServlet {
    // ...
}

속성을 추가한 형태

@WebServlet(value = "/annotation-lifecycle", loadOnStartup = 1)
public class LifeCycleTestServlet extends HttpServlet {
    // ...
}

특징

  • 클래스 바로 위에 매핑 정보를 작성 → 개발 시 편리
  • 단점: 전체 서블릿 매핑을 한눈에 보기 어렵다.

포인트

  • web.xml은 중앙집중형 설정, @WebServlet은 로컬(클래스 단위) 설정

01-05. Servlet 초기값 설정 – ServletConfig, ServletContext

01-05-01. ServletConfig (서블릿 개별 초기값)

  • 특정 서블릿에만 적용되는 초기 파라미터
  • web.xml의 <servlet> 내부 <init-param> 으로 설정

web.xml 예시

<servlet>
    <servlet-name>configTest</servlet-name>
    <servlet-class>com.example.ConfigTestServlet</servlet-class>
    <init-param>
        <param-name>adminEmail</param-name>
        <param-value>admin@example.com</param-value>
    </init-param>
</servlet>

서블릿에서 사용

public class ConfigTestServlet extends HttpServlet {

    @Override
    public void init() throws ServletException {
        ServletConfig config = getServletConfig();
        String adminEmail = config.getInitParameter("adminEmail");
        System.out.println("Admin Email = " + adminEmail);
    }
}

포인트

  • 해당 서블릿 전용 설정
  • 동적 변경 X, 상수값처럼 사용

01-05-02. ServletContext (애플리케이션 공용 초기값)

  • 애플리케이션 전체에서 공유하는 설정 값
  • <web-app> 아래 <context-param> 사용

web.xml 예시

<context-param>
    <param-name>fileUploadPath</param-name>
    <param-value>/upload</param-value>
</context-param>

서블릿에서 사용

public class ContextTestServlet extends HttpServlet {

    @Override
    public void init() throws ServletException {
        ServletContext context = getServletContext();
        String uploadPath = context.getInitParameter("fileUploadPath");
        System.out.println("Upload Path = " + uploadPath);
    }
}

비교 요약

  • ServletConfig: 서블릿 “개별 설정”
  • ServletContext: 애플리케이션 “공용 설정”

01-05-03. Context Path

  • 하나의 Tomcat에 여러 애플리케이션이 배포될 수 있기 때문에 각 애플리케이션을 구분하는 루트 경로
  • 형식 http://localhost:포트/컨텍스트경로/서블릿URL

예시

  • http://localhost:8800/first/test1.do
    • first → context path
    • /test1.do → 서블릿 매핑 URL

01-06. Servlet LifeCycle과 구동

01-06-01. Servlet LifeCycle

핵심 메서드 3개

  1. init()
  2. service()doGet(), doPost()
  3. destroy()

동작 순서

  1. 첫 요청이 들어오면
    • 서블릿 인스턴스 생성
    • init() 한 번만 호출
  2. 이후 요청마다
    • service() 호출
    • HTTP 메서드에 따라 doGet(), doPost() 등 호출
  3. 서버 종료 또는 서블릿 재로딩 시
    • destroy() 호출, 자원 정리

예시 코드 (라이프사이클 로그)

@WebServlet(value = "/lifecycle", loadOnStartup = 1)
public class LifeCycleTestServlet extends HttpServlet {

    @Override
    public void init() throws ServletException {
        System.out.println("init() 호출: 서블릿 초기화");
    }

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        System.out.println("service() 호출");
        super.service(req, resp);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        System.out.println("doGet() 호출");
        resp.getWriter().println("Lifecycle Test");
    }

    @Override
    public void destroy() {
        System.out.println("destroy() 호출: 자원 반납");
    }
}

암기 포인트

  • init() 은 최초 한 번
  • service() 는 모든 요청마다
  • destroy() 는 종료 시 한 번

01-07. 요약

  1. Servlet은 자바로 작성된 서버 측 프로그램, 대부분 HttpServlet 상속.
  2. 서블릿 컨테이너(Tomcat)가 서블릿의 생명주기를 관리.
  3. 요청 흐름: URL → 컨테이너 매핑 → 서블릿 인스턴스 → service() → `doGet/doPost
  4. ServletConfig: 서블릿 개별 초기값 (<init-param>).
  5. ServletContext: 애플리케이션 공용 초기값 (<context-param>).
  6. Context Path는 애플리케이션을 구분하는 루트 경로.
  7. load-on-startup 을 사용하면 서버 구동 시 서블릿을 미리 로딩 가능.

profile
백엔드

0개의 댓글