[Spring] Servlet LifeCycle

배창민·2025년 10월 1일
post-thumbnail

Servlet LifeCycle

Servlet = Server + Applet
Java로 작성된 서버 측 동적 웹 컴포넌트. 클라이언트 요청을 받아 처리하고 응답을 생성. 톰캣 같은 Servlet 컨테이너가 생명주기를 관리.


0) 핵심 개념 맵

구분한 줄 요약키워드
Servlet요청 처리 클래스HttpServlet, doGet/doPost, service
컨테이너서블릿 관리자생명주기(init→service→destroy), 스레드, 풀
배포 기술서앱 전역 설정WEB-INF/web.xml, 매핑/필터/보안
매핑URL ↔ 서블릿 연결web.xml, @WebServlet
초기값환경 설정 주입ServletConfig(개별), ServletContext(전역)

1) 역사 & 버전 한 줄 요약

  • 2.5 (Java EE 5): @WebServlet애노테이션 설정 도입
  • 3.0 (EE 6): 비동기(Async), 동적 등록
  • 3.1 (EE 7): 논블로킹 I/O
  • 4.0 (EE 8): HTTP/2 & Server Push
  • 5.0 (Jakarta EE 9): javax.* → jakarta.* 네임스페이스 전환
  • 6.0 (Jakarta EE 10): 스펙 통합·개선

최신 프레임워크/서버는 jakarta.servlet.* 네임스페이스를 사용.


2) 설계 규약 (implements/extends)

  • 모든 서블릿은 javax.servlet.Servlet 계열 규약을 따름
  • HTTPHttpServlet 상속 사용
  • 예외는 ServletException 활용

3) 동작 구조 & 컨테이너

  • 컨테이너(예: Tomcat) 가 서블릿 로드 → 생명주기 관리 → 쓰레드로 요청 분배
  • 설정은 주로 web.xml(DD) 또는 애노테이션으로 처리

4) 배포서술자(DD: WEB-INF/web.xml)

  • 앱 전역 설정 파일(매핑, 필터, 보안, 세션, 에러 페이지 등)

자주 쓰는 태그만 기억:

  • <servlet>, <servlet-mapping>
  • <context-param>(앱 전역 파라미터)
  • <filter>, <error-page>, <welcome-file-list>, <session-config>

5) Servlet 매핑

5-1) web.xml 매핑

<servlet>
  <servlet-name>xmlmapping</servlet-name>
  <servlet-class>com.example.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>

5-2) 애노테이션 매핑

import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;

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

주의: 매핑 중복/누락은 서버 부팅 실패 원인.


6) 서블릿 초기값

6-1) ServletConfig (개별 서블릿용)

<servlet>
  <servlet-name>conf</servlet-name>
  <servlet-class>com.example.ConfigServlet</servlet-class>
  <init-param>
    <param-name>encoding</param-name>
    <param-value>UTF-8</param-value>
  </init-param>
</servlet>
String enc = getServletConfig().getInitParameter("encoding");

6-2) ServletContext (앱 전역)

<context-param>
  <param-name>cdnBaseUrl</param-name>
  <param-value>https://cdn.example.com</param-value>
</context-param>
String cdn = getServletContext().getInitParameter("cdnBaseUrl");

7) 컨텍스트 경로(Context Path)

  • 접근 경로: http://localhost:{PORT}/{프로젝트별칭}/{서블릿매핑}
  • 별칭은 보통 Tomcat server.xml<Context> 설정을 따름

예) http://localhost:8800/first/test1.do


8) LifeCycle (init → service → destroy)

  1. init(): 최초 1회(또는 load-on-startup)
  2. service(): 요청마다 호출 → 내부에서 doGet()/doPost() 분기
  3. destroy(): 서버 종료/재배포 시 자원 반납

첫 요청 지연을 줄이려면 load-on-startup 로 미리 로딩.


9) 최소 예제(구조)

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws IOException {
        resp.setContentType("text/plain;charset=UTF-8");
        resp.getWriter().println("Hello, Servlet!");
    }
}

10) 정리

  • 매핑 충돌 없는지(중복 URL/서블릿명)
  • 문자 인코딩/콘텐츠 타입 설정
  • 전역/개별 초기 파라미터 구분 사용
  • init에서 무거운 자원 생성, destroy에서 안전하게 반납
  • javax.* / jakarta.* 네임스페이스 혼용 주의

“서블릿은 컨테이너가 관리하는 요청 핸들러”.
URL 매핑과 생명주기만 확실히 잡으면, 나머지는 DD(또는 애노테이션) + HttpServlet 오버라이드로 깔끔하게 정리 가능.

profile
개발자 희망자

0개의 댓글