Spring에서의 요청 흐름 1 - Servlet

Updated: Categories:

Spring 요청의 흐름. Servlet부터 알아보자!!

Spring의 기초 기술과 기술 발전과정을 쭈욱 훑어보면서 Spring Boot가 어떻게 탄생했는지를 알아보려고 한다.
(여러 번의 포스팅에 걸쳐 알아볼 예정이다. 몇개가 될지 모름 😇)

Servlet이란

  • 동적 웹페이지에서 사용되는 요청/응답에 대한 자바 규격
  • HTTP 요청과 응답의 흐름을 간단한 메소드 호출만으로 정의할 수 있도록 도와준다.
    • 서블릿이 정의되어 있지 않다면 서비스 로직이 돌아가기 전, 항상 네트워크 연결에 대한 구현을 해줘야하기에 개발자에게 편의성을 제공해준다.

특징

  • 기본적으로 HTML을 사용하여 응답함
  • MVC 패턴에서의 컨트롤러 역할을 함
  • 상속 순서는 Servlet -> GenericServlet -> HttpServlet
  • 스레드 단위로 동작함

Servlet Lifecycle

  1. 클래스 로더가 서블릿 클래스들을 로드함
  2. 요청이 들어오면 필요한 서블릿 클래스 인스턴스를 생성
  3. 생성된 서블릿 객체를 init() 메소드로 초기화
    • 한번 생성된 서블릿 객체는 싱글톤으로 계속 메모리에 남아있다. (하지만 GC의 대상이 된다)
    • 초기화 작업에 비용이 많이 들기 때문에 재사용하는 것이다.
  4. service() 메소드 호출 -> 서비스 로직 실행
  5. 서블릿 컨테이너가 종료되면 destroy() 메소드를 호출


Servlet Container

  • 서블릿 객체를 관리하는 컨테이너
    • 서블릿 객체의 생명주기를 관리한다

특징

  • 소켓을 구현해 스트림을 생성하여 클라이언트와 통신을 책임진다
    • 요청이 들어오면 HttpServletRequestHttpServletResponse 객체를 생성한다
  • 컨테이너 로드시 스레드풀에 스레드를 만들어 놓고, 요청시 스레드를 할당한다
    • 스레드는 필요한 서블릿을 호출하여 요청을 수행한다
    • 원래는 요청이 들어올때 자동으로 스레드를 만들지만, 한계가 없기에 너무 많은 스레드 생성시 서버가 다운될 수 있으므로 스레드 풀을 사용하는 것.

Filter

  • 모든 요청이 서블릿을 들어갈때와 나갈때 거쳐가는 filter가 존재한다.
  • 생명주기는 서블릿과 유사하다.
    1. 요청이 들어오면 init()으로 필터 객체 초기화
    2. doFilter()로 필터 작업 수행 -> filter chain으로 이어짐
    3. 서블릿 컨테이너가 종료되면 destroy() 메소드를 호출
  • 마지막 필터에서는 서블릿 service()를 호출하고, 호출이 끝나고 나면 추가 작업을 정의할 수 있다.


정리

자… 위에서의 정의들을 쭈욱 공부해보니 서블릿이 뭔지 감이 온다.
그동안 스프링으로 서버를 개발할때, 모든 요청과 응답을 마법처럼 만들어주는게 아니라 서블릿이라는 기술이 열일하고 있었다.
사실 서블릿은 Spring 동작원리를 이해하기 위한 기초 발판이였다. (!!)

다음 포스팅에서 Spring에서의 MVC 패턴이 어떻게 등장했는지에 대해 알아보도록 하겠다.