대덕공부/Spring
서블릿과 서블릿컨테이너
02O2
2022. 6. 2. 19:56
[ 웹서버란 ? ]
- 웹서버 : 웹페이지를 사용자에게 전송하는 서버
- 웹 서버는 데이터를 전송하기 위해 HTTP 프로토콜을 사용합니다.
- 일반적인 상황에서 사용자는 브라우저에 URL(https://velog.io/@han_been)을 입력합니다.
- 그리고 사용자는 웹페이지를 얻게 됩니다.
- 웹서버가 하는 일은 웹페이지를 사용자에게 전송하는 것입니다.
[ 서블릿 컨테이너란 ? ]
- 서블릿 컨테이너
: 서블릿들의 생성, 실행, 파괴를 담당한다.
: 서블릿들을 위한 상자(Container)입니다.
서버에 만들어진 서블릿이 스스로 작동하는 것이 아니라, 서블릿을 관리 해주는 것이 필요한데, 이러한 역할을 하는 것이 바로 서블릿 컨테이너 입니다.
즉, 서블릿을 '요구사항 명세서'라고 표현한다면, 서블릿 컨테이너는 그 명세서를 보고 개발하는 '개발자'입니다.
서블릿 컨테이너는 Clinet의 Request를 받아주고 Response할 수 있게, 웹 서버와 소켓을 만들어 통신합니다.
대표적으로 무료 서비스인 Tomcat(톰캣)이 있습니다.
톰캣은 웹 서버와 소켓을 만들어 통신하며 JSP(java server page)와 Servlet이 작동할 수 있는 환경을 제공합니다.
- 일반적으로 사용자는 서버에서 오직 정적인 웹페이지만을 요청할 수 있음
- 만약 사용자가 본인의 입력을 기초로한 웹페이지를 자유롭게 얻고 싶다면 이 방법은 제한적임
- 서블릿 컨테이너는 서버 사이드에서 동적으로 웹페이지를 생성하기 위해 자바를 사용
- 때문에 웹서버와 서블릿들이 상호작용할 때 서블릿 컨테이너는 필수적
Servlet에 대한 기초가 궁금하시다면 CLICK!!
[ 서블릿 컨테이너의 역할은 ? ]
1. 웹서버와의 통신 지원
- 서블릿 컨테이너는 서블릿과 웹서버가 손쉽게 통신할 수 있게 해주어, 소켓을 만들고 listen, accept 등을 API로 제공하여 복잡한 과정을 생략할 수 있게 해준다.
2. 서블릿 생명주기(Life Cycle) 관리
- 서블릿 컨테이너는 서블릿의 탄생과 죽음을 관리한다.
- 서블릿 클래스를 로딩하여 인스턴스화
- 초기화 메소드를 호출
- 요청이 들어오면 적절한 서블릿 메소드를 호출합니다.
- 서블릿 소멸 시 Garbage Collection(가비지 컬렉션)을 진행
서블릿 생명 주기(Servlet Life Cycle)가 궁금하시다면 CLICK!!
3. 멀티쓰레드 지원 및 관리
- 서블릿 컨테이너는 요청이 올 때 마다 새로운 자바 쓰레드를 하나 생성
- HTTP 서비스 메소드를 실행하고 나면, 쓰레드는 자동으로 소멸
- 원래는 쓰레드를 관리해야 하지만 서버가 다중 쓰레드를 생성 및 운영해주니 쓰레드의 안정성에 대해서 걱정하지 않아도 된다.
4. 선언적인 보안 관리
- 서블릿 컨테이너를 사용하면 개발자는 보안에 관련된 내용을 서블릿 또는 자바 클래스에 구현해 놓지 않아도 됩니다.
- 일반적으로 보안관리는 XML 배포 서술자에 다가 기록하므로, 보안에 대해 수정할 일이 생겨도 자바 소스 코드를
수정하여 다시 컴파일 하지 않아도 보안관리가 가능합니다.
[ 웹 서버와 서블릿 컨테이너는 어떻게 요청을 처리할까 ? ]
- 웹서버가 HTTP 요청을 받는다
- 웹서버는 요청을 서블릿 컨테이너로 전달합니다.
- 서블릿이 컨테이너에 없다면, 서블릿을 동적으로 검색하여 컨테이너의 주소 공간에 로드한다
- 컨테이너가 서블릿의 init() 메소드를 호출하면, 서블릿이 초기화된다
: 서블릿이 처음 로드됬을 때 한번만 호출- 컨테이너가 서블릿의 service() 메소드를 호출하여 HTTP 요청을 처리한다.
(요청의 데이터를 읽고, 응답을 만들어낸다)
서블릿은 컨테이너 주소에 남아있고, 다른 HTTP 요청들을 처리할 수 있습니다.- 웹서버는 동적으로 생성된 결과를 올바른 위치에 반환한다.
[ 이 과정에서 JVM의 역할은 ? ]
- 각 요청들을 '분리된 스레드' 내부에서 처리한다
- 즉, 서블릿을 사용하는 것은 JVM이 각 요청을 분리된 자바 스레드 내부에서 처리하도록 하는 것
- 이는 서블릿 컨테이너의 주요 장점 중 하나이다.
- 각 서블릿은 HTTP 요청에 응답하는 특정한 요소들이 있는 자바 클래스이다.
- 대부분의 사례에 서블릿 컨테이너는 하나의 JVM에서 동작하지만 컨테이너가 여러개의 JVM들을 필요로하는 문제들이 존재하기도 한다.
서블릿 컨테이너 의 가장 중요한 기능은 요청을 올바른 서블릿에 전달해서 처리되도록하고, JVM이 해당 요청을 처리 한 후에는 생성된 결과를 올바른 장소에 동적으로 반환 해주는 것이다.