이론/백엔드 개념정리
Servlet이란?
블스뜸
2025. 5. 4. 21:03
Servlet
Servlet은 HTTP 프로토콜 기반의 요청(Request) 및 응답(Response)을 처리하는 데 사용되는 Java 기술이다. Java에서 Servlet은 javax.servlet.http.HttpServlet 클래스를 상속받아 구현되며, 웹 애플리케이션 개발의 핵심 구성 요소 중 하나이다.
Servlet의 역할 예시
클라이언트가 HTTP POST 요청을 통해 HTML Form 데이터를 서버에 전송하는 상황을 가정해 보자 (예: 회원 가입).
- HTTP Request Message 예시:
-
POST /api/users HTTP/1.1 Host: localhost:8080 Content-Type: application/x-www-form-urlencoded userId=아이디&pssword=비밀번호 - HTTP Response Message 예시:
-
HTTP/1.1 200 OK Content-Type: text/html;charset=UTF-8 Content-Length: 3423 <html> <body> ... </body> </html>
서버에서 처리해야 하는 작업
서버는 클라이언트의 HTTP 요청을 받아 다음과 같은 작업을 처리해야 한다.
- 서버와 TCP/IP 연결 설정
- HTTP Request Message를 필요한 형태로 변환하여 읽기
- HTTP Method 및 URL 분석
- HTTP Header 분석
- HTTP Message Body 읽기 및 변환
- 분석한 결과를 통해 프로세스 실행
- 비즈니스 로직 실행
- HTTP Response Message 생성
- HTTP Start Line 생성
- Header 생성
- HTTP Message Body에 응답 데이터를 요청한 형식에 맞춰 작성
- 처리가 불가하다면 예외 처리
- 응답 전달
- 연결 종료
Servlet의 역할: 위 서버 처리 과정에서 1, 2, 3 (일부) 과 5, 6, 7번은 Servlet Container가 처리해주며, 개발자는 비즈니스 로직 (3번의 핵심) 구현에 집중할 수 있다.
Servlet 동작 순서
클라이언트가 localhost:8080/example HTTP API를 호출했을 때 일어나는 과정은 다음과 같다.
- Servlet 예시 코드 (현재는 어노테이션 방식으로 주로 사용하여 현대에는 사용하지 않음)
@WebServlet(name="ExampleServlet", urlPatterns = "/example") public class ExampleServlet extends HttpServlet { // HttpServlet을 상속받아 구현한다. @Override protected void service( HttpServletRequest request, // HTTP 요청 정보를 쉽게 사용할 수 있게 만드는 Servlet HttpServletResponse response // HTTP 응답 정보를 쉽게 제공할 수 있게 만드는 Servlet ) { // application logic } }
- WAS는 수신된 HTTP 요청 메시지를 기반으로 새로운 HttpServletRequest와 HttpServletResponse 객체를 생성한다.
- WAS는 생성된 Request와 Response 객체를 서블릿 컨테이너에 전달하며, @WebServlet 설정에 따라 /example URL에 매핑된 ExampleServlet 객체의 service() 메서드를 호출한다.
- ExampleServlet의 service() 메서드 내에서 비즈니스 로직이 처리된다.
- 개발자는 response 객체를 사용하여 HTTP 응답에 필요한 정보 (Content Type, 응답 데이터 등)를 입력한다.
- WAS는 response 객체에 담긴 정보를 바탕으로 HTTP 응답 메시지를 생성하여 클라이언트에게 전송한다.
개발자가 하는 일
- HttpServletRequest 객체에 담겨 있는 HTTP 요청 정보를 꺼내서 사용한다 (요청 URL, Method, Header, Message Body 등).
- 요청 정보를 기반으로 필요한 기능 (비즈니스 로직)을 수행한다.
- 생성된 HttpServletResponse 객체에 HTTP 응답 정보를 입력한다 (응답 데이터, Content Type 등).
Servlet Container
- Servlet을 지원하는 WAS 내부에는 서블릿 컨테이너가 존재한다.
- 서블릿 컨테이너는 서블릿의 생명주기 (초기화, 생성, 관리, 호출, 종료) 전체를 관리하는 역할을 수행한다.
Servlet의 생명주기
- Servlet 객체의 생성 및 관리는 개발자가 직접 하는 것이 아니라 서블릿 컨테이너가 담당한다.
- WAS (서블릿 컨테이너 포함)가 시작될 때 서블릿이 초기화되고, 클라이언트의 첫 요청 시 (또는 WAS 설정에 따라) 서블릿 객체가 생성된다.
- 이후 들어오는 동일한 URL에 대한 요청에 대해서는 서블릿 컨테이너가 생성해 둔 서블릿 객체를 재활용 (싱글톤) 한다.
- WAS가 종료될 때 Servlet 객체도 함께 소멸된다.
Servlet Container가 하는 일
- 서블릿 초기화 (init() 메서드 호출)
- 서블릿 객체 생성 (service() 메서드 호출을 위한 객체 생성)
- 서블릿 관리 (생성된 객체 유지 및 재사용)
- 클라이언트 요청 시 서블릿 메서드 호출 (service(), doGet(), doPost() 등)
- 서블릿 종료 (destroy() 메서드 호출)
- 서블릿 객체를 싱글톤으로 관리하여 효율적인 자원 관리를 수행한다.
- 동시 요청 처리를 위해 Multi Thread를 지원한다 (각 요청마다 새로운 스레드를 생성하여 처리).