

이번 글에서는 **서블릿(Servlet)**의 생명주기(LifeCycle), 클라이언트 요청 전·후의 서버 동작 방식, 그리고 페이지 이동 방식까지 백엔드 개발의 핵심 개념들을 정리해보려고 합니다. 서블릿 기반 웹 애플리케이션을 만들면서 꼭 알아야 하는 흐름들이기 때문에, 처음 서블릿을 접하는 분들께 도움이 되었으면 합니다.

1. Servlet API 스펙 이해하기
서블릿은 자바 EE 스펙의 일부이며, 브라우저와 서버 간의 요청과 응답을 처리하는 자바 클래스입니다. 개발자가 직접 인스턴스를 생성하지 않고, WAS(Web Application Server)가 자동으로 객체를 생성하고 생명주기를 관리해줍니다.
서블릿을 구현할 때 가장 기본이 되는 클래스와 인터페이스는 다음과 같습니다:
- Servlet (interface)
- ServletConfig (interface)
- GenericServlet (abstract class)
- HttpServlet (abstract class) ← 우리가 실제로 가장 많이 상속받는 클래스

2. 서블릿의 라이프사이클 (LifeCycle)
서블릿 객체의 생명주기는 크게 3가지 주요 메소드로 나뉘며, WAS에 의해 관리됩니다.
| 초기화 | init() | 서블릿이 생성된 후 최초 1회만 호출됨. 초기 설정 수행 |
| 요청 처리 | service() → doGet() / doPost() | 클라이언트 요청마다 호출됨 |
| 종료 | destroy() | WAS가 종료되거나 서블릿이 내려갈 때 호출됨 |
HttpServlet 클래스는 service() 메소드 내부에서 요청 메서드 타입(GET/POST 등)에 따라 doGet() 또는 doPost()를 자동으로 호출합니다.

3. Lazy Loading vs Pre Loading
- Lazy Loading (지연 로딩)
서블릿은 최초의 클라이언트 요청이 들어올 때 생성됩니다. 이는 디폴트 방식입니다. - Pre Loading (선 로딩)
클라이언트 요청 전에 서블릿을 미리 생성하고 초기화합니다. 성능이나 빠른 응답이 필요한 경우 사용하며, 다음과 같이 설정합니다:
@WebServlet(urlPatterns = {"/Life"}, loadOnStartup = 1)
혹은 web.xml에서:
<servlet>
<servlet-name>Life</servlet-name>
<servlet-class>com.example.LifeCycleServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

4. HTTP 요청 방식: GET vs POST
| 목적 | 페이지 요청 | 데이터 전송 및 처리 |
| 특징 | 주소창에 파라미터 노출 | 파라미터가 주소창에 노출되지 않음 |
| 데이터 용량 | 제한 있음 | 상대적으로 제한 없음 |
| 보안성 | 낮음 | 높음 (비교적) |
| 대표 예시 | 검색, 목록 조회 | 로그인, 회원가입 |
a href="" 태그는 기본적으로 GET 방식입니다.
form 태그의 method="get" 또는 "post" 설정에 따라 요청 방식이 결정됩니다.

5. 요청과 응답의 흐름
클라이언트 요청 전 (Ready On 상태)
- 서블릿 클래스 로딩
- 서블릿 객체 생성 (new)
- init() 호출 → 초기화
- 서블릿 준비 완료 (Ready On)
클라이언트 요청 시 (매 요청마다 반복)
- 요청이 들어오면 request, response, thread 객체 생성
- service() → doGet() or doPost() 호출
- 처리 결과 응답
- request, response, thread 객체 소멸
서버 종료 시
- destroy() 호출 → 서블릿 종료
요청마다 서블릿 객체가 새로 생성되지 않습니다.
생성된 서블릿은 계속 살아 있고, 요청마다 새로운 쓰레드와 request/response 객체가 만들어지는 구조입니다.

6. 페이지 이동 방식: Forward vs Redirect
| 동작 위치 | 서버 내부 | 클라이언트 브라우저 |
| URL 변경 | X | O |
| 사용 목적 | 내부 페이지 이동 | 외부 페이지 이동, 새 요청 |
| 성능 | 빠름 | 느림 (1회 추가 요청 필요) |
| 예시 | 로그인 후 메인페이지 이동 | 게시글 등록 후 목록 이동 |
// Forward 예시
RequestDispatcher dis = request.getRequestDispatcher("result.jsp");
dis.forward(request, response);
// Redirect 예시
response.sendRedirect("list.jsp");
일반적으로 단순 조회나 검색 기능은 forward,
중복 전송 방지나 새 페이지 요청은 redirect를 사용합니다.

7. 서블릿 컨트롤러(doProcess) 패턴
모든 서블릿 로직은 doGet() 또는 doPost()에 넣지 않고, 공통 메소드인 doProcess()를 통해 분리하여 유지보수성을 높입니다.
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1. 한글 인코딩 처리
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
// 2. 폼값 받기
String name = request.getParameter("name");
// 3. DAO 호출
ProductVO vo = productDAO.getProduct(name);
// 4. 결과 바인딩
request.setAttribute("vo", vo);
// 5. 페이지 이동
RequestDispatcher dis = request.getRequestDispatcher("productResult.jsp");
dis.forward(request, response);
}
doGet()과 doPost()에서는 이렇게 doProcess()를 호출해줍니다:
마무리 정리
- 서블릿은 자바 클래스지만, 직접 객체를 생성하지 않고 WAS가 관리
- LifeCycle 메소드 (init, service, destroy)는 자동 호출
- 요청 처리 방식은 GET(단순 연결) vs POST(데이터 전달)
- 페이지 이동 방식은 forward(내부 이동) vs redirect(외부 요청)
- PreLoading 설정을 통해 성능을 미리 확보 가능
'Web' 카테고리의 다른 글
| 서블릿의 핵심 개념 정리 (Attribute, 페이지 이동, Controller 구현, DB 연동) (1) | 2025.07.02 |
|---|---|
| 서블릿(Servlet)이란? (4) | 2025.06.30 |