목차
Servlet
정의 :
Java 언어로 작성된 서버 측 프로그램으로, 클라이언트의 요청(주로 HTTP 요청, Request)을 받아 처리한 후, 그에 대한 응답(Response)를 처리하는 역할을 합니다.
- 웹 서버와 클라이언트(브라우저) 사이의 중개자 역할을 하며, 동적인 웹 페이지를 생성할 수 있게 해줍니다.
- 웹 어플리케이션 개발의 핵심 기술중 하나입니다.
특징 :
- Java EE (Jakarta EE) 표준 API 중 하나
- `javax.servlet` 혹은 `jakarta.servlet` 패키지 사용
- HTML, JSON, XML 등 다양한 형식의 응답 생성 가능
- 서블릿 클래스는 `HttpServlet` 클래스를 상속받아 구현
역할 :
- HTTP POST 요청으로 HTML Form 데이터를 전송하는 상황 예시
ex) 회원가입 : `POST + localhost:8080/api/users`
- 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>
- 서버에서 처리해야 하는 작업 (다음 7단계)
- 서버와 TCP/IP 연결
- HTTP Request Message 필요한 형태로 변환하여 읽기
- HTTP Method 및 URL 분석
- HTTP Header 분석
- HTTP Message Body 읽기 및 변환
- 분석한 결과를 통해 프로세스 실행
- 비지니스 로직 실행
- HTTP Response Message 생성
- HTTP Start Line 생성
- Header 생성
- HTTP Message Body에 응답 데이터를 요청한 형식에 맞춰 응답
- 처리가 불가하다면 예외처리
- 응답 전달
- 연결 종료
- Servlet을 지원하는 WAS(Web Application Server)를 사용한다면?
- 위의 7단계 중 비지니스 로직에만 집중하면 됩니다.
Servlet 동작 순서
1. 클라이언트 요청 (HTTP Reqeust)
- 사용자가 웹 브라우저에서 URL을 입력하거나 폼을 전송하면 웹 서버로 HTTP 요청이 전송됩니다.
2. WAS 객체 생성
- WAS는 HTTP 요청 메세지를 기반으로 새로운 Request, Response 객체 생성
3. 요청 전달
- 웹 서버는 요청 URL에 해당하는 Servlet이 있는지 확인하고, 해당 Servlet을 관리하는 Servlet Container로 요청을 전달합니다.
4. Servlet 생성 또는 재사용 (Example Servlet 생성)
- 서블릿이 처음 요청될 경우:
- 컨테이너는 서블릿 클래스를 메모리에 로드
- 객체를 한 번만 생성한 뒤 init() 메서드 호출
- 이후 요청마다 동일 인스턴스를 사용합니다.
- 재사용 시: 생성되어 있는 서블릿 객체 사용
5. 비즈니스 로직 처리
6. 응답 생성
- 서블릿은 동적인 내용을 생성하고, HttpServletResponse 객체를 통해 응답을 보냄 (HTML, JSON 등)
7. 응답 반환
- 응답은 웹 서버를 통해 클라이언트(브라우저)에 전달됩니다.
8. 종료(`destroy()` 호출)
- 서버가 종료되거나 서블릿이 더 이상 사용되지 않을 경우, 컨테이너는 `destroy()` 메서드를 호출하여 리소스 정리
✨ 개발자가 하는 일
- Request 객체에 담겨져있는 HTTP 요청 정보를 꺼내서 사용합니다.
- 요청 정보(URL, Method, Message Body)를 통해 필요한 기능(비지니스 로직)을 수행합니다.
- 생선된 Response 객체에 HTTP 응답 정보를 입력합니다.
Servlet Container
정의 :
Servlet을 관리하고 실행하는 역할을 하는 소프트웨어입니다. Tomcat이 대표적인 서블릿 컨테이너입니다.
역할 :
기능 | 설명 |
서블릿 생명주기 관리 | `init()`, `service()`, `destroy()` 관리 |
요청/응답 처리 | HTTP 요청과 응답 객체 생성 (HttpServletRequest, HttpServletResponse) |
멀티스레딩 지원 | 클라이언트 요청마다 별도의 스레드로 처리 |
보안 처리 | 인증, 권한 부여 등 지원 |
로깅 및 예외 처리 | 에러 로그, 예외 처리 기능 내장 |
- Servlet 객체를 `싱글톤`으로 관리합니다.
Servlet의 생명주기 :
- Servlet은 서블릿 컨테이너가 생성 및 관리합니다.
- WAS(서블릿 컨테이너 포함)가 종료될 때 Servlet도 함께 종료됩니다.
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
}
}
@WebServlet(name="Example2Servlet", urlPatterns = "/example2")
// 위와 같은 코드
@WebServlet(name="Example3Servlet", urlPatterns = "/example3")
// 위와 같은 코드
@WebServlet(name="Example4Servlet", urlPatterns = "/example4")
// 위와 같은 코드
'CS' 카테고리의 다른 글
[CS] CSR과 SSR (0) | 2025.05.09 |
---|---|
[CS] Web Server와 WAS, 각각의 역할 이해하기 (0) | 2025.05.07 |
[CS] HTTP 지속 연결(Persistent Connection)의 등장 배경과 발전 (0) | 2025.05.07 |
[CS] Connection & Connectionless (0) | 2025.05.06 |
[CS] 서버 상태 관리의 두 방식: Stateless와 Stateful (0) | 2025.05.06 |