[ 2022.10.27 TIL-Servlet과 Tomcat ]

Coosla·2022년 10월 27일
1

TIL

목록 보기
2/29
post-thumbnail

Servlet

✏️ Servlet이란?

  • 동적 웹 페이지를 만들 때 사용되는 자바 기반의 웹 애플리케이션 프로그래밍 기술
  • 웹 요청과 응답의 흐름을 간단한 메서드 호출만으로 체계적으로 다룰 수 있게함

✏️ Servlet의 특징

  • 클라이언트의 요청에 대해 동적으로 작동하는 웹 애플리케이션 컴포넌트
  • HTML을 사용하여 응답
  • Java 스레드를 이용하여 동작
  • MVC 패턴에서의 컨트롤러로 이용
  • HTTP 프로토콜 서비스를 지원하는 javax.servlet.http.HttpServlet 클래스를 상속
  • UDP 보다 느림
  • HTML 변경 시 Servlet을 재 컴파일 해야하는 단점

✏️ 서블릿 동작과정과 서블릿 생명 주기

  • 서블릿 동작과정

      1. 클라이언트가 웹 서버에 요청
          1-1. 웹 서버는 클라이언트 요청을 WAS에 위임
      2. HttpServletRequest객체와 HttpServletResponse 객체 생성
      3. Web.xml을 통해 요청에 해당하는 서블릿 매핑
      4. 해당 Servlet 초기화 (init()메소드 실행)
      5. 해당 Servlet에서 Service() 실행
          5-1. doGet(), doPost, doPut() 등 클라이언트 요청 헤더를 통해 해당하는 
               전송방식 메소드 실행
          5-2. 처리 결과를 HttpServletResponse에 저장
      6. 클라이언트에게 HttpServletResponse 객체 응답 전송
      7. HttpServletRequest객체와 HttpServletResponse 객체 소멸 
         (destroy() 메소드 실행)
    
  • 서블릿 생명 주기

    • 서블릿 동작과정 중 서블릿 초기화(4), 작업 수행(5), 서블릿 종료(7) 부분을 서블릿 생명 주기라고 생각하면 된다.
    • 서블릿 초기화 (init() 메소드)
      • 처음 한번만 실행되는 메소드
      • 클라이언트 요청이 들어오면 해당 서블릿이 메모리에 있는지 체크
      • 없을 경우 메모리에 해당 서블릿을 적재
      • 실행 중 서블릿이 변경되면 기존 서블릿을 소멸하고 새로운 내용으로 다시 메모리에 적재
    • 작업 수행 (service() 메소드)
      • 서블릿 요청 시 매번 호출되는 메소드
      • 실제 클라이언트가 요청하는 작업을 수행
      • Http 요청 헤더의 method 값에 따라 요청에 대한 응답 처리 메소드가 분기됨
      • doGet(), doPost(), doPut() 등 다양한 처리 메소드가 존재
    • 서블릿 종료 (destroy() 메소드)
      • 서블릿 컨테이너가 해당 서블릿에게 종료 요청 시 종료 메소드 실행되며 한번만 실행되는 메소드
      • 종료 시에 처리해야하는 작업들을 오버라이딩하여 구현

✏️ 서블릿 컨테이너

  • 서블릿 컨테이너란?
    • 구현되어 있는 Servlet 클래스의 규칙에 맞게 서블릿에 담고 관리해주는 컨테이너
    • 클라이언트가 요청을 보내면 HttpServletRequest객체와 HttpServletResponse 객체를 생성하며, 서블릿 생명주기를 통해 클라이언트에게 응답을 보냄

  • 서블릿 컨테이너 주요 기능
    • 서블릿 생명 주기 관리
      • 서블릿 클래스를 로딩하여 인스턴스화
      • 요청에 따른 서블릿 매핑
      • 해당 서블릿 초기화 메소드 호출
      • 해당 서블릿 소멸 시 가비지 컬렉션을 통해 메모리에서 제거
    • 통신 지원
      • 클라이언트의 요청을 받아주고, 응답을 보낼 수 있게 웹 서버와 소켓을 생성하여 통신
      • 소켓 생성, listen, accept 등 기능을 API로 제공해줘 복잡한 과정을 생략
      • 개발자는 비즈니스 로직에 더 집중
    • 멀티스레딩 관리
      • 동시에 여러 요청이 들어와도 멀티스레딩 환경으로 동시다발적인 작업을 관리 가능
      • 한번 올라간 스레드는 다시 생성할 필요 없어 메모리 관리에 효율적
    • 선언적 보안관리
      • XML 배포 서술자를 통해 보안관리를 진행하여 보안이슈가 발생했을 때 자바 코드를 수정하지 않아도 됨

✏️ 서블릿 설정 파일(Web.xml)

  • 배포 서술자(Deployment Descriptor)란?

    • WEB-INF 아래에 존재하는 web.xml 파일을 의미
    • JSP나 Servlet을 위한 설정 파일

  • Web.xml에서 설정할 수 있는 내용

    • ServletContext의 초기 파라미터
    • Session의 유효시간
    • Servlet/JSP에 대한 정의
    • Servlet/JSP 매핑
    • Mime Type 매핑
    • Welcom File List
    • Error 페이지 처리
    • Listener/Filter 설정
    • 보안
    • Web.xml 설정 예제 코드 사이트

  • 사용하는 목적

    • 작성한 소스코드를 수정하지 않고 Web Application 커스터마이징 가능
    • 테스트된 소스 코드의 수정을 최소화
    • 소스코드가 없어도 수정 가능
    • 재 컴파일 하지않고 서버의 자원 변경
    • 접근 제한, 보안, 오류페이지 등을 설정하고 초기화 값 구성 간으

CGI와 Servlet

✏️ CGI(Common Gateway Interface) 간단 설명

  • 대화식 웹 페이지를 실행할 수 있도록 웹 서버에서 외부 프로그램(CGI 스크립트)을 처리하는 인터페이스
  • CGI 장점
    • 언어, 플랫폼 독립적이다(스펙만 준수하면 된다).
    • 매우 단순하고 다른 server-side 프로그래밍 언어에 비해 advanced task를 훨씬 쉽게 수행할 수 있다.
    • 재사용할 수 있는 CGI 코드 라이브러리가 풍부하다.
    • CGI가 웹서버에서 실행될 때 안전하다.
    • CGI 코드를 수행하는데 특정 라이브러리가 필요하지 않기 때문에 매우 가볍다.
  • CGI 단점
    • 느리다(요청이 올 때마다 DB connection을 새로 열어야 한다).
    • HTTP 요청마다 새로운 프로세스를 만들기 때문에 서버 메모리를 많이 잡아먹는다. (servlet은 요청마다 스레드를 만든다.)
    • 페이지 로드 사이에 데이터가 메모리에 캐시될 수 없다.

✏️ CGI(Common Gateway Interface)와 Servlet 차이

  • CGI는 네이티브 OS로 작성되어 특정 폴더에 저장, Servlet은 Java로 작성되어 Java 바이트 코드로 컴파일되고 JVM에서 실행
  • CGI는 운영체제간에 전환이 여려움, Servlet은 JVM이 설치된 운영체제에서 실행 가능하여 플렛폼에 독립적
  • Servlet은 Java를 사용하여 CGI보다 안전
  • 속도, 성능 및 효율성이 Servlet이 더 좋음
  • CGI에서 도달하는 클라이언트 요청은 서블릿, 프로세스가 불필요하게 생성되지 않고 JVM의 메모리 공간을 공유하는 동안 별도의 프로세스를 생성 가능
  • CGI 스크립트는 서버의 원시 OS에 작성된 실행 가능 프로그램, 서블릿은 JVM에서 실행되는 Java 바이트 코드로 컴파일
  • CGI 스크립트는 직접 처리 가능, 서블릿은 먼저 프로그램을 변환하고 컴파일 한 다음 처리

Tomcat

✏️ Tomcat이란?

  • Apache 재단에서 Java Servlet을 지원하기 위해 시작된 오픈 소스 프로젝트
  • Java를 이용한 웹 애플리케이션의 다양한 규격(Spec)을 준수하여 JSP, HTML 파일들로 구성된 .war 파일을 배포해주는 엔진
    • Spec이란?
      - Servlet, Jsp, 웹소켓, 자바 등 톰캣 버전에 따른 최소 요구 사항으로 이해

✏️ Tomcat 폴더 구성

  • bin : Tomcat 실행/종료 등 스크립트 파일
  • conf : Tomcat이 가동되는 서버에 대한 설정, 유저/관리자 설정, web.xml/context.xml 등 전역적인 설정
  • lib : 전역적으로 사용되는 라이브러리
  • logs : 로그 파일들이 생성되어 담기는 폴더
  • webapps : Tomcat에 배치시킬 다수 개의 웹 어플리케이션들, 주로 .war 파일
  • RUNNING.txt : Tomcat 바이너리 파일을 실행하는 방법에 대한 간단한 설명서

✏️ Tomcat 구성

  • Coyote (HTTP Component)
    • Tomcat에 TCP를 통한 프로토콜 지원
    • 자료가 거의 없고 요즘에는 Connecter에서 TCP 프로토콜을 지원하는 듯?
    • 거의 모든 요청이 다 Coyote로 들어와서 HTTP 프로토콜 형태로 변환되는 듯? (정확하지 않음)
  • Catalina (Servlet Container)
    • Java Servlet을 호스팅하는 환경
  • Jasper(JSP Engine)
    • 실제 JSP 페이지의 요청을 처리하는 Servlet

✏️ Tomcat 동작과정 간단 설명

  1. HTTP 요청을 받아 Catalina(Servlet 컨테이너)로 전달
  2. Catalina는 HTTP 요청에 따라 처리할 웹 어플리케이션을 찾고, web.xml의 Servlet 매핑을 통해 해당 Servlet에 요청 전달
  3. Servlet 결과를 통해 생성된 JSP 파일을 호출할 때, Jasper가 Vlidation, Check, Compile을 수행

✏️ Tomcat 내부 아키텍처

  • Server
    • 톰캣 그 자체이며 웹 애플리케이션 서버의 인스턴스
    • 전체 Catalina 서블릿 컨테이너
    • Top-Level 컴포넌트
    • 서버 설정을 통해 애플리케이션을 분리해서 각각 재시작 가능, 한 서버가 오류가 발생해도 다른 서버에 영향을 주지 않게 분리해서 운영 가능
  • Service
    • 하나의 엔진 컨테이너를 커넥터들과 묶는 Top-Level 컴포넌트
    • 서비스에서 발생하는 로그 메시지를 관리자가 쉽게 알아볼 수 있도록 서비스마다 이름이 주어짐
  • Engine
    • 전체 Catalina 서블릿 엔진을 의미
    • HTTP 헤더를 처크하여 특정 요청이 어느 Host 또는 Context에 연결되어야 하는지 판단
  • Host
    • 가상 호스트 이름
    • 호스트 이름이 URL에 매핑
    • Engine 내부에 여러개 존재 가능
    • www.abc.com과 같은 주소를 사용하려면 DNS가 서버에 등록되 있어야함
  • Context
    • 웹 애플리케이션을 의미
    • 웹 애플리케이션의 설정에는 애플리케이션의 루트 폴더 위치를 엔진과 호스트에게 알려주는 것도 포함
    • 주로 *.war 파일로 배포
  • Connector
    • TCP port를 통해 요청을 받아 해당 엔진으로 보내주는 역할 수행
    • Connector 종류
      • HTTP/1.1 , HTTP/2 Connector
        • Tomcat이 standalone web server로 동작하거나 WAS 역활을 수행하도록 지원
      • AJP Connector
        • Apache HTTP Web Server의 요청을 처리하기 위한 특수한 프로토콜을 처리
    • Connector 동작 방식
      • BIO
        • Tomcat 7의 기본 방식
        • 하나의 쓰레드가 하나의 커넥터를 담당
      • NIO
        • Tomcat 8.5 부터 기본 방식
        • 하나의 쓰레드가 하나 이상의 커넥터를 담당
        • 비동기? 지원하는?
      • APR
        • Apache Portable Protocal이라는 특수한 프로토콜
        • Tomcat 10.X 버전부터는 안쓴다고함
    • Connector Parameter
      • maxThreads
        • 커넥터가 생성할 수 있는 최대 스레드 수
      • maxConnections
        • 동시 처리 가능한 최대 커넥션 수
      • maxSpareThreads
        • 최소로 실행을 유지할 쓰레드 수
      • acceptCount
        • 모든 스레드가 사용 중일때, queue에 저장 가능한 최대 요청 수
        • Backlog를 의미
    • Connector 동작과정
      • network port를 Listen해서 connection을 얻은 후 데이터를 받아서 Servlet이 처리할 수있는 형태(servlet reqeust)로 바꿔주는 역할

참고 사이트

Servlet 참고

Tomcat 참고

profile
프로그래밍 언어 공부 정리

0개의 댓글