본문 바로가기
스프링 관련/스프링 프레임워크

서블릿, 서블릿 컨테이너, 멀티쓰레드, 톰캣 정리

by 문자메일 2023. 4. 2.

핵심 내용

 

서블릿 컨테이너(tomcat, jetty, etc..) 의 역할 

톰캣은?

서블릿 표준 스펙을 구현한 WAS 중 하나!

 

 

프로그램 실행 방법

자바 프로그램 : JAVA 명령으로 실행 시 main() 메서드 실행 됨

서블릿 컨테이너, 서블릿(웹앱) : 서블릿 컨테이너는 특정 URL로 Request가 오면 해당 URL과 매핑된 서블릿을 실행해준다. (@Controller 어노테이션 매핑된 클래스가 실행되는 이유)

 

 

 

 

 

서블릿 이란?

"클라이언트의 요청을 수신/처리하고, 그 결과를 반환하는 과정에 편의성을 제공하는 자바 웹 프로그래밍 기술(규약)의 스펙(인터페이스)을 정했고 서블릿과 서블릿 컨테이너 라는 명칭으로 칭함.

개발자는 Servlet 기능을 활용하고 싶으면 사전에 정의되어 있는 Servlet 인터페이스의 구현 규칙을 지켜서 Servlet 클래스를 만들고, Servlet 컨테이너에 등록을 하면 된다."

 

=> 자바를 사용하여 웹 애플리케이션을 만들기 위해 필요한 기반 기술,

     tomcat이나 jetty 같은 WAS 서버들이 서블릿 표준 스펙 기능을 구현하여 제공함.

 

서블릿 컨테이너란?

"서블릿을 관리해주는 컨테이너"

=> 서블릿을 구현 클래스를 만들기만 해서 스스로 작동하는 것이 아님, 구현된 서블릿을 관리해주는 것(서블릿 컨테이너)이 필요함.

 

크게 아래 2가지 기능 수행

1. 소켓 통신으로 클라이언트 HTTP Message 수신 및 송신

2. 웹 앱에서 사용할 수 있게 Message를 파싱하여 객체 생성(HttpServletRequest, HttpServletResponse),

서블릿 라이프 사이클 관리 및 요청받은  URL과 매칭되는 서블릿 클래스 호출

 

 

서블릿 컨테이너 역할

1. 웹서버와의 통신 지원

2. 서블릿 생명주기 관리

3. 멀티쓰레드 지원 및 관리

4. 선언적인 보안 관리

 

 

서블릿 동작 방식

1. 클라이언트가 URL로 웹 서버 호출하면 Servlet Container(톰캣) 에서 HTTP Request 수신받음

2. Servlet Container는 HTTP Message를 파싱해서 Web Application에서 사용하기 쉽게 HttpServletRequest, HttpServletResponse 객체를 생성하여 줌

3. 서블릿 컨테이너에 등록된 서블릿 정보를 확인하여(Web.xml OR 프로그래밍 방식 등록), 사용자가 요청한 URL이 어느 서블릿에 대한 요청인지 찾아서 호출해줌

4. 서블릿 컨테이너가 해당 서블릿의 service() 메서드를 호출한 후, 클라이언트의 GET, POST 여부에 따라 doGet(), doPost() 메서드를 호출함.

5. doGet(), doPost() 메서드는 동적 페이지를 생성한 후 HttpServletResponse 객체에 응답을 보냄.

6. 응답이 끝나면 HttpServletRequest, HttpServletResponse 두 객체를 소멸시킴

 

 

서블릿 생명주기

 

1. 클라이언트 요청이 오면 서블릿 컨테이너는 해당 서블릿이 메모리에 있는지 확인하고, 없으면 init() 메서드 호출하여 적재한다. (서블릿 객체는 싱글턴으로 관리된다.)

2. init() 호출된 후 클라이언트가 요청한 서블릿에서 service() 메서드 호출되고, 그 안에서 클라이언트가 요청한 HTTP Method 에 따라 doGet(), doPost() 호출된다.

3. 서블릿 컨테이너가 서블릿에 종료 요청을 하면 destory() 메서드 호출되며, 해당 서블릿 객체 삭제

 

 

 

조금 더 서블릿에 디테일하게 들어가보자면

 

서블릿 구현체 예시

  • @WebServlet 어노테이션을 붙임으로서 서블릿 컨테이너에 TestServlet을 등록한다. ( 메인에서 @ServletComponentScan 어노테이션도 필요하다)
  • urlPattern(/test)의 URL이 호출되면 서블릿 코드가 실행된다.
  • 서블릿 구현체를 구현하기 위해 HttpServlet 클래스를 상속받은 것을 확인 가능
  • 서블릿 컨테이너(톰캣)가 TestServlet 호출했을때 실행될 로직 service()메서드 오버라이드하여 구현
    • 서블릿 컨테이너가 HttpServletRequest, HttpServletResponse 객체 만들어서 전달해주는 것 확인 가능

=> 개발자는 이렇게 필요한 서블릿 구현체를 만들어서 서블릿 컨테이너에 등록함으로서, 편하게 서블릿이 제공하는 기능을 사용할 수 있다.

 

 

 

정리

  • 톰캣처럼 서블릿을 지원하는 WAS를 서블릿 컨테이너라고 한다
  • 서블릿 컨테이너는 서블릿 객체를 생성, 초기화, 호출, 종료하는 생명주기 관리한다
  • 서블릿 객체는 싱글톤으로 관리된다.
    • 최초 로딩 시점에 서블릿 객체를 미리 만들어놓고 재활용
    • 모든 고객 요청은 동일한 서블릿 객체 인스턴스에 접근한다
    • 싱글턴 객체 이므로 공유 변수 사용에 주의해야 한다.
    • 서블릿 컨테이너 종료시 서블릿 함께 종료됨
  • 동시 요청 처리를 위한 멀티 쓰레드를 지원한다.

 

 

 

멀티 쓰레드

 

쓰레드

  • 애플리케이션 코드를 하나하나 순차적으로 실행하는 것은 쓰레드
  • 자바 메인 메서드를 실행하면 main이라는 이름의 쓰레드가 실행된다
  • 쓰레드가 없다면 자바 애플리케이션 실행이 불가능
  • 쓰레드는 한 번에 하나의 코드 라인만 수행
  • 동시 처리가 필요하면 쓰레드 추가로 생성해야 함

 

 

톰캣(서블릿 컨테이너)도  jvm 위에서 돌아가는 java 프로그램이다.

그렇기에 클라이언트의 요청을 받아서 서블릿을 호출해주는 쓰레드가 1개만 존재한다면, 한 클라이언트의 요청을 처리하고 있을 때 다른 클라이언트의 요청은 처리할 수 없게 된다.

 

 

요청 마다 쓰레드 생성하는 경우 장단점

장점 

  • 클라이언트 동시 요청 처리 가능
  • 리소스(CPU, 메모리)가 허용할 때 까지 처리 가능

단점

  • 쓰레드는 생성하는데 비용이 매우 비싸다
    • 요청이 올 때 마다 쓰레드 생성하면, 비용이 많이 든다.(응답 속도가 느려짐)
  • 쓰레드 생성에 상한선이 없다.
    • 클라이언트에서 요청이 많이 와서 가용 가능한 리소스 이상의 쓰레드가 생성되려는 시점이 오면 서버가 죽을 수 있다.

 

쓰레드 풀 방식 (요청 마다 쓰레드 생성의 단점 보완)

특징

  • 필요한 쓰레드를 쓰레드 풀에 보관하고 관리한다.
  • 쓰레드 풀에 생성 가능한 쓰레드 최대치를 관리한다. 톰캣은 max 200개가 기본 설정이다.

사용

  • 쓰레드가 필요하면, 이미 생성되어 있는 쓰레드를 쓰레드 풀에서 꺼내서 사용한다.
  • 사용을 종료하면 쓰레드 풀에 사용 끝난 쓰레드 반납
  • 쓰레드 풀에 사용 가능한 쓰레드가 없다면, 기다리는 요청은 거절하거나 특정 숫자 만큼 대기하도록 설정이 가능하다.

 

쓰레드 풀 관리 팁

  • WAS의 주요 튜닝 포인트는 최대 쓰레드 설정 개수이다
  • 이 값이 너무 낮게 설정되면, 서버 리소스는 널널하지만 클라이언트는 응답 지연 현상을 겪게 된다. (비효율)
  • 이 값이 너무 높게 설정되면, 서버 리소스 임계점 초과로 서버 다운

 

WAS의 멀티 쓰레드 지원 정리

  • 멀티 쓰레드에 대한 부분은 WAS가 처리해준다
  • 개발자가 멀티 쓰레드 관련 코드를 신경쓰지 않아도 된다.
    • -> 개발자는 싱글 쓰레드 프로그래밍 하는 것 처럼 편리하게 소스 개발 가능
  • 멀티 쓰레드 환경이므로 싱글톤 객체(서블릿, 스프링 빈)는 주의해서 사용해야 한다.

 

 

※ 참고

서블릿은 톰캣 같은 웹 애플리케이션을 직접 설치하고, 그 위에 서블릿 코드를 클래스 파일로 빌드해서 올린 다음, 톰캣 서버를 실행하면 된다. 하지만 이 과정은 사람이 수동으로 해야해서 번거롭다.

스프링 부트는 톰캣 서버를 내장하고 있어서, 톰캣 서버를 별도로 설치 할 필요 없이 서블릿 코드를 직접 실행할 수 있다.

 

1. 서블릿 자동 등록 ( @ServletComponentScan )

2. 

2-1. @WebServlet 어노테이션으로 아래 서블릿 구현체를 서블릿 컨테이너에 등록한다.

@WebServlet (name = "helloServlet", urlPatterns = "/hello" )

receive URL : localhost:8080/hello

name : 서블릿 이름

urlPatterns : URL 매핑

 

 

2-2. 서블릿 구현체 클래스를 만들기 위해서는 HttpServlet을 상속받아야 한다.

import javax.servlet.http.HttpServlet

 

extends HttpServlet

 

2-3. HttpServlet 클래스에서 serivce(HttpServletRequest req, ... ) 상속받아서 구현하면, 서블릿 컨테이너가 URL 요청 오면 service() 메서드 실행시켜 준다.

 

 

웹 브라우저로부터 Http 요청이 오면, WAS(서블릿 컨테이너)가 Request, Response 객체를 만들어서 서블릿에 던져준다.

tomcat이나 jetty 같은 was 서버들이 서블릿 표준 스펙을 구현한다. 위 구현체들이 찍힌 것이다.

 

 

 

 

톰캣에 관하여 더 깊숙히 알아보기

 

톰캣의 개요와 동작원리 상세히 설명되어 있는 블로그

https://jngcii.tistory.com/m/entry/Tomcat-Overview

 

Tomcat : Overview

톰캣은 자바진영의 대표적인 WAS입니다. 여기서 WAS란, 쉽게 설명하면 요청을 받는 서버역할도 하면서 동적인 결과를 만들어내는 애플리케이션의 역할도 하는 서버입니다. 톰캣은 서블릿 컨테이

jngcii.tistory.com

 

 

톰캣의 설정과 구성요소 상세히 설명되어 있는 블로그

https://exhibitlove.tistory.com/312

 

[tomcat] 동작원리

출처 : kchanguk.tistory.com/4 1. Tomcat의 설정($TOMCAT_HOME/conf/server.xml) * server.xml의 역할 TOMCAT의 메인 설정 파일이며 초기 설정을 명세하는 책임이 있습니다. 1) Server 최상위 element로, shutdown 요청 처리를

exhibitlove.tistory.com

 

 

Controller 1개가 어떻게 많은 요청을 처리하는가

Tomcat 내부적으로 스레드풀을 만들어 하나의 요청에 하나의 스레드를 할당하여 응답을 처리한다.
이때 Controller는 스프링 빈이고 빈은 싱글톤패턴으로 1개만 생성이되는데 어떻게 여러 스레드에서 객체를 공유하여 사용이 가능할까?

Controller 객체 하나를 생성하면 객체 자체는 Heap에 생성되지만 Class 정보는 Method Area에 저장되고 Controller는 내부적으로 상태가 존재하지 않고 메서드에 대한 정보만 공유해서 사용하면 되기 때문에 동기화에 대한 걱정이 없다.
한마디로 처리로직만 공유되어 사용하는 것이기 때문에 몇개의 요청이 들어오든 상관이 없다.

 

 

 

포스팅 작성에 참조한 레퍼런스

https://mangkyu.tistory.com/14

 

[JSP] 서블릿(Servlet)이란?

1. Servlet(서블릿) 서블릿을 한 줄로 정의하자면 아래와 같습니다. 클라이언트의 요청을 처리하고, 그 결과를 반환하는 Servlet 클래스의 구현 규칙을 지킨 자바 웹 프로그래밍 기술 간단히 말해서,

mangkyu.tistory.com

https://coding-factory.tistory.com/742

 

[Web] 서블릿(Servlet)이란 무엇인가? 서블릿 총정리

서블릿(Servlet)이란? 서블릿이란 Dynamic Web Page를 만들 때 사용되는 자바 기반의 웹 애플리케이션 프로그래밍 기술입니다. 웹을 만들때는 다양한 요청(Request)과 응답(Response)이 있기 마련이고 이 요

coding-factory.tistory.com

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard

 

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의

웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., -

www.inflearn.com

 

댓글