노트 :

[Servlet] 서블릿 컨테이너 본문

JAVA

[Servlet] 서블릿 컨테이너

IT_달토끼 2024. 1. 2. 00:35

 

1. 개념

 

컨테이너는 서블릿의 생성부터 소멸까지의 일련의 과정(Life Cycle)을 관리한다.

서블릿 컨테이너는 요청이 올 때 마다 새로운 쓰레드를 만든다.

대표적인 서블릿 컨테이너가 톰캣이다.

톰캣 같은 WAS가 자바 파일을 컴파일해서 .class 파일로 만들고 메모리에 올려 서블릿 객체를 만든다.

 

 

 

2. 서블릿 동작과정

① 사용자가 URL을 클릭하면 Http Request를 Servlet container에 보낸다.

② Servlet container는 HttpServletRequest, HttpServletResponse 두 객체를 생성한다.

③ 사용자가 요청한 URL을 분석하여 어느 Servlet에 대한 요청인지 찾는다.

④ 컨테이너는 Servlet service() 메소드를 호출하며, POST/GET 여부에 따라 doGet() 또는 doPost()가 호출된다.

⑤ doGet()이나 doPost() 메소드는 동적인 페이지를 생성한 후 HttpServletResponse 객체에 응답을 보낸다.

⑥ 응답이 완료되면 HttpServletRequest, HttpServletResponse 두 객체를 소멸시킨다.

 

 

 

3. 서블릿 생명주기

 

① init() : 서버가 켜질 때 한 번만 실행

② service: 모든 유저들의 요청을 받음

③ destroy() : 서버가 꺼질 때 한 번만 실행

 

 

 

5. 서블릿 컨테어너 역할

 

웹애플리케이션 서버 중에서 Http 요청을 받아 처리하는 기초 역할을 한다.

사용자가 웹 프레임워크를 사용해 작성한 웹 애플리케이션은 서블릿 컨테이너 위에서 동작한다.

서블릿 컨테이너의 종류로는 톰캣(Tomcat), 제티(Jetty), 네티(Netty), 언더토(Undertow)가 있다.

서블릿 컨테이너에 의해 프로그램이 실현되기 위해서는 Servlet Interface를 구현해줘야 한다.

사용자 정의 서블릿은 서블릿 컨테이너 내에 등록된 후 서블릿 컨테이너에 의해 생성, 호출, 소멸이 이루어진다.

때로 서블릿은 자신의 상태 변경 시점을 알아내 적절한 리소스 획득/반환 등의 처리를 해야하므로 Servlet Interface에 init()/destroy() 메서드가 정의된다.

Http 프로토콜로 전달된 메시지는 서블릿 컨테이너에서 해석되고 재조합되어 웹 프로그래머가 작성한 서블릿으로 전달하는 과정을 거친다.

 

6. 서블릿 관련 인터페이스 및 클래스

 

① Servlet: 서블릿 프로그램을 개발할 때 반드시 구현해야 하는 메서드를 선언하고 있는 인터페이스이다.

② GenericServlet: Servlet 인터페이스를 상속하여 클라이언트-서버 환경에서 서버단의 애플리케이션으로서 필요한 기능을 구현한 추상클래스이다. service() 메서드를 제외한 모든 메서드를 재정의하여 적절한 기능으로 구현되어 있다. GenericServlet 클래스를 상속하면 애플리케이션의 프로토콜에 따라 메서드 재정의 구문을 적용해야 한다.

③ HttpServlet: 일반적으로 일컫는 서블릿은 HttpServlet을 상속받은 서블릿을 의미한다. HttpServlet은 GenericServlet을 상속받았으며, GenericServlet의 유일한 추상 메서드인 service를 Http 프르토콜 요청 메서드에 적합하게 재구현해놨다. 

GET, POST, PUT, PATCH, HEAD, OPTIONS, TRACE 를 처리하는 메서드가 모두 정의되어 있다.

 

7, 서블릿 실행 순서

 

서블릿 실행 순서는 개발자가 아닌 서블릿 컨테어니가 관리한다. 이를 IoC(Inversion of Control, 제어의 역전)라고 한다.

서블릿 컨테이너는 클라이언트로부터 처음 요청이 들어오면 현재 실행할 서블릿이 최초의 요청인지 판단하고 맞으면, 새당 서블릿을 새로 생성한다. 이 작업은 최초 한 번만 실행된다. init() 메서드는 사용자 서블릿이 최초 생성되고 바로 호출되는 메서드 이다. service() 메서드는 최조의 요청이든 두 번째 요청이든 계속 호출되는 메서드이다.

 

 

 

8. 스프링 부트와 서블릿 컨테이너

 

스프링 부트는 내부적으로 서블릿 컨테이너의 종류인 톰갯을 가지고 있다.

스프링 부트에서 사용자 정의 프로그램을 구현한 프로그램인 서블릿은 DispatcherServlet이다.

즉, 스프링 부트에서 DispatcherServlet이 FrontController 역할을 한다.

스프링 부트는 ServletContainerInitializer를 구현한 TomcatStarter의 onStartup 메서드를 먼저 실행 후 Dispatcher 서블릿을 등록한다.

 

 

 

출처: https://12bme.tistory.com/555#recentComments

'JAVA' 카테고리의 다른 글

[spring] 스프링 부트 3.x 버전 데이터베이스 설정(application.yml)  (2) 2024.01.03
자바 로그 레벨(log)  (0) 2023.12.26
열거형(enum)  (2) 2023.12.26
스트림(Stream)  (0) 2023.12.24
컬렉션 프레임웍(Collections Framework)  (0) 2023.12.24