3. servlet
3. servlet
Servlet(23. 11 .21)
정의
- Java를 사용하여 동적 웹 콘텐츠를 생성하는 서버 측 프로그램
- 쉽게 말해, Java로 만든 CGI 프로그램 같은 것
- Servlet 인터페이스를 정의
- 즉 Servlet 인터페이스를 구현 → java로 구현한 CGI 프로그램이라 할 수 있습니다.
기존 CGI보다 뭐가 더 좋아졌는가?
- 요청마다 새로운 프로세스가 생성 (CGI) → 멀티 스레드로 해결
- 스레드는 누가 생성하고 관리하나 → 컨테이너의 등장
Servlet Architecture
Servlet Container ( wiki )
- 웹 컨테이너(web container, 또는 서블릿 컨테이너)는 웹 서버의 컴포넌트 중 하나로 자바 서블릿과 상호작용한다.
- 웹 컨테이너는 서블릿의 생명주기를 관리하고, URL과 특정 서블릿을 맵핑 하며 URL 요청이 올바른 접근 권한을 갖도록 보장한다.
- 웹 컨테이너는 서블릿, Java Server Page(JSP) 파일, 그리고 서버-사이드 코드가 포함된 다른 타입의 파일들에 대한 요청을 다룬다.
- 웹 컨테이너는 서블릿 객체를 생성하고, 서블릿을 로드와 언 로드하며, 요청과 응답 객체를 생성하고 관리하고, 다른 서블릿 관리 작업을 수행한다.
- 웹 컨테이너는 웹 컴포넌트 Java EE 아키텍처 제약을 구현하고, 보안, 병행성(concurrency), 생명주기 관리, 트랜잭션, 배포 등 다른 서비스를 포함하는 웹 컴포넌트의 실행 환경을 명세한다(specify).
Servlet 실습
https://github.com/UNGGU0704/nhnacademy-study/tree/main/servlet-jsp/servlet
Survlet Lifecycle
- Instantiation and Loading
- Initalizaiotn
- Ready
- Destruction
GC
- HelloServlet클래스에 아래와 같은 메서드를 추가
init
service
destroy
log를 통해 확인
HelloServlet.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
package com.nhnacademy.study; import java.io.*; import java.util.logging.Logger; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class HelloServlet extends HttpServlet { private String message; private static Logger log = Logger.getLogger(HelloServlet.class.getName()); public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { System.out.println("init 실행"); response.setCharacterEncoding("utf-8"); try(PrintWriter writer = response.getWriter()) { writer.println("<!DOCTYPE html>"); writer.println("<html>"); writer.println("<head>"); writer.println("<meta charset='utf-8'>"); writer.println("</head>"); writer.println("<body>"); writer.println("<h1>hello servlet!</h1>"); writer.println("<h1>안녕 서블릿!</h1>"); writer.println("</body>"); writer.println("</html>"); } catch (IOException e) { throw new RuntimeException(e); } } @Override public void init(ServletConfig config) throws ServletException { log.info("before init!"); super.init(config); } @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { log.info("before service!"); super.service(req, resp); } @Override public void destroy() { log.info("before destroy!"); super.destroy(); } }
Servlet lifecycle 정리
- init() 메서드
- Servlet Container가 Servlet을 생성한 후 초기화 작업을 수행하기 위해 호출
- 클라이언트의 요청을 처리하기 전에 준비할 작업이 있는 경우 여기에서 처리
- ex.) 데이터베이스 접속, 외부 스토리지 연결, property 로딩 등
- service() 메서드는 굳이 override 할 필요 없음
- GET, POST, PUT, DELETE 각각의 http method 에 대해
- 구현이 필요한 doXXX() 메서드 override 해서 구현
- destroy() 메서드
- Servlet Container가 종료되거나 해당 서블릿을 비활성화시킬 때 호출
- 서비스 수행을 위해 확보되었던 자원 해제, 데이터 저장등의 마무리 작업 시 여기에서 처리
- ex.) 데이터베이스 연결 종료
Generic Servlet
- http 이외의 프로토콜을 위한 범용 Servlet
- http 프로토콜 → HttpServlet 확장
- http 이외의 프로토콜 → GenericServlet 확장
- abstract class 로서 기본 구현 제공
- Servlet interface 에서 service() 메서드를 제외한 나머지 메서드들에 대한 기본 구현 제공
Servlet Context
- Servlet Container 실행 환경
- Servlet과 Servlet Container 간에 연동을 위해 사용
- 웹 애플리케이션마다 하나의 ServletContext 생성
- 하나의 웹 애플리케이션에 포함된 Servlet 들은 동일한 ServletContext 공유
- Servlet끼리 자원을 공유하는 데 활용
- Servlet Container 실행 시 생성되고 Servlet Container 종료 시 소멸
ServletContext 기능
- 환경정보, 설정정보 제공
- 서블릿 내에서의 파일 접근
WAS
- (Java) Application Server라고 불림
- 정적 웹 서버와 구분하기 위한 용도
- Servlet Container, EJB Container등의 역할을 수행함
- 동적 웹을 제작하기 위한 웹 어플리케이션과 서버 환경을 만들어 동작시키는 기능 제공
- 서블릿에만 한정적으로 WAS = Servlet Conatiner라고 봐도 좋다.
Servlet API
- Java EE 에서는 Servlet API Spec 만 정의
- 실제 구현은 WAS에서 담당
- ex)
- Servlet API:
javax.servlet.http.HttpServletRequest interface
- tomcat 구현:
org.apache.catalina.connector.Request class
- Servlet API:
tomcat
- apache 재단에서 개발한 무료 오픈 소스 WAS(Web Application Server)
- Servlet Container의 reference 구현
Servlet-api 의존 라이브러리가 scope가 provided인 이유
→ tomcat 에서 기본적으로 servlet api를 제공하기에 scope를 provided로 지정한다면 패키징시에 제외된다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.