Servlet, ServletContainer, DispatcherServlet

조현근·2022년 11월 9일
0
post-thumbnail

Servlet

  • 자바 기반의 웹 애플리케이션 프로그래밍 기술
  • 서블릿은 클라이언트 요청을 처리하고, 그 결과를 반환하는 웹 프로그래밍 기술
  • 이전의 웹 프로그램들은 클라이언트의 요청에 대한 응답으로 만들어진 페이지를 넘겨주었음. 웹 프로그래밍이 점점 발전하면서 응답을 가공하여 동적인 페이지를 작성할 수 있게 됨. 동적인 페이지를 제공하기 위해 웹 서버가 다른 곳에 도움을 요청하여 동적인 페이지를 작성하게 됨

스프링에서 Servlet 동작방식

  1. 사용자가 URL을 입력하면 사용자의 요청이 servlet container로 전송
  2. 요청을 전송받은 Servlet Container는 HttpRequest, HttpResponse 객체를 생성
  3. 사용자가 요청한 URL이 어느 서블릿에 대한 요청인지 찾음. 스프링을 이용하면 필터를 모두 실행한 후 Servlet 인터페이스를 구현한 HttpServlet의 service메서드를 호출. HttpServlet - FrameworkServlet - DispatcherServlet으로 상속이 되어있음
  4. 클라이언트의 HTTP method 여부에 따라 FrameworkServlet의 doGet(), doPost()와 같은 메서드가 호출됨
  5. 이를 따라가다 보면 FrameworkServlet을 상속한 DispatcherServlet의 doService가 호출됨
  6. 이후엔 DispatcherServlet의 동작과정에 따라 적절한 response를 만들어 준다.

Servlet 생명주기(스프링을 사용하는 경우)

  • 클라이언트 요청이 들어오면 컨테이너는 서블릿이 메모리에 있는지 확인한다. 메모리에 없다면 init() 메서드를 호출해 적재
  • 클라이언트 요청에 위의 (스프링에서) Servlet 동작방식이 이ㅜㄹ어짐
  • 컨테이너가 서블릿에 종료 요청을 하면 destroy() 메서드가 호출된다. 종료시 처리해야 하는 작업은 destroy() 메서드를 오버라이딩해 구현하면 된다.

Servlet Container

서블릿 컨테이너는 스스로 동작하지 않는 서블릿을 관리해주는 컨테이너이다.
서블릿 컨테이너는 클라이언트의 요청을 받고 응답 할 수 있도록 웹 서버와 소켓으로 통신한다. 톰캣이 서블릿 컨테이너의 대표적인 예이다.

Servlet Container 특징

  • 톰캣처럼 서블릿을 지원하는 WAS를 서블릿 컨테이너라 한다.
  • 서블릿 객체를 생성, 초기화, 호출, 종료하는 생명주기 관리
  • 서블릿 객체는 싱글톤으로 관리
  • 동시 요청을 위한 멀티 스레드 처리 지원

Servlet Container 역할

  • 웹 서버와의 통신 지원
    서블릿 컨테이너는 서블릿과 웹 서버가 통신할 수 있도록 해준다. 서블릿 컨테이너가 이를 해주기 때문에 개발자는 비즈니스 로직에만 집중할 수 있다.
  • 서블릿 생명주기 관리
    서블릿의 생성, 소멸을 관리한다. 서블릿의 역할이 끝난 후 GC를 진행하여 소멸시킨다.
  • 멀티스레드 지원 및 관리
    서블릿 컨테이너는 요청마다 자바 스레드를 새롭게 생성한다. HTTP 서비스 메서드를 실행하고 나면 스레드는 죽게된다. 서버가 다중 스레드를 생성 및 운영해주니 스레드 안정성은 고려하지 않아도 된다.

왜 Servlet Container로 톰캣을 사용할까?

Servlet Container로 사용할 수 있는 것들은 크게 Tomcat, Jetty, Undertow, Netty가 있다고 한다.

Tomcat

강력한 커뮤니티, 다양한 성공 사례 등 Java 진영에서 가장 널리 사용되는 WAS라고 한다. Spring boot에서도 기본 내장 WAS는 Tomcat이다.

Jetty

경량 WAS. 적은 메모리를 사용하고 가벼운 이점이 있고 속도가 빠름
소형장비, 소규모 프로그램에 내장하여 사용하는 목적
대규모 트래픽에 취약하다는 단점이 있음

Undertow

Blocking과 non-blocking API를 모두 안정적으로 제공하는 유연한 고성능 웹 서버. 대규모 트래픽에서 Tomcat보다 안정적으로 평가받는다고 한다.

Netty

Async, Event-Driven 방식 네트워크 어플리케이션 프레임워크.
Undertow도 Netty기반
Spring boot 2 부터 Webflux Framework를 사용하면 Reactive Programming을 할 수 있음. Webflux를 사용하면 기본 내장 WAS는 Netty가 됨

우선 Jetty는 대규모 트래픽에 취약하니 제외하자. Tomcat보다 대규모 트리팩에서 Undertow가 더 안정적이라고 한다. 하지만 우리는 Webflux를 사용하지 않고 우선 스프링 MVC를 이용한 웹 프로그래밍이 학습의 주 목적이다. 따라서 Netty나 Undertow보단 레퍼런스가 많은 Tomcat을 우선 사용하고, 추후 Netty나 Undertow를 고려해보아도 괜찮을거 같다.

DispatcherServlet

Servlet(인터페이스) - HttpServlet - FrameworkServlet - DispatcherServlet 의 상속구조를 가지고 있음. 스프링 MVC에서 사용하는 서블릿 구현체라고 생각하면 될거 같음.

HTTP 프로토콜로 들어오는 모든 요청을 가장 먼저 받아 적합한 컨트롤러에 위임해주는 프론트 컨트롤러(front controller)

클라이언트로부터 요청이 들어오면 Tomcat과 같은 서블릿 컨테이너가 요청을 받음.
그리고 모든 요청을 프론트 컨트롤러인 디스패처 서블릿이 가장 먼저 받음
디스패처 서블릿은 공통적인 작업을 먼저 처리한 후 해당 요청을 처리해야 할 컨트롤러를 찾아 작업을 위임

프론트 컨트롤러

서블릿 컨테이너의 제일 앞에서 서버로 들어오는 클라이언트의 모든 요청을 받아서 처리해주는 컨트롤러

동작방식

필터 인터셉터 포스트에 DispatcherServlet의 동작방식을 자세히 설명함.
인터셉터 동작방식이 전체적인 DispatcherServlet 동작방식을 따라가며 설명헀기에 해당 포스트를 보면 된다.

출처

https://mangkyu.tistory.com/18
https://tecoble.techcourse.co.kr/post/2021-05-23-servlet-servletcontainer/
https://gofnrk.tistory.com/73

profile
안녕하세요!

0개의 댓글