서블릿을 이해하기전에..
서블릿(Servlet) 이란 Java를 사용하여 동적 웹 컨텐츠를 생성하는 서버 측 프로그램이다. 즉, Java로 만든 CGI 프로그램이라 할 수 있다.
그러니 서블릿을 이해하기에 앞서, 우선 CGI(Common Gateway Interface) 가 무엇인지부터 알아보자.
CGI란?

CGI(Common Gateway Inteface)는 웹 서버가 외부 프로그램을 실행할 수 있도록 해주는 표준 인터페이스이다.
위 그림처럼, 사용자가 웹 브라우저로 요청을 보내면:
- 웹 서버(Apache 등)는 이 요청을 CGI 프로그램에 전달하고,
- CGI 프로그램은 요청을 처리한 후, 웹 서버에 실행 결과를 전달하면,
- 웹 서버는 그 결과를 웹 브라우저. 즉, 사용자에게 응답하는 방식
하지만, 이런 CGI 방식에는 문제점이 있다. 웹 서버는 요청을 받을 때마다 해당 CGI 프로그램을 새로운 프로세스로 실행시킨다는 것이다.

- 브라우저에서 http://example.com/cgi-bin/hello.cgi?name=John 요청
- 웹 서버는 hello.cgi 스크립트를 실행시키고, name=John을 인자로 전달
- hello.cgi는 Hello, John이라는 결과를 출력 (HTML 포함)
- 웹 서버는 그 출력을 클라이언트에게 응답
이런 방식은 성능 문제와, 또 각 요청이 독립적인 프로세스이기 때문에 세션 관리가 불편하다는 단점이 있다. 이러한 점들을 해결하기 위해 나온것이 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가지 상태를 가진다.
- init() : 최초 1회만 실행 -> 초기화 작업 수행
- service() : 클라이언트의 요청마다 실행 -> doGet(), doPost() 등의 메서드를 내부적으로 호출
- 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("안녕하세요, 서블릿!");
}
}
[실행 흐름 요약]
- 브라우저가 http://localhost:8080/hello 로 요청
- Tomcat 같은 Servlet 컨테이너가 요청을 받고, /hello 와 매핑된 서블릿 호출
- deGet() 또는 doPost() 실행
- 결과를 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 의 구조를 한눈에 보여주는 그림을 보아서 참조해보았다. (감사합니다.)

'서블릿(Servlet)' 카테고리의 다른 글
| [Servlet] Front Controller 패턴 적용 (0) | 2025.04.23 |
|---|---|
| [Web] Redirect vs Forward 차이점 정리 (0) | 2025.04.22 |