Servlet과 Servlet Container

yuKeon·2024년 3월 24일
0

1. Servlet

1.1 개념

Servlet(서블릿)은 Java를 사용한 웹 애플리케이션에서 사용되는 기술로 클라이언트의 요청을 처리하고 응답하는 기술이다.

과거의 웹 애플리케이션은 클라이언트의 요청에 대한 응답으로 정적인 페이지를 전달했다. 하지만 웹이 발전하면서 동적인 페이지를 요구하게 되었고 동적인 요청을 처리하기 위한 기술이 필요해졌다.

그렇게 자바 진영에서 등장한 기술이 서블릿이다. 서블릿을 통해 개발자는 HTTP request, response 정보를 쉽게 활용하여 비즈니스 로직에만 집중할 수 있게 됐다.

1.2 생명 주기

서블릿의 생명 주기는 init()service()destroy()로 이루어져 있다.

  • init() : 서블릿 컨테이너에 의해 호출되며 서블릿 인스턴스가 생성되는 시점에 정확히 한 번 호출된다.
  • service() : 서블릿 컨테이너가 서블릿이 응답에 대한 요청을 처리하도록 지시한다.
  • destroy() : 서블릿 컨테이너가 서블릿을 종료하도록 지시한다. 서블릿 컨테이너가 destroy() 메서드를 호출하면 해당 서블릿은 다시 호출되지 않는다.

2. Servlet Container

2.1 개념

서블릿 컨테이너(=웹 컨테이너)는 서블릿을 관리하는 기술로 서블릿 객체의 생성, 초기화, 호출, 종료로 진행되는 생명 주기를 관리한다. Spring MVC의 핵심 역할인 DispatcherServlet도 서블릿 컨테이너가 관리하는 서블릿이다.

서블릿 컨테이너는 클라이언트의 요청을 받고 응답을 전달하기 위해 웹 서버와 소켓으로 통신한다. 대표적인 예시가 Apache Tomcat이다.

2.2 WAS

WAS는 일부 웹 서버 기능과 웹 컨테이너로 구성된다. 웹 서버는 앞단에 위치하여 HTTP 요청을 받아 웹 컨테이너로 전달한다. 웹 컨테이너는 내부 로직을 통해 요청을 처리하고 응답을 웹 서버로 다시 반환한다.

WAS에 웹 서버 기능이 존재한다면 Apache나 NGINX와 같은 웹 서버를 함께 사용하는 이유는 무엇일까?
이유는 두 가지다.

부하
WAS(e.g. Apache Tomcat)는 서블릿 컨테이너등의 존재로 웹 서버보다 상대적으로 무겁다. 따라서, 정적인 요청을 처리하는 작업에는 부적합하며, 상대적으로 가벼운 웹 서버가 유리하다.

로드 밸런싱
WAS로 요청이 몰릴 경우 CPU에 부하가 심해지고 심할 경우 서버가 죽는 문제가 발생한다. 이를 방지하기 위해 WAS 앞단에 웹 서버를 두고 요청을 분산하는 로드 밸런싱 기능이 필요하다.

2.3 특징

싱글톤
서블릿 컨테이너는 서블릿 객체를 싱글톤으로 관리한다. 서블릿은 클라이언트의 요청을 받아 응답을 전송하는 역할을 담당한다. 이러한 상황에서 클라이언트의 요청마다 새로운 서블릿 객체를 생성하는 것은 비효율적이다. 서블릿 컨테이너는 최초 로딩 시점에 서블릿 객체를 생성하고 이를 재활용하며 서블릿 컨테이너 종료 시 함께 소멸된다.

멀티 쓰레딩
서블릿 컨테이너는 각 요청을 서블렛 인스턴스의 자체 쓰레드에서 실행시키는 멀티 쓰레딩을 지원한다. 멀티 쓰레드를 WAS가 처리하기 때문에 개발자는 멀티 쓰레드 관련 코드를 신경쓰지 않아도 된다. 하지만 싱글톤 객체(서블릿, 빈)는 주의해서 사용해야 한다.

3. 동작 방식

  1. 클라이언트가 요청(localhost:8080/hello)을 보내면 해당 URL이 서블릿 컨테이너로 전달된다.
  2. 서블릿 컨테이너는 요청을 기반으로 HttpServletRequest, HttpServletResponse 객체를 생성한다.
  3. web.xml을 기반으로 요청을 처리할 서블릿을 찾는다.
  4. Thread가 해당 서블릿의 service() 메서드를 호출하고 GET, POST 여부에 따라 doGet(), doPost()를 호출한다.
  5. doGet(), doPost() 메서드는 동적 페이지를 생성한 후 HttpServletResponse 객체에 응답을 보낸다.
  6. 응답 후 HttpServletRequest, HttpServletResponse 객체를 소멸시킨다.

Ref.

0개의 댓글