최근, Spring을 이용한 웹 개발을 공부하면서, 기존의 Servlet, JSP에 대한 이해가 부족하다는 것을 느꼈다. 이에 다시 기본으로 돌아가 Servlet과 이것이 동작하는 방법에 대해 공부해보았다.
Servlet
Servlet 이란?
쉽게 말해 Servlet은 자바를 이용해서 동적으로 웹페이지를 생성하는 서버측 프로그램 혹은 그 사양을 말한다. 구체적으로 Java EE에서 자바로 동적인 웹페이지를 생성하는 사양을 Servlet이라 정의했고, 여기서 정의한 Servlet API 를 구현한 것을 Servlet 이라고 부른다. 웹에서 동작하기 위한 HTTP 통신등의 기반기술은 모두 컨테이너에 구현되어있고, Servlet에는 사용자의 요청을 처리하는 로직이 담겨있게 된다.
Servlet 컨테이너
Servlet을 관리하는 프로그램이다. 여기서 관리는, 메모리 로딩과 객체의 생성, 그리고 사용자의 요청에 알맞는 Servlet을 실행시키는 것을 의미한다. 즉, Servlet 컨테이너는 Servlet을 제어하는 주체이다.
Java SE에서는 프로그래머가 main 메서드에 어떤 로직으로 자신이 작성한 클래스들이 사용될지 작성함으로써 개발자가 실행 흐름을 제어한다. 그러나, Java EE 기반 프로그램에서는 프로그래머가 실행흐름을 제어하지 않는다. 컨테이너가 실행흐름을 제어한다. 이렇게 개발자가 아닌 다른 무언가가 프로그램의 실행 흐름을 제어하는 것을 IoC, 제어의 역전 이라고 한다.
이런 Servlet 컨테이너를 포함한 여러 사양들이 정의된 Java EE를 구현한 것을 WAS 라 부르며, 그중 가장 대표적인 것이 Tomcat이다. 즉, Tomcat은 Servlet 컨테이너를 포함하고 있고, 문맥에 따라서 Servlet 컨테이너를 Tomcat 이라 이해해도 큰 무리는 없다.
web.xml
Servlet 컨테이너가 프로그램 전체 실행 흐름을 제어하기 위해서는 어떤 Sevlet이 어떤 요청을 처리할 수 있는지, 어떤 요청이 어떤 인증과정을 거쳐야 하는지 등의 정보를 필요로 한다. 이런 정보를 제공하기 위해 web.xml을 사용한다. Servlet 3.0 이후 버전부턴 Java 코드에서 설정하는 것도 가능하다.
Servlet Context
Servlet 컨테이너가 웹 어플리케이션 전체의 실행흐름을 제어하기 위해서는, 어플리케이션에 속하는 여러 Servlet 과 컨테이너 사이에 정보를 주고받을 필요가 있다. 이것을 수행하는 것이 바로 Servlet Context 이다. Servlet Context 는 웹 어플리케이션 마다 하나씩 존재하고, Servlet 컨테이너가 실행될 때 생성되고, 웹 어플리케이션이 중지될 때 삭제된다. 이런 특성을 이용해, 웹 어플리케이션 단위로 저장해야 할 정보들을 저장하는 역할도 Servlet Context가 담당한다.
Servlet 의 실행순서
Servlet이 실행되는 순서는 다음과 같다.

우선, 클라이언트의 요청을 웹서버가 받는다. 이를 Servlet 컨테이너에 넘기면, Servlet 컨테이너가 이를 처리할 Servlet을 결정하고, 그 Servlet이 메모리에 있으면 service() 메서드를 실행시키고, 만일 메모리에 해당 Servlet이 없으면 메모리에 로드(내부의 클래스 로더가 이를 처리) 후 객체를 생성하고 init() 메서드를 통해 Servlet의 초기화작업을 수행한 다음 service() 메서드를 실행시킨다.
여기서 짚고 넘어가야 할 부분이 있다.
- 모든 Servlet 은 싱글톤이다. 즉, 최초 요청이 들어온 시점에 Servlet 객체가 생성되고 이후 에 계속 재사용된다.
- 그럼, 동시에 여러 요청이 들어올 경우에는 어떻게 처리할까?
Servlet 컨테이너는 각 요청마다 하나의 쓰레드에서 처리한다. 즉, 요청을 처리하는 Servlet 객체는 하나이지만, 그 객체의 쓰레드는 여러개 존재한다. 각 요청이 들어올 때 마다, Servlet 컨테이너는 미리 준비해둔 쓰레드 풀에서 쓰레드를 꺼내 각 요청을 처리하고, 응답한후 다시 쓰레드를 쓰레드 풀에 저장한다.
출처 :
https://medium.com/jiwon-bae/web-servlet-servlet-container-b6c3a4c6549f
Servlet : Servlet & Container
What is Servlet container?
medium.com
https://jeong-pro.tistory.com/222
Servlet에 대한 개념없이 스프링을 했네요? (급하게 알아보는 스프링 기반 기술 Servlet, Servlet Context,
급하게 알아보는 스프링 기반 기술 이름은 아주 거창하게 "스프링 기반 기술" 이라고 지어봤습니다. 배경 최근에 첫 이직을 했습니다. 낯설기도하고 약간의 긴장감과 약간의 두려움이 합쳐져서
jeong-pro.tistory.com
https://jordy-torvalds.tistory.com/14
[MVC Servlet의 모든 것] 자바 EE, Servlet, ServletContext 등 개념
Java EE Java EE는 자바를 이용한 서버측 개발을 위한 플랫폼으로, Java EE 스펙에 따라 제품 구현한 것을 WAS 라고 함. Java Servlet 자바 서블릿(Java Servlet)은 자바를 사용하여 웹페이지를 동적으로 생성하
jordy-torvalds.tistory.com