티스토리 뷰

개발/Java

서블릿 컨테이너(Servlet Container)란?

책 읽는 개발자_테드 2020. 1. 11. 17:23

잘 정리된 글이 있어 의역해봅니다.

 

출처입니다.https://www.programcreek.com/2013/04/what-is-servlet-container/

 

이 글에서는 웹 서버, 서블릿 컨테이너 그리고 이것들과 JVM과의 관계를 일반적인 생각을 적습니다. 서블릿 컨테이너는 자바 프로그램에 불과하다는 걸 보여주고 싶었습니다. 

1. 웹서버란? - 웹페이지를 사용자에게 전송

서블릿 컨테이너를 알기전에 웹서버에 대한 이해가 먼저 필요합니다.

웹서버는 데이터를 전송하기 위해 HTTP 프로토콜을 사용합니다. 일반적인 상황에서 사용자는 브라우저에 URL(e.g. www.programcreek.com/static.html) 을 입력하고 웹페이지를 얻게 됩니다. 웹서버가 하는 일은 웹페이지를 사용자에게 전송하는 것입니다. 변화하는 것은 HTTP 프로토콜에서 형식이 지정되는 요청과 반응 메세지입니다.

 

1. 서블릿 컨테이너란? - 서블릿 컨테이너는 서블릿들의 생성, 실행, 파괴를 담당

여기서 볼 수 있듯이, 사용자는 서버에서 오직 정적인 웹페이지만 요청할 수 있습니다. 만약 사용자가 본인의 입력을 기초로한 웹 페이지를 보고 싶다면 이 방법은 충분하지 않습니다. 서블릿 컨테이너의 일반적인 아이디어는 서버 사이드에서 동적으로 웹 페이지를 생성하기 위해 자바를 사용하는 겁니다. 때문에 웹서버와 서블릿들이 상호작용할 때 서블릿 컨테이너는 필수적인 부분입니다. 

서블릿 컨테이너는 서블릿들을 위한 상자(Container) 입니다.

 

3. 서블릿이란? - javax.servlet package에 정의된 인터페이스, 요청을 처리함

서블릿이란 javax.servlet package에 정의된 인터페이스입니다. 이것은 서블릿의 라이프 사이클을 위한 세 가지 필수적인 메소드들을 정의합니다 -init(), service(), destroy(). 이 메소드들은 모든 서블릿(SDK에서 정의 되거나, 자체적으로 정의된)에 의해 구현되고, 특정 시간에 서버에 의해 호출됩니다.

 

1. init() - 해당 메소드는 서블릿 생명 주기중 초기화 단계에 호출됩니다. javax.servlet.ServletConfig 인터페이스를 구현하는 오브젝트가 전달되며, 이를 통해 서블릿이 웹 애플리케이션에서 초기화 매개변수(parameter)에 접근할 수 있도록 합니다.

 

2. service() - 해당 메소드는 초기화 이후 각각의 요청들이 들어오면 호출됩니다. 각각의 요청들은 별도로 나누어진 스레드에서 처리됩니다.

웹 컨테이너는 모든 요청에 대해 서블릿의 service() 메소드를 요청합니다. service() 메소드는 요청의 종류를 판별하고 요청을 처리할 적절한 메소드로 전달합니다. 

 

3. destroy() - 해당 메소드는 서블릿 객체가 파괴되어야할 때 호출됩니다. 해당 서블릿이 가지고 있던 자원(메모리)을 풀어(release)줍니다. 

 

서블릿 객체의 생명 주기에서 서블릿 클래스가 클래스 로더에 의해 컨테이너에 동적으로 로드되는 것을 볼 수 있습니다. 각 요청은 자체적인 스레드에 있으며, 서블릿 객체는 동시에 여러개의 스레드를 제공할 수 있습니다(thread not safe). 더 이상 사용되지 않을 때는, JVM에 의해 가비지 컬렉팅 되어야합니다. 

다른 자바 프로그램처럼, 서블릿들은 JVM 내부에서 작동합니다. HTTP 요청들의 복잡성을 처리하기 위해서 서블릿 컨테이너가 제공됩니다.  서블릿 컨테이너는 서블릿들의 생성, 실행, 파괴를 담당합니다.

 

#thread not safe코드가 다른 스레드에 의해 상태가 변경될 수 있음을 의미합니다. 

 

4. 서블릿 컨테이너와 웹서버는 어떻게 요청을 처리할까?

  1. 웹서버가 HTTP 요청을 받습니다. 
  2. 웹서버는 요청을 서블릿 컨테이너로 전달합니다. 
  3. 서블릿이 컨테이너에 없다면,  서블릿을 동적으로 검색하여 컨테이너의 주소 공간에 로드합니다
  4. 컨테이너가 서블릿의 init() 메소드를 호출하면, 서블릿이 초기화 됩니다(서블릿이 처음 로드됬을 때 한번만 호출됩니다).
  5. 컨테이너가 서블릿의 service() 메소드를 호출하여 HTTP 요청을 처리합니다(예: 요청의 데이터를 읽고, 응답을 만들어냅니다.). 서블릿은 컨테이너 주소에 남아있고, 다른 HTTP 요청들을 처리할 수 있습니다.
  6. 웹서버는 동적으로 생성된 결과를 올바른 위치에 반환합니다. 

위의 여섯 단계는 다음에 보이는 다이어그램에 표시되어 있습니다:

5. JVM의 역할은? - 각 요청을 분리된 자바 스레드 내부에서 처리

서블릿을 사용하는 것은 JVM이 각 요청을 분리된 자바 스레드 내부에서 처리하도록 하며, 이는 서블릿 컨테이너의  주요 장점 중 하나입니다. 각 서블릿은 HTTP 요청에 응답하는 특한 요소들이 있는 자바 클래스입니다. 서블릿 컨테이너의 가장 중요한 기능은 요청을 올바른 서블릿에  전달해서 처리되도록 하고, JVM이 해당 요청을 처리한 후에는 생성된 결과를 올바른 장소에 동적으로 반환해주는 것입니다. 

대부분의 사례에 서블릿 컨테이너는 하나의 JVM에서 동작합니다. 하지만 컨테이너가 여러개의 JVM들을 필요로하는 문제들도 존재합니다.

From Program Creek 

 

출처

https://www.programcreek.com/2013/04/what-is-servlet-container/

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함