새소식

Springboot

[Spring] 서블릿과 톰캣의 내부 구조

  • -

서론

웹 애플리케이션이 사용자 요청을 받아 동적인 콘텐츠를 생성하고 응답하는 과정에는 여러 기술 요소들이 복합적으로 작용한다. 그중에서도 자바 기반의 웹 개발에서 핵심적인 역할을 하는 것이 바로 서블릿(Servlet)과 이를 실행하는 톰캣(Tomcat)이다.


정의

서블릿 (Servlet)

  • 개념: 서블릿은 클라이언트(웹 브라우저)가 아닌, 웹 서버 또는 웹 애플리케이션 서버(WAS)와 같은 서버 측 환경에서 실행되는 자바 클래스이다. 클라이언트의 요청을 받으면 서버에서 해당 서블릿 코드가 동작하여 결과를 생성한 후, 그 결과를 클라이언트에게 전송합니다.
  • 역할: 주로 HTTP(Hypertext Transfer Protocol) 프로토콜 기반의 요청을 처리하고 응답을 생성하는 데 최적화
    => 이는 javax.servlet 또는 jakarta.servlet 패키지에 정의된 서블릿 API(Application Programming Interface)를 따른다.
    => 개발자는 이 API에 정의된 규칙과 추상 클래스(GenericServlet, HttpServlet)를 상속받아 서블릿 클래스를 구현한다.
  • HttpServlet 추상 클래스를 상속받아 doGet(), doPost() 등의 메서드를 오버라이딩(재정의)하여 개발자가 직접 구현한 클래스 파일을 지칭한다.
  • 서블릿은 단독으로 실행될 수 없다. 반드시 서블릿 컨테이너(Servlet Container) 위에서 실행되어야 한다.

톰캣 (Tomcat)

  • 개념: 톰캣은 Apache Software Foundation에서 개발한 오픈소스로 대표적인 서블릿 컨테이너(Servlet Container)이다. 웹 서버WAS(Web Application Server)로 주 사용된다.
  • 역할
    • 자체적인 HTTP Connector를 가지고 있어 HTTP 요청을 직접 수신 및 처리할 수 있다.
    • 서블릿 스펙(Specification)을 구현하여 서블릿의 생명주기를 관리한다.
    • 동적인 요청이 왔을 때 해당 서블릿 코드를 실행해 동적인 응답을 생성해서 반환한다.
  • 핵심: 톰캣 != 서블릿, 서블릿을 실행하고 관리하는 주체이다.

서블릿과 톰캣의 주요 기능

서블릿 (Servlet)

  • API 기반: HttpServlet 클래스를 상속받아 구현하며, doGet(), doPost() 등의 메서드를 오버라이딩하여 HTTP 메서드별 요청을 처리한다.
  • 생명주기 관리: 서블릿 컨테이너(톰캣)에 의해 생명주기가 관리된다.
    • init(): 서블릿 객체가 처음 생성되어 초기화될 때 한 번만 호출된다. (초기 설정 작업)
    • service(ServletRequest req, ServletResponse res): 클라이언트의 요청이 올 때마다 내부적으로 HTTP 메서드(GET, POST 등)에 따라 doGet(), doPost() 등을 호출한다. 멀티스레드로 동시에 여러 요청을 처리할 수 있다.
    • destroy(): 서블릿 객체가 소멸될 때 한 번만 호출된다. (자원 해제 작업)
  • 객체 지향 및 재사용: 자바 클래스이므로 상속, 다형성 등 객체 지향 특징을 활용할 수 있으며, 동일한 서블릿 인스턴스가 여러 요청을 처리하여 효율적이다.
  • 동적 콘텐츠 생성: 요청 파라미터를 읽거나, DB 연동, 비즈니스 로직 수행 등을 통해 그때그때 다른 내용의 HTML 페이지나 데이터를 생성하여 응답한다.

톰캣 (Tomcat)

  • 서블릿/JSP 컨테이너: 가장 기본적인 역할이다. 서블릿 표준과 JSP 표준을 준수하며 이들을 실행할 수 있는 환경을 제공한다.
  • 내장 웹 서버 (HTTP Connector): 자체적으로 HTTP 요청을 수신할 수 있는 커넥터를 내장하고 있다. 특정 포트에서 클라이언트의 HTTP 요청을 기다린다.
  • 웹 애플리케이션 배포 및 관리: .war(Web Application Archive) 파일 형태로 패키징된 웹 애플리케이션을 배포하고 관리한다. .war 파일에는 서블릿 클래스 파일, JSP 파일, HTML, CSS, JS, 이미지 등의 웹 리소스와 설정 파일(web.xml 등)이 포함된다.
  • 내부에서 서블릿 인스턴스의 service()를 멀티 스레드로 돌리기에 인스턴스 변수 사용시 주의(스레드 안정성 위험)
  • 컨텍스트(Context) 관리: 웹 애플리케이션 단위(*.war 파일 하나)를 Context라 부르며, 각 Context는 고유한 경로(Path)를 가진다 (예: /myapp). 톰캣은 여러 Context를 동시에 관리할 수 있다.
  • 세션(Session) 관리: 여러 요청에 걸쳐 클라이언트의 상태를 유지하기 위한 세션 관리 기능을 제공한다.
  • Spring Boot 내장 서버: Spring Boot 애플리케이션 안에 내장 톰캣 서버가 포함되어 실행된다.

작동 방식: 서블릿 요청 처리 흐름 (톰캣 동작 포함)

요청 수신 단계

  1. 클라이언트 요청 발생
  1. HTTP 요청 수신
  • 톰캣의 HTTP 서버(Connector)가 클라이언트로부터 요청 수신
  1. 요청 분석 및 라우팅
  • 톰캣이 HTTP 요청을 파싱하여 Request 객체 생성
  • URL 패턴(/myapp/hello)을 분석하여 적절한 웹 애플리케이션과 서블릿 결정
  • 내부 경로: Engine → Host → Context → Wrapper 구조로 요청 전달

서블릿 처리 단계

  1. 서블릿 초기화
  • 첫 요청 시 서블릿 클래스 로딩 및 init() 메서드 호출
  • Wrapper 객체가 서블릿 인스턴스 관리
  1. 요청/응답 객체 준비
  • HttpServletRequest 객체: 클라이언트 요청 정보 포함
  • HttpServletResponse 객체: 클라이언트에게 보낼 응답 담을 컨테이너
  1. 서블릿 메서드 호출
  • 톰캣이 service(request, response) 메서드 호출
  • HTTP 메서드에 따라 적절한 doGet() 또는 doPost() 실행
  1. 비즈니스 로직 실행
  • 서블릿이 요청 파라미터 처리
  • 필요한 비즈니스 로직 수행 (예: DB 조회)
  • 응답 데이터를 HttpServletResponse 출력 스트림에 기록

응답 반환 단계

  1. 응답 생성 완료
  • 서블릿 실행 완료 후 HttpServletResponse에 상태 코드, 헤더, 본문 설정
  • service() 메서드 종료
  1. HTTP 응답 전송
  • 톰캣이 응답 객체 정보로 HTTP 응답 메시지 구성
  • HTTP Connector를 통해 클라이언트에게 응답 전송
  1. 서블릿 소멸 (서버 종료 시)
  • 웹 서버 종료나 애플리케이션 언로드 시 destroy() 메서드 호출
  • 서블릿이 사용한 자원 정리

Springboot에서의 Servlet

Springboot에서는 Spring MVC를 이용해 웹 요청 처리를 한다. Spring MVC에는 DispatcherServlet이라는 서블릿이 있다.

DispatcherServlet

  • 내장 톰캣이 클라이언트의 HTTP 요청을 받으면, 이 요청을 등록된 DispatcherServlet의 service() 메서드로 전달한다.
  • DispatcherServlet은 요청을 받은 후, 분석하고실제로 처리할 적절한 컨트롤러(Controller)에게 위임한다.
  • 이 과정에서 요청 URL, HTTP 메서드, 헤더 등을 기반으로 어떤 컨트롤러의 어떤 메서드를 호출할지 결정하며 (Handler Mapping), 요청 데이터를 적절한 타입으로 변환하고(Argument Resolving), 응답을 어떻게 처리할지 결정한다 (View Resolving, Message Converters 등).
  • 개발자는 @Controller, @RequestMapping, @GetMapping, @PostMapping 등의 어노테이션을 사용하여 요청을 처리할 컨트롤러와 메서드만 작성하면 된다.
  • 컨트롤러 메서드는 비즈니스 로직을 수행한 후 결과를 반환하고, DispatcherServlet은 이 결과를 바탕으로 최종적인 HTTP 응답을 생성하여 톰캣에게 전달하고, 톰캣은 이를 클라이언트에게 보낸다.

'Springboot' 카테고리의 다른 글

[Springboot] Springboot의 내부 작동 원리(With Log)  (0) 2025.05.17
백엔드를 시작하며...  (0) 2024.07.08
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.