on
서블릿 컨테이너(Servlet Container)란?
1. 웹 서버란?
웹 페이지를 사용자에게 전송.
서블릿 컨테이너를 알기 전에 웹 서버에 대한 이해가 먼저 필요하다.
웹 서버는 데이터를 전송하기 위해 HTTP 프로토콜을 사용한다. 일반적인 상황에서 사용자는 브라우저에 URL(e.g. www.programcreek.com/static.html)을 입력하고 웹 페이지를 얻게 된다. 웹 서버가 하는 일은 웹 페이지를 사용자에게 전송하는 것이다. 변화하는 것은 HTTP 프로토콜에서 형식이 지정되는 요청과 반응 메세지이다.
2. 서블릿 컨테이너란?
서블릿 컨테이너는 서블릿들의 생성, 실행, 파괴를 담당.
아래의 그림처럼, 사용자는 서버에 오직 정적인 웹 페이지만 요청할 수 있다. 만약 사용자가 본인의 입력을 토대로한 웹 페이지를 보고 싶다면 이 방법은 충분하지 않다. 서블릿 컨테이너의 일반적인 아이디어는 서버 사이드에서 동적으로 웹 페이지를 생성하기 위해 자바를 사용하는 것이다. 그렇기 떄문에 웹 서버와 서블릿들이 상호작용 할 때 서블릿 컨테이너는 필수적인 부분이다.
3. 서블릿이란?
javax.servlet package에 정의된 인터페이스. 요청을 처리함.
서블릿이란 javax.servlet package에 정의된 인터페이스이다. 이것은 서블릿의 라이프 사이클을 위한 세 가지 필수적인 메서드 init()
, service()
, destroy()
를 정의한다. 이 메서드들은 SDK1에서 정의되거나 자체적으로 정의된 모든 서블릿에 의해 구현되고, 서버에 의해서 특정 시간에 호출된다.
1. init()
init()은 서블릿 라이프 사이클 중 초기화 단계에서 호출된다. javax.servlet.ServletConfig 인터페이스를 구현하는 오브젝트가 전달되며, 이를 통해 서블릿이 웹 애플리케이션에서 초기화 매개변수(parameter)에 접근할 수 있도록 한다.
2. service()
초기화 이후 각각의 요청들이 들어올 때 호출된다. 각각의 요청들은 별도로 나뉘어진 쓰레드에서 처리된다.
웹 컨테이너는 모든 요청에 대해 service() 메서드를 요청한다. service() 메서드는 요청의 종류를 판별하고 요청을 처리할 적절한 메서드로 전달한다.
3. destroy()
destroy() 메서드는 서블릿 객체가 파괴되어야 할 때 호출된다. 해당 서블릿이 가지고 있던 자원(메모리)을 풀어준다(release).
서블릿 객체의 라이프 사이클에서 서블릿 클래스가 클래스 로더에 의해 컨테이너에 동적으로 로드되는 것을 볼 수 있다.
각 요청은 자체적인 쓰레드에 있으며, 서블릿 객체는 동시에 여러 개의 쓰레드를 제공할 수 있다.(htread not safe).
더 이상 사용되지 않을 때는, JVM에 의해 GC 되어야 한다.
다른 자바 프로그램처럼 서블릿들은 JVM 내부에서 작동한다. HTTP 요청들의 복잡성을 처리하기 위해서 서블릿 컨테이너가 제공된다.
4. 서블릿 컨테이너와 웹 서버는 어떻게 요청을 처리할까?
- 웹 서버가 HTTP 요청을 받는다.
- 웹 서버는 요청을 서블릿 컨테이너로 전달한다.
- 서블릿이 컨테이너에 없다면, 서블릿을 동적으로 검색하여 컨테이너의 주소 공간에 로드한다.
- 컨테이너가 서블릿의 init() 메서드를 호출하면, 서블릿이 초기화된다.(서블릿이 처음 로드 되었을 때 한 번만 호출된다.)
- 컨테이너가 서블릿의 service() 메서드를 호출하여 HTTP 요청을 처리한다. 서블릿은 컨테이너 주소에 남아있고, 다른 HTTP 요청들을 처리할 수 있다.
- 웹 서버는 동적으로 생성된 결과를 올바른 위치에 반환한다.
아래의 그림은 위의 여섯 단계를 나타낸 것이다.
5. JVM의 역할은?
각 요청을 분리된 자바 쓰레드 내부에서 처리
서블릿을 사용하는 것은 JVM이 각 요청을 분리된 자바 쓰레드 내부에서 처리하도록 하는 것이다. 이는 서블릿 컨테이너의 장점 중 하나이다.
각 서블릿은 HTTP 요청에 응답하는 특별한 요소들이 있는 자바 클래스이다. 서블릿 컨테이너의 가장 중요한 기능은 요청을 올바른 서블릿에 전달해서 처리되도록 하고, JVM이 해당 요청을 처리한 후에는 생성된 결과를 올바른 장소에 동적으로 반환해주는 것이다.
대부분의 경우 서블릿 컨테이너는 하나의 JVM에서 동작하지만, 컨테이너가 여러 개의 JVM을 필요로 하는 문제들도 존재한다.
출처
-
Software Development Kit ↩
Comments
JAVA 의 다른 글
-
서블릿 컨테이너(Servlet Container)란? 05 May 2021
-
지네릭스, 열거형, 애너테이션 27 Oct 2020
-
컬렉션 프레임웍 2편 16 Oct 2020
-
컬렉션 프레임웍 1편 14 Oct 2020
-
날짜와 시간 & 형식화 12 Oct 2020
-
java.lang패키지와 유용한 클래스 29 Sep 2020
-
예외처리 24 Sep 2020
-
객체지향 프로그래밍 II 2편 21 Sep 2020
-
객체지향 프로그래밍 II 1편 19 Sep 2020
-
객체지향 프로그래밍 I 2편 18 Sep 2020
-
객체지향 프로그래밍 I 1편 16 Sep 2020
-
배열 array 14 Sep 2020
-
조건문과 반복문 if, switch, for, while statement 13 Sep 2020
-
연산자 Operator 2편 13 Sep 2020
-
연산자 Operator 1편 11 Sep 2020
-
변수 Variable 2편 09 Sep 2020
-
변수 Variable 1편 08 Sep 2020
-
자바를 시작하기 전에 07 Sep 2020
-
래퍼 클래스(Wrapper Class)란 무엇인가 30 Aug 2020
-
java.lang.Math 29 Aug 2020
-
진수 변환, 형 변환 29 Aug 2020
-
Arrays.sort() 29 Aug 2020
-
Enhanced for loop 20 Aug 2020
-
toCharArray() 20 Aug 2020