본문 바로가기

Tech/Spring

서블릿과 서블릿 컨테이너란 무엇이고 어떻게 동작할까? - 전통적인 웹 앱 부터 Spring MVC까지 (1)

개요

 자바 스프링 웹 백엔드 개발자를 희망하는 사람이라면, 스프링 웹 프레임워크(Spring MVC)가 서블릿 기반으로 동작한다고 한 번쯤은 들어봤을 것이다. 그런데 서블릿이 뭘까? 스프링 MVC가 내장하고 있다는 톰캣 웹 서버는 또 무엇일까? 이번 시리즈에서는 다음과 같은 궁금증을 풀어보려 한다.

 

  • 서블릿과 서블릿 컨테이너는 무엇일까? 왜 사용될까? (📍현재 포스팅)
  • Spring MVC에서 서블릿 컨테이너의 동작 방식은 어떠할까? (🔗보러가기)
  • 서블릿 컨테이너와 스프링 컨테이너의 차이점은 무엇일까? (🔗보러가기)

 

서블릿과 서블릿 컨테이너

우선, 전통적인 웹 애플리케이션에서의 서블릿과 서블릿 컨테이너에 대해 알아보도록 하자. (스프링 MVC 스펙 말고!)

 

What

  • Servlet은 자바 웹 애플리케이션에서 동적인 콘텐츠를 생성하기 위한 javax.servlet.Servlet 인터페이스다.
  • 서블릿은 다양한 요청 프로토콜을 처리할 수 있지만 일반적으로 HTTP 프로토콜을 처리한다.
  • Servlet Container는 Servlet을 메서드 호출을 통해 제어, 관리한다.
  • 널리 사용되는 서블릿 컨테이너 프로그램으로 Apache Tomcat, Jetty 등이 있다.

 

Why

 서블릿 기술이 HTTP 요청, 응답 처리에 활용된다는 것을 알았다. 그런데, 서블릿 기술은 왜 사용하는 것일까?

https://developer.mozilla.org/ko/docs/Web/HTTP/Messages

 

 위 사진은 HTTP 프로토콜을 따른 메시지다. 스프링 MVC로 개발할 때, HTTP 메시지에 담긴 헤더나 바디 데이터를 활용한 경험이 있을 것이다. 그때 직접 InputStream으로 메시지를 받아서 파싱 해서 사용했던가? 아니다. 서블릿 컨테이너가 HTTP 메시지를 파싱 해서 HttpServletRequest 객체에 담아 개발자에게 제공해 준 것이다.

 

 서블릿 기술 덕분에 개발자는 중요한 비즈니스 로직 개발에 집중할 수 있다. 이렇듯, 메시지 파싱뿐만 아니라 소켓 연결부터 시작해서 웹 요청, 응답 처리 전반에 걸쳐 공통적으로 수행해야 하는 것들을 서블릿 컨테이너가 처리해 준다!

 

How

 위에서 Servlet Container는 Servlet을 메서드 호출을 통해 관리한다고 했는데, 더 자세히 알아보자. 우선, 다음 두 가지 사항을 유념하자.

 

  1. 서블릿은 스스로 동작할 수 없다. 서블릿 컨테이너라는 자바 응용 프로그램의 제어를 받아 동작한다.
  2. 서버 컴퓨터가 소켓을 통해 요청을 받으면 서블릿 컨테이너 응용 프로그램으로 전달된다. 서블릿 컨테이너는 요청을 적절한 서블릿으로 전달한다.

 

첫 번째로 서블릿 인터페이스의 스펙을 살펴보자.

https://docs.oracle.com/javaee%2F7%2Fapi%2F%2F/javax/servlet/Servlet.html

  • init, service, destroy 메서드는 life-cycle 메서드라고 불린다. (Javadoc에 나와 있다.)
  • 서블릿 컨테이너는 라이프 사이클 메서드를 호출해 서블릿의 생성(init), 동작(service), 소멸(destroy)을 제어한다.
  • 개발자는 service 메서드에 요청을 처리할 비즈니스 로직을 작성한다.

 

두 번째로 서블릿 컨테이너와 서블릿 객체의 생명 주기를 알아보자.

  1. 웹 애플리케이션 시작: 전통적인 웹 애플리케이션의 경우, 서블릿 컨테이너가 시작될 때 web.xml에 등록된 서블릿에 대해 init() 메서드를 호출한다. (스프링 MVC의 경우는 이 포스팅에서 살펴보자.)
  2. 클라이언트의 요청: 클라이언트의 요청이 들어오면, 서블릿 컨테이너는 해당 요청을 처리할 수 있는 서블릿 객체를 찾는다. 해당 객체의 service() 메서드를 호출해 요청을 처리하고 응답을 반환한다.
  3. 웹 애플리케이션 종료: 서블릿 컨테이너가 종료될 때, 서블릿 객체의 destroy() 메서드를 호출해 소멸시킨다.

 

정리

  • 서블릿 컨테이너는 웹 애플리케이션을 실행하기 위한 서버 측 소프트웨어다. 대표적으로 Tomcat, Jetty가 있다.
  • 서블릿 컨테이너는 서블릿 메서드 호출을 통해 생애주기를 관리한다.
  • 개발자는 서블릿의 service 메서드에 웹 요청을 처리할 로직을 작성한다.

 

다음 포스팅에서는 Spring MVC에서 서블릿 컨테이너(톰캣)와 서블릿(DispatcherServlet)의 동작 방식을 살펴보도록 하겠다!

 

Reference