-
자바 서블릿 (Java Servlet) 정리프로그래밍 2022. 10. 31. 23:24반응형
Java Servlet Specification 정리
- 서블릿 동작 원리를 알기 위해 정리하는 것으로, 세부적인 내용은 모두 생략했다.1. Overview
1.1 What is a Servlet?
서블릿(Servlet)은 동적 컨텐츠를 생성하는 컨테이너에 의해 관리되는 자바 기반 웹 컴포넌트이다. 다른 자바 기반 컴포넌트처럼, 서블릿은 플랫폼과 독립적이다. 따라서 자바 기반 웹 서버라면 어느 플랫폼이던 실행 가능하다. 서블릿 엔진이라고도 불리는 컨테이너(Container)는 서블릿 기능을 제공하는 웹 서버 확장(Extension)이다. 서블릿은 서블릿 컨테이너에 의해 구현된 request/response 패러다임을 통해 웹 클라이언트와 상호작용한다.
1.2 What is a Servlet Container?
서블릿 컨테이너는 웹 서버나 어플리케이션 서버의 부분으로, request와 response가 보내지고, MIME 기반 요청들을 디코딩하고, MIME 기반 응답을 구성하는 네트워크 서비스를 제공한다. 서블릿 컨테이너는 그들의 생명 주기 동안 서블릿들을 포함하고 관리한다.
서블릿 컨테이너는 호스트 웹 서버나 add-on 컴포넌트로써 설치될 수 있다. 서블릿 컨테이너는 웹이 가능한 어플리케이션 서버에도 설치될 수 있다.
모든 서블릿 컨테이너는 반드시 request와 response를 위한 HTTP 프로토콜을 지원해야 하고, 추가적인 HTTPS 또한 지원할 수 있어야 한다.
1.3 An Example
아래는 전형적인 이벤트의 순서이다.
1. 클라이언트(보통 웹 브라우저)가 웹 서버에 접근하여 HTTP request를 보낸다.
2. request는 웹 서버로 보내지고 서블릿 컨테이너에게 인계된다. 서블릿 컨테이너는 호스트 웹 서버와 같은 프로세스, 같은 호스트의 다른 프로세스, 혹은 다른 호스트 웹 서버에서 실행될 수 있다.
3. 서블릿 컨테이너는 서블릿 설정(configuration)에 기초하여 어떤 서블릿을 호출할지 결정하고, request와 response를 표현하는 객체와 함께 호출한다.
4. 서블릿은 request 객체를 유저가 누구인지, HTTP POST 매개변수가 보내졌는지, 다른 연관된 데이터는 무엇인지 알아내기 위해 사용한다. 서블릿은 어떻게 프로그래밍 되었는지에 상관없이 수행하고, 클라이언트에게 보낼 데이터를 생성한다. 이 데이터는 response 객체를 통해 클라이언트에게 전송된다.
5. 일단 서블릿이 request를 처리하면, 서블릿 컨테이너는 응답이 제대로 전송되었다고 가정하고, 호스트 웹 서버에게 컨트롤을 넘긴다.
1.4 Comparing Servlets with Other Technologies
기능성 측면에서, 서블릿은 CGI(Common Gateway Interface)보다 더 높은 수준의 추상화를 제공하고, JavaServer Face와 같은 웹 프레임워크보다는 더 낮은 수준의 추상화를 제공한다.
서블릿은 다른 서버 확장 메커니즘보다 다음 이점들이 있다.
- 다른 프로세스 모델을 사용하기 때문에 CGI 스크립트보다 빠르다.
- 많은 웹 서버들에게 지원하는 표준 API를 사용한다.
- 개발하기 쉽고 플랫폼과 독립적인 자바 언어의 이점을 모두 가지고 있다.
- 자바 플랫폼에서 사용 가능한 많은 API들에 접근할 수 있다.
1.5 Relationship to Java Platform, Enterprise Edition
1.6 Compatibility with Java Servlet Specification Version 2.5
2. The Servlet Interface
서블릿 인터페이스(interface)는 자바 서블릿 API의 중심 추상화이다. 모든 서블릿들은 이 인터페이스를 직접, 혹은 이 인터페이스를 구현한 확장 클래스(주로 추상 클래스)를 구현해야 한다. 자바 서블릿 API에 두가지 확장 클래스가 있는데, 이는 GenericServlet과 HttpServlet이다. 보통 개발자들은 서블릿 인터페이스를 구현하기 위해 HttpServlet을 사용한다.
2.1 Request Handling Methods
기본 Servlet 인터페이스는 클라이언트 request를 처리하기 위해 service 메소드를 정의한다. 이 메소드는 서블릿 컨테이너가 서블릿 인스턴스에 라우팅하는 각각의 request에서 호출된다.
웹 어플리케이션에서 동시 요청 처리는 일반적으로 특정 시간에 service 메소드 안에서 여러 쓰레드를 처리하는 디자인을 요구한다.
일반적으로 웹 컨테이너는 동시 요청을 같은 서블릿 안에서 다른 쓰레드들의 service 메소드 동시 실행을 통해 처리한다.
2.1.1 HTTP Specific Request Handling Methods
HttpServlet 추상 서브클래스는 Servlet 인터페이스를 넘어 추가적인 메소드들을 정의한다.
- HTTP GET request 처리를 위한 doGet
- HTTP POST request 처리를 위한 doPost
- HTTP PUT request 처리를 위한 doPut
- HTTP DELETE request 처리를 위한 doDelete
- HTTP HEAD request 처리를 위한 doHead
- HTTP OPTIONS request 처리를 위한 doOptions
- HTTP TRACE request 처리를 위한 doTrace
HTTP 기반 서블릿을 개발할 때, 개발자는 보통 doGet과 doPost 메소드만 신경쓴다. 다른 메소드들은 더 숙련된 프로그래머들이 고려한다.
2.1.2 Additional Methods
2.1.3 Conditional GET Support
2.2 Number of Instances
2.3 Servlet Life Cycle
서블릿은 로딩과 인스턴스화(Loading and Instantiation), 초기화(Initialization), 클라이언트 요청 처리(Request Handling), service로부터 빠져나오는 것(End of Service)를 정의하는 생명 주기(Life Cycle)를 통해 관리된다. 이 생명 주기는 API에 init, service, destroy 메소드로써 javax.servlet.Servlet 인터페이스에 정의되어 있고, 이는 모든 서블릿들이 직접 구현하거나 GenericServlet이나 HttpServlet을 구현함으로써 반드시 구현되어야 한다.
2.3.1 Loading and Instantiation
서블릿 컨테이너는 서블릿을 로딩하고 인스턴스화해야 한다. 로딩과 인스턴스화는 컨테이너가 시작될 때나, 컨테이너가 요청 처리를 위해 필요한 서블릿을 결정할 때까지 딜레이될 때 발생한다.
서블릿 엔진(서블릿 컨테이너)가 시작될 때, 필요한 서블릿 클래스들이 반드시 서블릿 컨테이너에 의해 위치해있어야 한다. 서블릿 컨테이너는 일반 자바 클래스 로딩처럼 서블릿 클래스를 로딩한다. 로딩은 로컬 파일 시스템이나 원격 파일 시스템, 다른 네트워크 서비스로부터 수행될 수 있다.
서블릿 클래스를 로딩한 후에는 컨테이너가 그들을 인스턴스화한다.
2.3.2 Initialization
서블릿 객체들이 인스턴스화된 후에는, 컨테이너는 서블릿들이 클라이언트 요청을 처리하기 전에 반드시 초기화해야 한다. 초기화를 함으로써 서블릿은 설정(configuration) 데이터을 읽고, 리소스들을 초기화하고, 다른 행동을 수행할 수 있다. 컨테이너는 ServletConfig 인터페이스를 구현한 유일한(서블릿 선언마다) 객체와 함께 Servlet 인터페이스에 있는 init 메소드를 호출함으로써 서블릿 인스턴스를 초기화한다. 이 설정 객체(Configuration Object)는 서블릿이 웹 어플리케이션의 설정 정보로부터 얻어지는 명명값 초기화 매개변수를 접근할 수 있도록 한다. 설정 객체는 또한 서블릿의 런타임 환경을 설명하는 객체(ServletContext를 구현한 객체)에 서블릿이 접근할 수 있도록 한다.
2.3.2.1 Error Conditions on Initialization
2.3.2.2 Tool Considerations
2.3.3 Request Handling
서블릿이 초기화된 후에, 서블릿 컨테이너는 클라이언트 요청을 처리하기 위해 서블릿들을 사용한다. request들은 ServletRequest 타입의 객체로 표현된다. 서블릿은 ServletResponse 타입의 객체 안의 메소드를 호출함으로써 response를 채워 넣는다. 이 두 객체들은 Servlet 인터페이스 안의 service 메소드의 매개변수로 정의되어 있다.
HTTP request에 경우에, 컨테이너에 의해 제공되는 객체는 HttpServletRequest와 HttpServletResponse 객체이다.
서블릿 인스턴스는 생명 주기 동안 어떠한 request를 처리하지 않을 수도 있다는 사실을 명심하자.
2.3.3.1 Multithreading Issues
2.3.3.2 Exceptions During Request Handling
2.3.3.3 Asynchronous processing
2.3.3.4 Thread Safety
2.3.3.5 Upgrade Processing
2.3.4 End of Service
서블릿 컨테이너는 특정 시간 동안 로딩된 서블릿을 계속 유지할 필요가 없다. 서블릿 인스턴스는 서블릿 컨테이너 안에 활성화된 상태로 밀리세컨드, 서블릿 컨테이너의 생명 주기, 혹은 더 많은 시간 동안 있을 수도 있다.
서블릿 컨테이너가 제거해야 할 서블릿을 결정했을 때, Servlet 인터페이스의 destory 메소드를 호출하여 서블릿이 사용한 리소스들을 모두 해제(release)하게 한다.
서블릿 컨테이너가 destroy 메소드를 호출하기 전에, service 메소드 안에서 실행되고 있는 쓰레드들이 실행을 마치거나, 시간 제한을 초과할 때까지 기다려야 한다.
일단 destroy 메소드가 호출되면, 컨테이너는 해당 서블릿 인스턴스에 request를 라우팅하지 않을 것이다. 만약 컨테이너가 해당 서블릿이 다시 필요해지면, 반드시 새로운 서블릿 인스턴스를 생성해서 요청을 처리해야 한다.
destroy 메소드가 완료되면, 서블릿 컨테이너는 반드시 서블릿 인스턴스를 해제해야 한다.반응형'프로그래밍' 카테고리의 다른 글
[Spring Boot] @ModelAttribute 와 @RequestBody 의 차이 (0) 2023.05.21 [Spring Boot] CORS 문제 (0) 2023.05.21 Spring Web MVC 레퍼런스 (0) 2022.10.29 스프링 시큐리티 레퍼런스 (0) 2022.10.24 8. 블로그 프로젝트 (0) 2022.07.28