서블릿 컨테이너가 무엇인지 알려면 먼저 웹 서버가 무엇인지 알아야 한다.
- 웹 서버는 HTTP 프로토콜을 사용하여 데이터를 전송한다.
- 사용자(클라이언트)는 브라우저에 URL(https://velog.io/)를 입력하여 웹 페이지를 얻는다.
웹 서버가 하는 일은 웹 페이지를 사용자(클라이언트)에게 보내주는 것이다.
서버에 만들어진 서블릿이 스스로 작동하는 것이 아니라, 서블릿을 관리 해주는 것이 필요한데, 이러한 역할을 하는 것이 바로 서블릿 컨테이너 이다.
즉, 서블릿 컨테이너(Servlet Container)는
- 서블릿들의 생성, 실행, 파괴를 담당하며,
- 서블릿들을 위한 상자(Container)이다.
웹 서버에서 볼 수 있듯이 사용자(클라이언트)는 서버에서 정적인 웹 페이지만 요청할 수 있다.
서블릿 컨테이너는
- 서버 사이드에서 동적으로 웹페이지를 생성하기 위해 Java를 사용한다.
- Clinet의 Request를 받아주고 Response할 수 있도록, 웹 서버와 소켓을 만들어 통신한다.
- 서블릿과 상호작용하는 웹 서버의 일부이며 웹 서버와 서블릿들이 상호작용할 때 서블릿 컨테이너는 필수적이다.
대표적으로 무료 서비스인 Tomcat(톰캣)이 있다.
Tomcat(톰캣)은 웹 서버와 소켓을 만들어 통신하며 JSP(java server page)와 Servlet이 작동할 수 있는 환경을 제공한다.
서블릿 컨테이너는 서블릿과 웹서버가 손쉽게 통신할 수 있게 해주어, 소켓을 만들고 listen, accept 등을 API로 제공하여 복잡한 과정을 생략할 수 있게 해준다.
서블릿 컨테이너는 서블릿의 탄생과 죽음을 관리한다.
1. 서블릿 클래스를 로딩하여 인스턴스화
2. 초기화 메소드를 호출
3. 요청이 들어오면 적절한 서블릿 메소드를 호출합니다.
4. 서블릿 소멸 시 Garbage Collection(가비지 컬렉션)을 진행
- 서블릿 컨테이너는 요청이 올 때 마다 새로운 자바 쓰레드를 하나 생성한다.
- HTTP 서비스 메소드를 실행하고 나면, 쓰레드는 자동으로 소멸된다.
- 원칙적으로 쓰레드를 관리해줘야 하지만 서버가 다중 쓰레드를 생성하고 운영해주니 쓰레드의 안정성에 대해서 걱정하지 않아도 된다.
- 서블릿 컨테이너를 사용하면 개발자는 보안에 관련된 내용을 서블릿 또는 자바 클래스에 구현해 놓지 않아도 된다.
- 일반적으로 보안관리는 배포시 XML에 기록하므로, 보안에 대해 수정할 일이 생겨도 자바 소스 코드를 수정하여 다시 컴파일 하지 않아도 보안관리가 가능하다.
- 웹 서버가 HTTP 요청을 받는다.
- 웹 서버는 요청을 서블릿 컨테이너로 전달한다.
- 서블릿이 컨테이너에 없는 경우, 서블릿 컨테이너는 서블릿을 동적으로 검색하여 컨테이너의 주소 공간에 로드한다.
- 컨테이너는 초기화를 위해 서블릿의
init()
메서드를 호출한다.
(서블릿이 처음 로드될 때 한 번만 호출된다.)- 컨테이너는 서블릿의 service() 메서드를 호출하여 HTTP 요청을 처리한다.
(요청request
의 데이터를 읽고, 응답response
을 생성한다)- 서블릿은 컨테이너 주소에 남아 있으며, 다른 HTTP 요청들을 처리할 수 있다.
- 웹 서버는 동적으로 생성된 결과를 올바른 위치로 반환한다.
*참고 - 톰캣에서 동작하는 서블릿의 Life cycle
위 과정에서 JVM은 각각의 요청들을 Java의 '분리된 스레드' 내부에서 처리한다
이는 서블릿 컨테이너의 장점 중 하나이다.
각각의 요청된 서블릿은 HTTP 요청request
에 응답response
하는 특정한 요소들이 있는 자바 클래스이다.
즉, 서블릿 컨테이너 의 가장 중요한 기능은 요청을 올바른 서블릿에 전달해서 처리되도록하고, JVM이 해당 요청을 처리 한 후에는 생성된 결과를 올바른 장소에 동적으로 반환 해주는 것이다.
웹 프로그래밍에서 사용자(클라이언트)의 요청을 처리하고,
그 결과를 다시 사용자(클라이언트)에게 전송하는 자바 프로그래밍 기술이다.
- 사용자(클라이언트)의 요청에 대해 동적으로 작동하는 웹 어플리케이션 이며,
자바로 만든 웹 애플리케이션을 서블릿(Servlet)이라 부른다.- Java Thread를 이용하여 동작한다.
- MVC 패턴에서 Controller로 이용된다.
- HTTP 프로토콜 서비스를 지원하는
javax.servlet.http.HttpServlet
클래스를 상속받는다.- Servlet 클래스의 구현 규칙을 따른다.
- 서블릿(Servlet)을 실행하려면 Java EE 규약에 따라 만든
서블릿 컨테이너
가 있어야 한다.- HTML을 사용하여 요청에 응답하며 HTML 수정 시 서블릿을 다시 컴파일해야 하는 단점이 있다.
- UDP보다 처리 속도가 느리다.
- 사용자(클라이언트)가 URL을 입력하면 HTTP Request를 Servlet Container로 전송한다.
- HTTP Request를 전송받은 Servlet Container는 HttpServletRequest, HttpServletResponse 두 객체를 생성한다.
- web.xml은 사용자가 요청한 URL을 분석하여 어느 서블릿에 대해 요청인지 찾는다.
- 해당 서블릿에서 service메소드를 호출한 후 클리아언트의 GET, POST 여부에 따라 doGet() 또는 doPost()를 호출한다.
- doGet() 또는 doPost() 메소드는 동적 페이지를 생성한 후 HttpServletResponse 객체에 응답을 보낸다.
- 응답이 끝나면 HttpServletRequest, HttpServletResponse 두 객체를 소멸시킨다.
참고 링크
Java Servlet Technology
What is Servlet Container?
[JSP] 서블릿(Servlet)이란?
Servlet
서블릿 컨테이너(Servlet Container) 란?