Servlet
✒️ 2025-06-21 22:35 내용 수정
Java를 사용하여 웹 페이지를 동적으로 생성하는 서버측 프로그램
- 참고 자료 : 위키백과 자바 서블릿, 코딩팩토리's Web 서블릿(Servlet)이란 무엇인가? 서블릿 총정리
- Java 클래스의 일종으로, Java 코드 안에 HTML을 포함하고 있다.
- Java, 클래스(Classes) 참고.
- 웹 request와 response의 흐름을 간단하게 메서드 호출만으로 체계화시켜준다.
- 비슷한 기술로 perl을 사용한 CGI, PHP를 Apache 웹 서버 프로세스에서 동작시키는 mod_php, IIS에서 동작하는 ASP가 있다.
- JSP보다 먼저 등장한 서버측 기술이며, Servlet의 가독성 및 단점을 보완한 JSP가 이후 개발되었다.
- 때문에 JSP보다 화면 구성 및 HTML 코드 가독성이 떨어진다.
생성 순서
- Servlet class(Java class 형태)로 웹 어플리케이션을 작성한다.
- 확장자가
.java이며, 실행 후엔.class파일을 만든다.
- 확장자가
- Web Container에서 Servlet class로 Servlet 객체를 만들고, 해당 객체를 초기화하여 웹 서비스를 할 수 있는 상태로 만든다.
- 이런 작업을 거친 Servlet 객체를 Servlet이라고 한다.
- 클라이언트로부터 request가 들어오면 이에 맞는 동작을 수행한 후, 클라이언트에게 HTTP 형식으로 response를 한다.
Servlet 동작 과정
- singleton pattern을 따르기 때문에, 생성자가 여러 차례 호출되더라도 실제 생성되는 객체는 하나이며, 최초 생성 이후 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다.
- Servlet Container에서 클라이언트로부터 최초의 request가 들어오면 Servlet 객체(
HttpServletRequest,HttpServletResponse)를 생성한다. - 설정 파일을 참고하여 mapping할 Servlet을 확인한다.
- 해당 객체의 유무를 확인하고 없다면
init()메서드를 통해 생성하고, 존재한다면init()메서드를 통해 초기화한다. - Servlet Container에 Thread를 생성하고,
service()메서드를 실행하여 response를 처리한다. - response를 처리하면
destroy()메서드를 실행하여 Servlet 객체를 제거한다.

Servlet 클래스 작성 규칙
javax.servlet.http.HttpServlet클래스를 상속하고, 해당 클래스는 public이어야 한다.Javax.servlet.Servlet interface를 구현(implements)한 클래스로, 인터페이스를 직접 구현한 것이 아닌 상위 클래스인 GenericServlet 클래스를 통해 간접적으로 구현했다.
- 웹 브라우저로부터 요청이 왔을 때의 동작을
doGet(),doPost()메서드 안에 작성해야 한다. doGet(),doPost()메서드는javax.servlet.HttpServletRequest와javax.servlet.http.HttpServletResponse타입의 매개변수를 받아야 한다.- 두 메서드를 알아서 호출하는
service()메서드를 사용해도 된다. - HTML 문서는
doGet(),doPost()메서드의 두 번째 파라미터를 이용해 출력한다.
HttpServlet 클래스 메서드
- HTTP의 기본 요청 메서드는 HTTP 요청 메서드 참고.
| 메서드 | 설명 |
|---|---|
void init() |
Servlet이 처음에 요청을 처리 하기 전에 호출됨. Servlet을 초기화함 |
doGet(ServletRequest req, ServletResponse res) |
클라이언트로부터 GET 요청을 받았을 때 호출 |
doPost(ServletRequest req, ServletResponse res) |
클라이언트로부터 POST 요청을 받았을 때 호출 |
doPut(ServletRequest req, ServletResponse res) |
클라이언트로부터 PUT 요청을 받았을 때 호출 |
doDelete(ServletRequest req, ServletResponse res) |
클라이언트로부터 DELETE 요청을 받았을 때 호출 |
doHead(ServletRequest req, ServletResponse res) |
클라이언트로부터 HEAD 요청을 받았을 때 호출 |
doOption(ServletRequest req, ServletResponse res) |
클라이언트로부터 OPTIONS 요청을 받았을 때 호출 |
doTrace(ServletRequest req, ServletResponse res) |
클라이언트로부터 TRACE 요청을 받았을 때 호출 |
service(ServletRequest req, ServletResponse res) |
각 요청에 대해 호출됨. 실제 Servlet이 요청하는 로직 구현 |
destroy() |
Servlet이 종료될 때 호출됨. Servlet이 사용한 자원을 정리하고 마무리함 |
getServletInfo() |
Servlet의 정보를 반환 |
Servlet Container
Servlet을 관리해주는 컨테이너
- 참고 자료 : 3기_영이's Servlet과 ServletContainer
- 클라이언트의 요청을 받고 응답할 수 있도록 웹 서버와 socket으로 통신한다.
- Apache Tomcat 등이 있다.
특징
- Servlet의 생명 주기 관리
- Servlet 클래스를 로딩하여 인스턴스화(객체 생성)하고, 초기화 메서드를 호출하여 요청에 맞는 적절한 메서드(
doGet(),doPost()등)를 호출한다. - Servlet의 역할이 끝나면 Garbage Collector를 통해 Servlet을 메모리에서 제거한다.
- Garbage Collector는 메모리 구조 참고.
- Servlet 클래스를 로딩하여 인스턴스화(객체 생성)하고, 초기화 메서드를 호출하여 요청에 맞는 적절한 메서드(
- 웹 서버와의 통신 지원
- 클라이언트의 request를 받고 그에 해당하는 response를 주고 받을 수 있도록 웹 서버와 socket을 만들어 통신한다.
- 멀티스레딩 지원 및 관리
- 해당 Servlet 요청이 들어오면 Java Thread를 새로 생성하여 작업을 수행한다.
- 이를 통해 여러 요청이 들어와도 멀티스레드 환경을 만들어 여러 작업을 동시에 수행할 수 있다.
- request를 수행하고 사용이 끝난 스레드도 관리한다.
- 보안 관리
- Servlet이나 Java 클래스 내에 보안과 관련된 메서드를 구현하지 않아도 보안 관련 기능을 제공한다.
예제
- 집에서 계속 404 에러가 떴는데, 다른 프로젝트의 경로 및 이름 꼬임 문제를 해결하니 갑자기 해결되었다.
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/test")
public class ServletExam extends HttpServlet {
@Override
public void init() throws ServletException {
System.out.println("Servelet 호출됨");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doPost() 호출됨");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet() 호출됨");
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doPost()와 doGet()을 알아서 호출합니다.");
resp.setContentType("text/html; charset=utf-8");
PrintWriter out = resp.getWriter();
out.println("<html>");
out.println("<body>");
out.println("HttpServlet 클래스를 상속 받은 Servlet을 사용합니다.");
out.println("</body>");
out.println("</html>");
}
}