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

조한빈·2020년 10월 9일
31

Java_BackEnd

목록 보기
1/4
post-thumbnail

출처 : 잘 정리된 영문 사이트 참고

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

  • 웹서버에 대해서 알아보겠습니다.

[ 웹서버란 ? ]

  • 웹서버 : 웹페이지를 사용자에게 전송하는 서버

web server

  • 웹 서버는 데이터를 전송하기 위해 HTTP 프로토콜을 사용합니다.
  • 일반적인 상황에서 사용자는 브라우저에 URL(https://velog.io/@han_been)을 입력합니다.
  • 그리고 사용자는 웹페이지를 얻게 됩니다.
  • 웹서버가 하는 일은 웹페이지를 사용자에게 전송하는 것입니다.

[ 서블릿 컨테이너란 ? ]

  • 서블릿 컨테이너
    : 서블릿들의 생성, 실행, 파괴를 담당한다.
    : 서블릿들을 위한 상자(Container)입니다.

서버에 만들어진 서블릿이 스스로 작동하는 것이 아니라, 서블릿을 관리 해주는 것이 필요한데, 이러한 역할을 하는 것이 바로 서블릿 컨테이너 입니다.

즉, 서블릿을 '요구사항 명세서'라고 표현한다면, 서블릿 컨테이너는 그 명세서를 보고 개발하는 '개발자'입니다.

서블릿 컨테이너는 Clinet의 Request를 받아주고 Response할 수 있게, 웹 서버와 소켓을 만들어 통신합니다.

대표적으로 무료 서비스인 Tomcat(톰캣)이 있습니다.

톰캣은 웹 서버와 소켓을 만들어 통신하며 JSP(java server page)와 Servlet이 작동할 수 있는 환경을 제공합니다.
servlet container

  • 일반적으로 사용자는 서버에서 오직 정적인 웹페이지만을 요청할 수 있음
  • 만약 사용자가 본인의 입력을 기초로한 웹페이지를 자유롭게 얻고 싶다면 이 방법은 제한적임
  • 서블릿 컨테이너는 서버 사이드에서 동적으로 웹페이지를 생성하기 위해 자바를 사용
  • 때문에 웹서버와 서블릿들이 상호작용할 때 서블릿 컨테이너는 필수적

Servlet에 대한 기초가 궁금하시다면 CLICK!!

[ 서블릿 컨테이너의 역할은 ? ]

1. 웹서버와의 통신 지원

  • 서블릿 컨테이너는 서블릿과 웹서버가 손쉽게 통신할 수 있게 해주어, 소켓을 만들고 listen, accept 등을 API로 제공하여 복잡한 과정을 생략할 수 있게 해준다.

2. 서블릿 생명주기(Life Cycle) 관리

  • 서블릿 컨테이너는 서블릿의 탄생과 죽음을 관리한다.
      1. 서블릿 클래스를 로딩하여 인스턴스화
      1. 초기화 메소드를 호출
      1. 요청이 들어오면 적절한 서블릿 메소드를 호출합니다.
      1. 서블릿 소멸 시 Garbage Collection(가비지 컬렉션)을 진행

서블릿 생명 주기(Servlet Life Cycle)가 궁금하시다면 CLICK!!

3. 멀티쓰레드 지원 및 관리

    1. 서블릿 컨테이너는 요청이 올 때 마다 새로운 자바 쓰레드를 하나 생성
    1. HTTP 서비스 메소드를 실행하고 나면, 쓰레드는 자동으로 소멸
    1. 원래는 쓰레드를 관리해야 하지만 서버가 다중 쓰레드를 생성 및 운영해주니 쓰레드의 안정성에 대해서 걱정하지 않아도 된다.

4. 선언적인 보안 관리

  • 서블릿 컨테이너를 사용하면 개발자는 보안에 관련된 내용을 서블릿 또는 자바 클래스에 구현해 놓지 않아도 됩니다.
  • 일반적으로 보안관리는 XML 배포 서술자에 다가 기록하므로, 보안에 대해 수정할 일이 생겨도 자바 소스 코드를
    수정하여 다시 컴파일 하지 않아도 보안관리가 가능합니다.

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

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

[ 이 과정에서 JVM의 역할은 ? ]

  • 각 요청들을 '분리된 스레드' 내부에서 처리한다
  • 즉, 서블릿을 사용하는 것은 JVM이 각 요청을 분리된 자바 스레드 내부에서 처리하도록 하는 것
  • 이는 서블릿 컨테이너의 주요 장점 중 하나이다.
  • 각 서블릿은 HTTP 요청에 응답하는 특정한 요소들이 있는 자바 클래스이다.
  • 대부분의 사례에 서블릿 컨테이너는 하나의 JVM에서 동작하지만 컨테이너가 여러개의 JVM들을 필요로하는 문제들이 존재하기도 한다.

서블릿 컨테이너 의 가장 중요한 기능은 요청을 올바른 서블릿에 전달해서 처리되도록하고, JVM이 해당 요청을 처리 한 후에는 생성된 결과를 올바른 장소에 동적으로 반환 해주는 것이다.

1개의 댓글

comment-user-thumbnail
2023년 3월 9일

님 짱..!

답글 달기