본문 바로가기
Back-end

Servlet, ServletContainer vs DispatcherServlet

by 신재권 2023. 8. 24.

Servlet 이란?

서블릿이란 동적 웹 페이지를 만들 때 사용되는 자바 기반의 웹 애플리케이션 프로그래밍 기술 입니다.

즉, 클라이언트의 요청에 대해 동적으로 처리하고 응답을 생성하는데 사용되는 자바 클래스입니다.

왜 필요한 것인가?

서블릿은 클라이언트의 요청에 대해 동적으로 응답을 생성하여, 웹 애플리케이션의 동작을 제어합니다.

또한, 웹 애플리케이션의 로직을 자바 클래스로 구현하므로, 서버 측에서 로직을 처리하고 결과를 반환할 수 있다.

정적인 웹 페이지만 제공하는 것이 아닌, 동적인 기능과 데이터 처리가 필요한 경우에 사용된다.

없으면 어떻게 되는가?

서블릿이 없을 경우 동적인 기능을 추가할 수 없어, 정적인 웹 페이지만 제공 가능하다.

또한, 웹 애플리케이션의 비즈니스 로직을 서버에서 처리할 수 없어, 클라이언트 측에서 처리해야 한다.

서블릿 컨테이너

서블릿 컨테이너는 서블릿의 실행 환경을 제공하는 런타임 환경이다.

서블릿 클래스의 규칙에 맞게 서블릿을 관리해주며 클라이언트에서 요청하면 컨테이너는 동적 페이지를 생성해 응답을 보낸다.

서블릿의 생명 주기 관리, 멀티스레딩 지원, 요청 및 응답 관리, 보안, JSP 처리 등을 담당한다.

서블릿 생명 주기

  • 서블릿 인스턴스화(Initialization) : 서블릿 컨테이너가 서블릿 클래스의 인스턴스를 생성하고, 초기화 메서드인 init()을 호출한다.
  • 서비스 요청(Service Request) : 클라이언트 요청마다 새로운 스레드를 생성하고, 해당 스레드에서 service() 메서드가 호출된다.
  • 요청 처리(Request Handling) : service() 메서드는 클라이언트 요청을 처리하고, 해당 요청의 HTTP 메서드에 따라 doGet(), doPost() 등이 호출된다.
  • 응답 생성(Response Generation) : doGet() 또는 doPost() 등을 통해 클라이언트에게 응답을 생성한다.
  • 서블릿 종료(Destruction) : 서블릿 컨테이너가 웹 애플리케이션의 종료 또는 서블릿 제거 시 destroy() 메서드가 호출되어 자원을 정리하고 서블릿 인스턴스를 제거한다.

서블릿 멀티스레딩 지원

서블릿 컨테이너는 각 클라이언트 요청마다 새로운 스레드를 생성하여 서블릿의 service() 메서드를 호출한다.

이를 통해 여러 클라이언트의 요청을 동시에 처리할 수 있다.

서블릿 요청 및 응답 처리

클라이언트로 부터 요청이 오면 서블릿 컨테이너가 HttpServletRequest, HttpServletResponse 객체를 생성한다.

web.xml 을 기반으로 사용자가 요청한 URL이 어느 서블릿에 대한 요청인지 찾는다.

HttpServletRequest 객체에 클라이언트의 요청에 대한 정보(파라미터, 헤더 등)가 담겨서 온다.

해당 서블릿에서 service 메서드를 호출 후, doGet or doPost 메서드를 호출하여, 동적 페이지를 생성 후, 응답 정보(상태 코드, 헤더, 본문 등)를 HttpServletResponse 객체에 담아 클라이언트에 응답을 보낸다.

응답이 끝나면, HttpServletRequest, HttpServletResponse 두 객체를 소멸시킨다.

보안 관리

서블릿 컨테이너는 보안 관리를 위해 웹 애플리케이션의 웹 리소스에 대한 접근 제어, 인증, 인가 등의 기능을 제공한다.

JSP 처리

JSP는 Java Server Pages의 약자로 동적인 웹 페이지를 생성하기 위한 기술로, 서블릿과 유사한 역할을 한다.

JSP 파일은 서블릿으로 변환되어 웹 애플리케이션 내에서 동작하며, 클라이언트 요청을 처리하고, 응답을 생성한다.

JSP는 HTML에 자바 코드를 포함하여 동적인 데이터 처리를 가능하게 한다.

서블릿 동작 과정

  1. 웹 애플리케이션이 시작 되면, 서블릿 컨테이너는 init() 메서드를 호출하여, 서블릿 인스턴스를 생성하고 초기화한다.
  2. 클라이언트부터 요청이 들어오면, 서블릿 컨테이너는 web.xml 을 참고해 해당 서블릿을 찾고, 찾은 서블릿의 service() 메서드를 호출하여 클라이언트의 요청을 처리한다. 이 때 새로운 스레드가 생성되어 요청을 처리한다.
  3. HttpServletRequest, HttpServletResponse 객체가 클라이언트 요청마다 새롭게 생성된다.
  4. service() 메서드를 통해 클라이언트의 요청을 처리하고 응답을 생성한다. doGet() 또는 doPost() 메서드를 오버라이딩 하여 실제 작업을 수행한다.
  5. 클라이언트 요청처리가 완료되면 HttpServletRequest, HttpServletResponse 객체는 소멸된다.
  6. 웹 애플리케이션 종료될 때는 서블릿이 서블릿 컨테이너에서 제거될 때 destroy() 메서드가 호출되어 서블릿 인스턴스가 소멸된다.

스프링에는 DispatcherServlet이 있는데 무슨 차이?

DispatcherServlet은 스프링 프레임워크의 일부로서, 스프링 기반의 웹 애플리케이션에서 클라이언트 요청을 받아 해당 요청을 처리할 컨트롤러로 요청을 라우팅 합니다.

스프링은 DispatcherServlet을 통해 다양한 컨트롤러를 관리하고, 이를 통해 요청을 처리하고 응답을 생성합니다.

Servlet과 달리, DispatcherServlet은 스프링의 IoC 컨테이너와 연동하여 의존성 주입 등의 기능을 활용할 수 있습니다.

정리하면 Servlet Contatiner는 DispatcherServlet이랑 비슷한 역할을 하고, Servlet 인스턴스는 web.xml 정보와 함께 해서 스프링의 Controller와 비슷한 역할을 한다.

물론 개념적으로 같지는 않지만, 하는 역할이 비슷하다.

'Back-end' 카테고리의 다른 글

Object.equals()를 재정의 해야 하는 이유  (0) 2023.08.24
sychronized, Atomic  (0) 2023.08.24
volatile  (0) 2023.08.23
Thread(Java/OS)  (0) 2023.08.23
동기식 vs 비동기식, Blocking vs Non-Blocking  (0) 2023.08.23