부자 되기 위한 블로그, 머니킹

Description

현재 우리나라는 스프링을 웹 백엔드 프레임워크로 많이 사용하고 있다. 처음 스프링을 접했을 때 너무 잘 구조된 시스템 구조에 놀란 기억이 있다. 스프링을 다루는 사람이라면 한번쯤은 들어본 서블릿은 스프링의 핵심 구조중 하나이다. 오늘은 서블릿에 대해 자세히 알아보려고 한다.

 

 

Servlet

 

Servlet(서블릿)이란 자바 기반의 웹 프로그래밍에서 클라이언트 요청을 처리하고 해당 결과를 응답하여 클라이언트에 전송되는 기술로서 웹 통신의 표준 규약인 CGI를 따른 자바 버전이라고 생각하면 된다.

 

웹 프로세스와 Servlet 특징

웹 페이지는 크게 정적 페이지와 동적 페이지가 있다.

 

정적 페이지는 클라이언트로 한번 페이지 정보를 전송하고 나면 이후 양방향 통신이 필요 없이 해당 페이지에서 목적된 프로세스를 모두 수행하는 페이지이다.

 

반대로 동적페이지는 최초 페이지를 로드하고 이후 서버와 양방향 통신을 통해 상황에 따라 다른 컨텐츠를 보여주는 말그대로 동적인 페이지이다.

 

 

서블릿은 이런 동적 페이지를 구현하기 위해 고안되었으며 웹 요청이 들어오면 수행되는 프로세스는 다음과 같다.

  1. 사용자가 URL 을 통해 Http Request를 보내면 이를 Servlet Container로 전송 받습니다
  2. Http Request를 전달받은 Servlet Container는 HttpServletRequest, HttpServletResponse 두 객체를 생성하는데 이는 각각 request, reponse 역할 및 정보를 담고 있습니다.
  3. 사용자가 요청한 URL을 분석하여 어떤 서블릿에 매핑되는지 찾고 해당 서블릿으로 정보를 전송합니다.
  4. 해당 서블릿은 클라이언트 요청 Method에 따라 Get, Post 함수를 호출합니다.
  5. Get,Post 함수는 동적으로 결과를 처리하고 이를 HttpServletResponse 객체에 담아 응답을 보냅니다.
  6. 응답이 끝나면 HttpServletRequest와 HttpServletResponse 객체를 소멸키십니다.

 

여기서 우리가 실제 스프링에서 처리하는 부분은 4번 부분으로 URL 매핑에 대한 정보를 등록하고 해당 함수 부분의 Method를 결정한 뒤 매핑시 어떤 처리를 할 지 작성하고 이를 response 객체에 담습니다.

 

HttpServletRequest, HttpServletResponse는 javax.servlet.http.HttpServlet을 상속받으며 CGI 특징대로 요청마다 스레드를 만듭니다. 이 때문에 html 컨텐츠가 변하더라도 Servlet을 재컴파일하는 단점이 존재합니다.

 

 

 

Servlet Filter

다양한 Servlet이 있지만 그 중 실제 서버에 요청이 들어오기 전에 Filtering을 하는 역할을 가진 서블릿을 Servlet Filter라고 합니다.

 

 

 

 

Spring은 공통 처리 부분에 있어 상당히 공들였는데 Filter 또한 서버 처리 전 전처리 역할 및 Servlet 호출 후 수행되는 후처리를 하는 공통처리 분류 중 하나로 클라이언트 요청을 가로채어 Filter 처리를 먼저 하도록 합니다.

 

 

대표적인 Servlet Filter 구현 기능으로는 다음과 같습니다.

  • 사용자 인증 필터
  • 정보 캐싱 필터
  • 로깅 필터

 

 

 

Dispatcher Servlet

 

Http 프로토콜로 들어오는 모든 요청을 가장 먼저 받고 이를 적합한 Controller에 위임하는 Front Controller입니다. 웹 프로세스에서 클라이언트의 요청을 받는 서버단의 기본 순서는 Spring의 경우 Tomacat과 같은 서블릿 컨테이너가 요청을 받고 그 다음으로는 Front Controller 역할을 하는 Dispatcher Servlet이 받게 됩니다.

 

 

이런 단계를 나누는 이유는 공통 처리를 하기 위해서인데 적합한 Controller를 찾기 전에 전 Servlet에서 수행해야 하는 공통 작업을 수행한 후 실제 요청을 처리하는 Controller를 찾아 작업을 이어 나갑니다.

 

 

하지만 Dispatcher Servlet이 모든 요청에 대해 받다보니 Html/css/js/image 등의 정적 자원들을 실제 처리 Controller에서 불러오지 못해 이를 위해 요청 유형을 정적 자원 요청과 App 단 요청으로 분리하여 처리하는 방법을 고안합니다.

  • 정적자원 요청시 : /resources 로 접근시에는 Dispatcher Servlet이 담당하지 않는다.
  • App단 요청시 : /apps로 접근시에는 Dispatcher Servlet이 담당한다.

 

 

위의 그림은 대략적인 spring mvc 처리 과정을 보여주는 순서도입니다. 기본적으로 mvc 처리시에도 Front Controller가 이용됩니다.

 

 

Servlet Container

Servlet Container는 Servlet을 관리하는 Container로 대표적인 Servlet Container로는 Apache Tomcat이 있다. 서블릿 컨테이너는 요청과 응답을 위해 HttpServletRequest, HttpServletResponse를 생성하며 웹서버와 Socket을 만들어 통신한다.

 

 

Servlet Cotainer 대표적 역할

  • Servlet의 Life Cycle 관리
    • 서버 시작시 Servlet Class 로딩 및 Instance 하고 Servlet이 소멸해야 하는 순가 가비지 컬렉션을 통해 메모리에서 제거
  • Multi Threading 관리
    • Servlet으로 요청이 들어오면 Thread를 생성하는데 동시에 여러 요청이 들어와도 Multi Threading을 활용하여 동시에 처리할 수 있다.
  • Request, Response 통신
    • 웹 서버와 Socket을 만들어 통신을 하며 기본적인 통신 방법은 socket을 만든 후에 포트에 대한 Listening 작업 및 연결 요청에 대한 Stream 생성 후 요청을 받는 것을 자동으로 처리해준다.