서블릿(Servlet)
웹 서버의 동작방식을 이해하기 위해 꼭 필요한 서블릿 정리
서블릿(Servlet)이란?
Spring을 사용해봤다면 이미 서블릿을 사용한 적이 있을 것이다.
http 통신 기반의 클래스를 살펴보면 어노테이션 기반이든, 매개변수로든 서블릿 클래스가 활용된다는 것을 알 수 있다.
서블릿은 웹 프로그래밍에서 클라이언트 요청을 처리하고 처리결과를 클라이언트에 전송하는 기술이다.
서블릿이란 동적 웹 페이지를 만들 때 사용되는 자바 기반의 웹 애플리케이션 프로그래밍 기술이다.
서블릿은 서버에서 실행되다가 웹 브라우저에서 요청을 하면 해당 기능을 수행한 후 웹 브라우저에 결과를 전송한다.
예를들어, 로그인 시도를 할 때 서버가 클라이언트에서 입력되는 아이디와 비밀번호를 확인하고 결과를 응답하는데 이러한 역할을 수행하는 것이 서블릿이다.
서블릿(Servlet)의 주요 특징
- 클라이언트의 요청에 대해 동적으로 작동하는 웹 어플리케이션 컴포넌트
- html을 사용해서 요청에 응답
- Java thread를 통해 동작
- MVC 패턴 중 Controller로 이용
- HTTP 프로토콜 서비스를 지원하는 javax.servlet.http.HttpServlet 클래스를 상속
- HTML 변경 시 Servlet을 재 컴파일 해야함
일반적으로 웹 서버는 정적인 페이지만 제공하는데, 동적인 페이지를 제공하기 위해 서블릿을 활용한다.
동적인 페이지란 사용자의 요청에 의해 변화되는 무언가를 제공하는 것을 말하는데, 서블릿이 바로 이러한 동적인 페이지를 제공하기 위해 도움을 주는 어플리케이션이다.
서블릿의 동작 순서
- 클라이언트가 보낸 HTTP Request를 서블릿 컨테이너로 전송
- HTTP Request를 전달받은 서블릿 컨테이너는 HttpServletRequest, HttpServletResponse 두 객체를 생성
- web.xml은 사용자가 요청한 URL을 분석하여 어느 서블릿에 대해 요청을 한 것인지 찾음
- 해당 서블릿에서 service 메서드를 호출한 후 클라이언트의 요청종류(GET, POST)에 따라 doGet 혹은 doPost를 호출
- doGet, doPost 메서드는 동적 페이지를 생성한 후 HttpServletResponse 객체에 응답을 보냄
- 응답이 끝나면 HttpServletRequest, HttpServletResponse 두 객체를 소멸시킴
서블릿 컨테이너(Servlet Container)란?
서버에 만들어진 서블릿이 스스로 작동하는 것이 아니라, 서블릿을 관리 해주는 것이 필요한데, 이러한 역할을 하는 것이 바로 서블릿 컨테이너 이다.
자바의 서블릿 컨테이너는 구현되어 있는 서블릿 클래스의 규칙에 맞게 서블릿을 관리하며 클라이언트의 요청을 받으면 HttpServletRequest와 HttpServletResponse 객체를 생성하여 동적인 페이지를 생성하여 응답한다.
서블릿 컨테이너의 대표적 기능
1. 서블릿 생명주기 관리
서블릿 컨테이너는 서블릿의 생성과 소멸을 관리한다. 서블릿 클래스를 로딩하여 인스턴스화하고, 초기화 메서드를 호출하고, 요청이 들어오면 적절한 서블릿 메서드를 찾아서 동작한다.
또한 서블릿의 생명이 다하면 가비지 컬렉션을 통해 메모리에서 제거한다.
2. 통신 지원
서블릿 컨테이너는 웹 서버와 소켓을 만들어서 클라이언트의 요청을 받고 응답할 수 있는 통신을 지원해준다. 통신을 하기 위한 listen, accept 등의 과정을 API로 제공하여 복잡한 과정을 생략해주기 때문에 개발자가 비즈니스 로직 개발에 집중할 수 있게 도와준다.
(통신을 할 수 있는 소켓, 서버를 만들어준다는 의미)
3. 멀티쓰레드 지원 및 관리
서블릿 컨테이너는 클라이언트의 요청을 받을 때마다 새로운 자바 스레드를 생성한다. 따라서 동시에 여러 요청이 들어와도 멀티쓰레딩 환경에서 동시 다발적인 작업을 관리할 수 있다.
(요청이 들어올때마다 스레드를 생성해서 해당 스레드를 스레드풀에 등록함)
4. 선언적인 보안 관리
서블릿 컨테이너는 보안 관련 기능을 제공하기 때문에 개발자는 서블릿에 보안 관련 메서드를 구현하지 않아도 된다.
(ex: 루트 폴더보다 상위 폴더에 접근시 403 에러)
'Language > Java' 카테고리의 다른 글
인터페이스와 추상클래스 (0) | 2024.07.16 |
---|---|
예외(Exception) 처리 (3) | 2024.07.16 |
스트링(string) (0) | 2024.07.16 |
가비지 컬렉션(GC) (0) | 2024.07.16 |
자바(JAVA) 빌더(builder) 패턴 (0) | 2023.01.05 |