포스트

3. servlet

3. servlet

Servlet(23. 11 .21)

정의

  • Java를 사용하여 동적 웹 콘텐츠를 생성하는 서버 측 프로그램
  • 쉽게 말해, Java로 만든 CGI 프로그램 같은 것
  • Servlet 인터페이스를 정의
    • 즉 Servlet 인터페이스를 구현 → java로 구현한 CGI 프로그램이라 할 수 있습니다.

기존 CGI보다 뭐가 더 좋아졌는가?

  • 요청마다 새로운 프로세스가 생성 (CGI) → 멀티 스레드로 해결
  • 스레드는 누가 생성하고 관리하나 → 컨테이너의 등장

Servlet Architecture

Untitled

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 종료 시 소멸

image111.png

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

tomcat

  • apache 재단에서 개발한 무료 오픈 소스 WAS(Web Application Server)
  • Servlet Container의 reference 구현

Servlet-api 의존 라이브러리가 scope가 provided인 이유

tomcat 에서 기본적으로 servlet api를 제공하기에 scope를 provided로 지정한다면 패키징시에 제외된다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.