Servlet

2025. 5. 29. 15:30Server

Servlet

  • Server + Applet의 합성어 (Applet = Application + let (작은) = 작은 애플리케이션)
  • 자바 서블릿(Java Servlet) : 자바를 사용하여 웹페이지를 동적으로 생성하는 서버측 프로그램
  • 웹 컨테이너에서 실행되는 자바 기반 웹 컴포넌트
  • 클라이언트 요청 처리 후 동적 응답(HTML) 생성
  • 멀티스레드 환경에서 효율적 처리

1. 배포 서술자(web.xml)을 이용한 서블릿 등록/매핑

  • web.xml
    • 웹 애플리케이션 배포 서술자(Deployment Descriptor)
    • 웹 애플리케이션의 설정 정보를 담은 XML 파일
    • 서블릿, 필터, 리스너 등의 구성 요소 등록 및 매핑
    • Tomcat 등의 웹 컨테이너가 시작 될 때 읽음
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
         http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

  <!-- Servlet 등록
    - Servlet 컴포넌트 클래스 정보를 웹 컨테이너에게 알려줌
    - 클래스 정보가 길기 때문에 별칭(helloServlet) 등록
  -->
  <servlet>
    <servlet-name>helloServlet</servlet-name>
    <servlet-class>org.package.HelloServlet</servlet-class>
  </servlet>

  <!-- Servlet 매핑
    - "/hello-servlet" 주소 요청 시
      웹 컨테이너에 등록된 Servlet 중 별칭이 "helloServlet"인 클래스를 찾음
      -> Servlet Container가 해당 클래스를 객체로 만들어서 관리(Servlet Life Cycle)
  -->
  <servlet-mapping>
    <servlet-name>helloServlet</servlet-name>
    <url-pattern>/hello-servlet</url-pattern>
  </servlet-mapping>
</web-app>

<!-- web.xml 수정 후에는 반드시 웹서버를 재기동 필요 -->

2. @WebServlet 어노테이션을 이용한 서블릿 등록/매핑

  • XML 파일 대신 자바 코드에 직접 설정
  • 코드와 설정의 통합 관리
  • 동적 로딩: 서버 재시작 없이 반영 (개발 모드)
@WebServlet("/hello-servlet")
// 복수 매핑: @WebServlet(name="helloServlet", urlPatterns={"/xxx", "/yyy"})
// value 속성 사용 : @WebServlet(name="helloServlet", value={"/aaa", "/bbb"})
public class HelloServlet extends HttpServlet {
    // 서블릿 코드
}

서블릿 핵심 API

  • Apache + Tomcat 요청/응답 구조
    • 웹 컨테이너에서 URL 요청에 맞는 Servlet을 실행
    • 요청 처리 결과를 HTML 형태로 구성하여 클라이언트에게 응답
  • **[웹 브라우저]** ↔ **[Apache httpd]** ↔ **[Tomcat]** ↔ **[Database]** HTTP 요청/응답 웹 컨테이너 데이터 처리

  • HttpServletRequest
    • HTTP 요청의 모든 정보(클라이언트 요청, 쿠키, 세션 등)를 제공하는 인터페이스
    • HttpServletRequest 주요 메서드
메서드 설명
getHeader(String name) HTTP 헤더 값 조회
getParameter(String name) 요청 파라미터 값 조회
getParameterNames() 모든 파라미터 이름 조회
getRequestURI() 요청 URI 조회
getServletPath() 서블릿 경로 조회
getSession() 세션 객체 조회
setAttribute(String, Object) 속성 설정
getAttribute(String) 속성 조회
  • HttpServletResponse
    • HTTP 응답의 내용(HTML, JSON 등), 헤더, 쿠키, 상태 코드 등을 설정하여 제공하는 인터페이스
    • Servlet으로 들어온 요청은 텍스트(HTML)로 응답을 보내기 때문에 출력 스트림을 받기 위해 주로 response로부터 writer 객체를 얻어서 내보낸다
    • HttpServletResponse 주요 메서드
메서드 설명
setContentType(String) 응답 콘텐츠 타입 설정
getWriter() 문자 출력 스트림
getOutputStream() 바이너리 출력 스트림
sendRedirect(String) 리다이렉트 처리
addHeader(String, String) 응답 헤더 추가
setStatus(int) HTTP 상태 코드 설정

생명주기(Life Cycle)

Servlet 생명주기 (JSP도 같음)

  1. 클라이언트가 URL을 이용채 서버에 요청 시 HTTP RequestServlet Container로 전송
  2. HTTP Request를 전송 받은 Servlet ContainerHttpServletRequest(요청), HttpServletResponse(응답) 객체를 생성
  3. DD (배포서술자, Deployment Descriptor, web.xml)를 이용해
    요청 URL을 분석하여 어떤 Servlet Class가 요청을 처리할지 찾음
  4. 요청이 들어오면 Servlet 클래스가 로딩되어 Servlet 객체 생성
  5. 서버가 메소드를 init()을 호출하여 Servlet을 초기화
  6. service() 메소드가 호출되어 Servlet이 브라우저의 요청을 처리
  7. service() 메소드는 요청 유형에 따라 해당하는 HTTP 요청(GET, POST 등)을 처리하는 메서드(doGet(), doPost() 등)를 호출
    → 해당 메서드에서 응답을 위한 동적 콘텐츠 생성 코드(java, html)를 작성
  8. HttpServletResponse 객체를 이용해 클라이언트에게 응답을 돌려줌\
  9. 서버가 destroy() 메소드를 호출하여 Servlet을 제거

동일한 로직과 결과를 반복적으로 수행하는 작업은 init() 메서드에서 한 번만 처리

각 메서드 역할

  • init() 메서드:
    • 호출 시점: 서블릿 인스턴스 최초 생성 시 1번만
    • 용도: 초기화 작업 (DB 연결, 설정 파일 로딩)
  • service() 메서드:
    • 호출 시점: 클라이언트 요청마다 매번
    • 용도: 응답을 위한 동적 콘텐츠 생성
    • 분기: HTTP 메서드에 따라 doGet(), doPost() 호출
  • destroy() 메서드:
    • 호출 시점: 서블릿 인스턴스 소멸 시 1번만(코드 변경 등의 상황으로 재배포될 때)
    • 용도: 리소스 정리 (DB 연결 해제, 파일 닫기)

참고자료

'Server' 카테고리의 다른 글

JSP  (1) 2025.05.29
WA (Web Application)  (1) 2025.05.29