1. Servlet?
1.1 정의
웹페이지를 동적으로 생성하고 웹 서버의 성능을 향상하기 위해 사용하는 자바 프로그램이다.
쉽게 풀어 쓰자면 클라이언트의 요청을 처리하고 응답을 생성하는 자바의 클래스라고 할 수 있다. 즉, 요청과 응답에 대한 로직을 개별적으로 구현하기엔 너무 복잡하기에 개발자의 요청, 응답처리를 간편하게 도와준다.
1.2 특징
- JSP와의 차이 - JSP는 HTML안에 자바 코드가, 서블릿은 자바 코드안에 HTML을 포함하는 차이가 있다.
- 스레드 사용 - 외부요청에 프로세스 대신 경량의 스레드로 응답하기 때문에 가볍다.
- 동적 웹 페이지 생성 - 클라이언트의 요청에 따라 서비스를 제공하고 응답
- 서블릿 컨테이너에 의존적 - 클라이언트의 요청을 서블릿 컨테이너가 받고 적절한 서블릿에게 전달
- 보안 강화 - 서버 측에서 실행되기 때문에 보안 이슈가 적다.
- 컨트롤러 역할 - 서블릿내의 코드를 컨트롤러의 역할을 하도록 변경해서 사용. 대표적으로 Spring MVC의 Dispatcher Servlet이 있음
- HTML을 통한 응답 - SSR(Server Side Rendering)이기 때문에 서버에서 렌더링을 마치고 응답을 보내준다.
1.3 Servlet의 간략한 계층 구조와 주요 메서드

- init() : 서블릿 초기화 시 호출되는 메서드
- service() : 클라이언트의 요청을 처리하는 메서드. 실제로 서블릿이 동작하는 시점에 호출
- destroy() : 서블릿 소멸 시 호출되는 메서드
- doGet() ~ doDelete() : 클라이언트의 요청 방식(get, post, put, delete)에 따라 요청을 처리하는 메서드
웹에선 일반적으로 HTTP 통신을 하기 때문에 주로 HttpServlet(http 관련 기능 제공)을 상속받아 구현한다.
2. Servlet Container?
2.1 정의
요청 URL에 매핑된 서블릿을 호출하며 서블릿의 생명주기 및 전반 부분을 관리한다.
즉, 서블릿 컨테이너는 서블릿으로 부터 독립적인 개체가 아니라 서블릿과 상호작용하는 존재다.
2.2 역할과 특징
- 서블릿 관리 - 가장 중요한 역할, 서블릿의 생명주기와 전반을 관리
- 내부 스레드풀 관리 - 요청마다 스레드를 생성하는 것은 비용이 크기 때문에 스레드풀로 스레드를 관리
- 네트워크 통신 : HttpServletReuquest, HttpServletResponse 객체를 생성해 요청을 파싱하여 서블릿과 상호작용
- 보안, 인증 관리 : 서블릿 컨테이너는 자체적으로 보안 및 인증을 처리하는 기능을 제공한다.
3. 서블릿의 생명주기와 컨테이너의 작동 방식

0. 서블릿의 생명주기
서블릿의 생성시점은 서버의 설정에 따라 다르다. 로딩시점, 최초 요청 시점 등 설정에 따라 달라진다.
다만, 서버가 열리고 닫힐 때 또는 매핑된 서블릿을 해제하는 경우에만 생성과 소멸이 일어난다. 즉, 요청마다 서블릿이 생성되고 소멸되는게 아니라는 얘기이다.
1. 서블릿은 최초 init()을 통해 생성이 되고
2. service() 실행하며 요청을 처리하고 응답한다.
3. destroy()를 통해 서블릿 객체는 소멸된다.
1. 요청 데이터 처리
클라이언트로 부터 요청(URI)를 전달받은 컨테이너는 HttpServletRequest, HttpServletResponse 두 객체를 생성해 요청 메시지를 파싱한다. 이 때 두 객체는 요청 마다 생성하고 응답 시 소멸한다.
2. 요청 URL에 매핑된 서블릿 탐색
배포서술자(DD)를 통해 매핑된 서블릿을 호출한다. 이 때 해당 서블릿 객체가 메모리에 적재돼 있지 않다면 init()으로 서블릿 객체를 생성하고 초기화 해준다. 메모리에 적재돼 있는 경우는 생성돼 있는 서블릿 객체를 호출 한다. 즉, 서블릿 객체는 스프링의 빈처럼 싱글톤으로 관리가 된다.
3. Servlet을 구현한 객체에서 service() 실행
서블릿을 구현한 객체는 service()를 실행해 요청을 처리한다. 이 때 doGet, doPost, doPut, doDelete 등 요청 방식에 적절한 메서드를 호출해 처리한다.
4. 3.에서 처리된 요청을 html로 응답
요청에 맞는 결과 값을 html로 처리해 HttpServletResponse객체에 응답한다.
5. HttpServletRequest, HttpServletResponse의 소멸
두 객체는 서블릿과 다르게 요청에 따라 생성, 소멸한다.
4. 정리
서블릿과 서블릿 컨테이너는 기존 HTTP의 요청을 처리하고 응답하는 과정이 반복적이고 복잡했기 때문에 해당 부분을 해결하기 위해 탄생한 기술들이다. 개발자가 비즈니스 로직에만 집중 할 수 있도록 도와주는 도구로 생각하고 학습하면 이해가 빠를듯 하다.
'Java' 카테고리의 다른 글
Java - List의 제네릭 타입이 달라도 오버로딩은 불가하다. (0) | 2023.10.03 |
---|---|
Java - List vs Map (0) | 2023.09.21 |
Java - 얕은 복사 vs 깊은 복사(shallow copy vs deep copy) (0) | 2022.12.07 |
String vs StringBuffer vs Stringbuilder (0) | 2022.11.01 |
Java 입력방법 2가지 (0) | 2022.09.01 |