Posts 서블릿 컨테이너
Post
Cancel

서블릿 컨테이너

서블릿 컨테이너는 서블릿들의 생성, 실행, 파괴를 담당하며 서블릿을 관리해준다. 서블릿 컨테이너는 클라이언트의 요청을 받고 응답할 수 있게, 웹 서버와 소켓을 만들어 통신한다.

servlet container

서블릿 컨테이너의 대표적인 무료 서비스로 톰캣이 있다. 톰캣은 웹 서버와 소켓을 만들어 통신하며 JSP와 서블릿이 작동할 수 있는 환경을 제공한다.


서블릿이란?

웹 프로그래밍에서 클라이언트의 HTTP 요청을 처리하고 응답을 보내는 자바 프로그래밍 기술. Servlet 클래스의 구현 규칙을 따른다.

Servlet 은 javax.servlet 패키지에 정의된 인터페이스로, 서블릿의 라이프 사이클을 위한 세가지 필수적인 메서드를 정의한다.

  • init() : 서블릿 초기화 단계에 호출됨
  • service() : 초기화 이후 각각의 요청이 들어오면 호출됨
  • destroy() : 서블릿 객체가 파괴되어야할 때 호출됨

서블릿의 특징

  • 클라이언트 요청에 동적으로 작동
  • java thread를 이용해 동작
  • html 변경시 재컴파일 필요
  • java 코드에 html이 들어가있음
  • html을 사용해서 요청에 응답


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

웹 서버와의 통신 지원

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

서블릿 생명주기 관리

  1. 서블릿 클래스를 로딩하여 인스턴스화
  2. 초기화 메서드를 호출
  3. 요청이 들어오면 적절한 서블릿 메서드를 호출한다
  4. 서블릿 소멸시 GC를 진행

멀티 쓰레드 지원 및 관리

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

선언적인 보안 관리

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


서블릿 컨테이너 동작방식

images%2Fhan_been%2Fpost%2Fb6a06db4-33a2-4bfc-a822-81a8dafe90d1%2Fimage

  1. 웹 서버가 HTTP 요청을 받는다
  2. 웹서버는 요청을 서블릿 컨테이너로 전달한다
  3. 서블릿이 컨테이너에 없다면, 서블릿을 동적으로 검색하여 컨테이너의 주소 공간에 로드한다
  4. 컨테이너가 서블릿의 init() 메소드를 호출하면, 서블릿이 초기화된다
  5. 컨테이너가 서블릿의 service() 메소드를 호출하여 HTTP 요청을 처리한다.
  6. 웹서버는 동적으로 생성된 결과를 올바른 위치에 반환한다.


JVM의 역할

이 과정에서 JVM은 클라이언트의 요청들을 각각 분리된 스레드 내부에서 처리한다. 즉, 서블릿을 사용하는 것은 JVM이 각 요청을 분리된 자바 스레드 내부에서 처리하도록 하는 것이다. 각 서블릿은 HTTP 요청에 응답하는 특정한 요소들이 있는 자바 클래스이다.

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

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


서블릿 사용 예시

1
2
3
4
5
6
7
8
9
10
@WebServlet(name = "requestHeaderServlet", urlPatterns = "/request-header")
public class RequestHeaderServlet extends HttpServlet {
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response)
		throws ServletException, IOException {
	  System.out.println("request.getMethod() = " + request.getMethod());
		...
		response.getWriter().write("ok");
	}
}
  • @WebServlet : 클라이언트의 요청 URL을 보고 서블릿 컨테이너에서 서블릿을 매핑할 때 web.xml을 통해 찾는 방법과 애노테이션으로 찾는 방법이 있다. 여기서는 @WebServlet을 사용하여 애노테이션으로 접근하였다
  • HttpServlet : Servlet인터페이스를 구현한 클래스로, HTTP 요청에 대응하기 좋은 형태로 구현되어있다. WAS가 생성한 HttpServletRequest와 HttpServletResponse을 받아 servicedoGet 등의 메서드를 수행한다.
  • HttpServletRequest, HttpServletResponse : 클라이언트의 요청과, 응답을 위한 데이터는 개발자가 접근하기 어려운 단순 텍스트로 되어있다. 이와 같은 요청/응답에 쉽게 접근할 수 있도록 하는 객체가 이 두가지이다.



출처

https://velog.io/@han_been/%EC%84%9C%EB%B8%94%EB%A6%BF-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88Servlet-Container-%EB%9E%80

https://velog.io/@han_been/Servlet

김영한의 스프링 MVC 1

This post is licensed under CC BY 4.0 by the author.

ElasticSearch

SockJS

Comments powered by Disqus.