본문 바로가기

서블릿(Servlet)

[Web] 서블릿(Servlet) 기본 구조 정리

서블릿을 이해하기전에..

서블릿(Servlet) 이란 Java를 사용하여 동적 웹 컨텐츠를 생성하는 서버 측 프로그램이다. 즉, Java로 만든 CGI 프로그램이라 할 수 있다.

그러니 서블릿을 이해하기에 앞서, 우선 CGI(Common Gateway Interface) 가 무엇인지부터 알아보자.

CGI란?

 

CGI(Common Gateway Inteface)웹 서버가 외부 프로그램을 실행할 수 있도록 해주는 표준 인터페이스이다.

위 그림처럼, 사용자가 웹 브라우저로 요청을 보내면:

  1. 웹 서버(Apache 등)는 이 요청을 CGI 프로그램에 전달하고,
  2. CGI 프로그램은 요청을 처리한 후, 웹 서버에 실행 결과를 전달하면,
  3. 웹 서버는 그 결과를 웹 브라우저. 즉, 사용자에게 응답하는 방식

하지만, 이런 CGI 방식에는 문제점이 있다. 웹 서버는 요청을 받을 때마다 해당 CGI 프로그램을 새로운 프로세스로 실행시킨다는 것이다.

  1. 브라우저에서 http://example.com/cgi-bin/hello.cgi?name=John 요청
  2. 웹 서버는 hello.cgi 스크립트를 실행시키고, name=John을 인자로 전달
  3. hello.cgi는 Hello, John이라는 결과를 출력 (HTML 포함)
  4. 웹 서버는 그 출력을 클라이언트에게 응답

이런 방식은 성능 문제와, 또 각 요청이 독립적인 프로세스이기 때문에 세션 관리가 불편하다는 단점이 있다. 이러한 점들을 해결하기 위해 나온것이 Servlet 인 것이다.


서블릿(Servlet) 이란

앞선 CGI의 단점을 보완한 Java로 작성된 서버 측 프로그램이라 생각하면 이해가 편하다.

  • 요청마다 새로운 프로세스가 생성됨 (CGI) -> 멀티 스레드로 해결
  • 해당 스레드는 누가 생성하고 관리? -> 컨테이너의 등장

서블릿 역시 클라이언트의 요청을 받아서, 처리 후 응답을 생성하는 역할을 한다.

 

[Servlet 의 특징]

  • Java 기반의 웹 컴포넌트
  • 동적으로 웹 페이지를 생성
  • javax.servlet 또는 jakarta.servlet API를 사용하여 구현

Servlet 기본 구조

서블릿을 만들기 위해서는 일반적으로 HttpServlet 클래스를 상속해서 만든다. 아래는 HttpServlet 클래스의 일부이다.

public abstract class HttpServlet extends GenericServlet {
	...

    public HttpServlet() {
    }

    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        this.legacyHeadHandling = Boolean.parseBoolean(config.getInitParameter("jakarta.servlet.http.legacyDoHead"));
    }
    
    ...

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String protocol = req.getProtocol();
        String msg = lStrings.getString("http.method_get_not_supported");
        resp.sendError(this.getMethodNotSupportedCode(protocol), msg);
    }
    
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String protocol = req.getProtocol();
        String msg = lStrings.getString("http.method_post_not_supported");
        resp.sendError(this.getMethodNotSupportedCode(protocol), msg);
    }
    
    ...
}

 

위와 같은 HttpServlet 클래스를 상속받아, doGet, doPost 등의 메서드를 오버라이딩하여 할 수 있는데, 매개변수는 각각 응답과 요청의 정보를 담고있다.

  • HttpServletRequest : 요청 정보 (ex. 파라미터, 헤더 등)
  • HttpServletResponse : 응답을 담을 객체 (ex. HTML, JSON, 상태코드 등)

아래처럼 오버라이딩 해서 사용하면 된다.

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;

public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        resp.setContentType("text/html");
        resp.getWriter().println("<h1>Hello, Servlet!</h1>");
    }
}

 

Servlet 의 생명주기

위와 같이 생성된 Servlet은 3가지 상태를 가진다.

  1. init() : 최초 1회만 실행 -> 초기화 작업 수행
  2. service() : 클라이언트의 요청마다 실행 -> doGet(), doPost() 등의 메서드를 내부적으로 호출
  3. destory() : Servlet 이 제거될 때 호출 -> 자원 정리 용도
@Override
public void init(ServletConfig config) throws ServletException {
    log.info("before init!");
    super.init(config);
}

@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    log.info("before service!");
    super.service(req, resp);
}

@Override
public void destroy() {
    log.info("before destroy!");
    super.destroy();
}

Servlet 사용 방법

Servlet 을 사용하려면 위 처럼 Servlet 클래스를 작성하고, web.xml에 등록하거나, @WebServlet 어노테이션을 사용하여 서블릿을 등록시켜주는 작업이 필요하다.

 

먼저, web.xml 에 등록하는 방법은 Jakarta EE 로 생성된 프로젝트의 web.xml 에 작성한 Servlet 클래스의 정보를 기입하면 된다.

 

 

다른 방법으로는 @WebServlet 어노테이션을 사용하면 된다. 아래와 같이 어노테이션을 활용하면 번거롭게 xml에 일일이 작성하지 않아도 되므로 이 방법을 사용하도록 하자.

@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        resp.getWriter().write("안녕하세요, 서블릿!");
    }
}

 

 

[실행 흐름 요약]

  1. 브라우저가 http://localhost:8080/hello 로 요청
  2. Tomcat 같은 Servlet 컨테이너가 요청을 받고, /hello 와 매핑된 서블릿 호출
  3. deGet() 또는 doPost() 실행
  4. 결과를 HTML/JSON 으로 응답

정리

Servlet

  • Java를 사용하여 동적 웹 컨텐츠를 생성하는 서버 측 프로그램
  • CGI 단점 해결 -> Servlet Container 도입

Servlet Container

  • Servlet 의 생명주기를 관리하고, URL과 특정 서블릿을 맵핑 하며 URL 요청 처리
  • Java EE 아키텍처에 속함

Java EE

  • Java 언어로 엔터프라이즈 애플리케이션을 개발하고 운영할 수 있도록 지원해주는 플랫폼

WAS

  • Web Application Server
  • = Servlet Container

Tomcat

  • apache 재단에서 만든 WAS 중 하나
  • Servlet Container의 reference 구현
  • 사실상, Servlet Container = WAS = Tomcat

 

위 Servlet 의 구조를 한눈에 보여주는 그림을 보아서 참조해보았다. (감사합니다.)

출처 : https://mangkyu.tistory.com/14

 

 

'서블릿(Servlet)' 카테고리의 다른 글

[Servlet] Front Controller 패턴 적용  (0) 2025.04.23
[Web] Redirect vs Forward 차이점 정리  (0) 2025.04.22