Apache Tomcat 이해하기

HwangJerry·2023년 4월 25일
0
post-thumbnail

스프링 부트의 내장 서블릿 컨테이너

spring-boot-starter-tomcat 라이브러리는 스프링 부트 애플리케이션에서 기본적으로 사용되는 서블릿 컨테이너인 Apache Tomcat을 지원하기 위한 라이브러리입니다.

이 라이브러리를 사용함으로써, 개발자는 스프링 부트 웹 애플리케이션을 쉽게 구축하고 내장된 Tomcat 서버를 사용하여 애플리케이션을 실행할 수 있습니다.

스프링 부트가 아닌 순수 스프링 프레임워크에서는 일반적으로 별도의 외부 서블릿 컨테이너를 설치하고 설정해야 합니다.

반면 스프링 부트에서는 이처럼 내장 서블릿 컨테이너를 제공하므로, 개발 및 배포 과정이 단순화되어 속도와 편의성이 향상되었습니다.

순수 스프링 프레임워크와 같이 외부 서블릿 컨테이너를 사용하는 경우에는 WAR 파일로 패키징하여 외부 서블릿 컨테이너에서 실행시켜야 합니다.
스프링 부트로 개발한 웹 애플리케이션은 JAR 파일로 패키징하면 내장 서블릿 컨테이너인 톰캣을 사용하여 웹 애플리케이션을 실행할 수도 있고, WAR 파일로 패키징하여 전략적으로 외부 서블릿 컨테이너에서 실행시킬 수도 있습니다.

서블릿? 서블릿 컨테이너?

  • 서블릿:

    • 자바 기반의 웹 애플리케이션의 구성 요소로, 자바 클래스로 작성되어 클라이언트의 요청을 처리하고 응답을 생성하는 데 사용되는 서버 측 컴포넌트입니다.
    • jakarta.servlet package에 정의된 인터페이스인 Java Servlet API는 서블릿의 라이프 사이클을 위한 3가지 필수적인 메소드인 init(), service(), destroy()를 제공합니다.
    • 일반적으로 서블릿은 HTTP 프로토콜을 사용하여 요청을 처리하며, 동적인 웹 페이지를 생성하거나, 데이터베이스와 상호작용하는 등의 작업을 수행할 수 있습니다.
  • 서블릿 컨테이너:

    클라이언트-서버 구조에서 웹 서버가 단순하게 존재한다면, 그저 단순한 컴퓨터에 불과한 서버는 그저 정적인 웹 페이지만 제공할 수 있을 것입니다.

    그렇다면 사용자가 본인의 입력에 기초한 동적인 웹 페이지를 보고 싶다면 이 방식은 충분하지 않은 것이죠.

    서블릿 컨테이너는 서버 사이드에서 서블릿을 활용하여 동적으로 웹 페이지를 생성하기 위해 탄생한 개념입니다.

    • 서블릿과 웹 서버 간의 통신을 담당하고, 서블릿의 생성, 실행, 소멸 등 생명 주기를 관리하는 컴포넌트입니다.
    • 웹 서버에 내장되어 있거나, 독립적인 프로세스로 실행될 수도 있습니다. (Apache Tomcat은 서블릿 컨테이너를 내장하고 있는 오픈 소스 웹 서버이자 서블릿 컨테이너입니다.)

톰캣 라이브러리의 특징

  • 스프링부트 내장 서버:

    웹 애플리케이션을 개발할 때 별도의 웹 서버 설치 및 설정 과정 없이, 애플리케이션 내부에 포함된 Tomcat 서버를 사용하여 애플리케이션을 실행할 수 있습니다.

    이로 인해 개발 및 배포 과정이 단순화되고, 환경에 따른 설정 차이를 최소화할 수 있습니다.

  • 서블릿 및 필터 자동 등록:

    스프링 부트는 자동 설정 기능을 통해 서블릿, 필터, 리스너 등의 웹 관련 컴포넌트를 자동으로 등록하고 구성해줍니다.

톰캣의 요청 처리 과정

  1. [클라이언트 요청 수신] 클라이언트가 웹 애플리케이션에 HTTP 요청을 보냅니다.

  2. [웹 서버로 요청 전달] 톰캣 등 웹 서버는 요청을 서블릿 컨테이너로 전달합니다.

  3. [서블릿 컨테이너에서 요청 처리] 서블릿 컨테이너는 클라이언트의 요청을 처리할 수 있는 서블릿을 찾습니다.

    만약 서블릿이 컨테이너에 없다면, 서블릿을 동적으로 검색하여 컨테이너의 주소 공간에 로드합니다.

    이후 컨테이너가 서블릿의 init() 메소드를 호출하면 서블릿이 초기화 됩니다(서블릿이 처음 로드됬을 때 한번만 호출됩니다).

    스프링부트는 자동으로 Spring MVC 모듈의 DispatcherServlet 컴포넌트를 기본 서블릿으로 등록합니다. 이 서블릿은 프론트 컨트롤러로서 중앙 집중적인 역할을 수행하여 모든 클라이언트 요청을 받아 처리합니다. 이 때문에 개발자가 일반적으로 서블릿을 직접 생성하거나 관리할 필요가 없습니다.

  4. [서블릿에서 요청 처리] 컨테이너가 서블릿의 service() 메소드를 호출하여 HTTP 요청을 처리합니다(예: 요청의 데이터를 읽고, 응답을 만들어냅니다.). 서블릿은 컨테이너 주소에 남아있고, 다른 HTTP 요청들을 처리할 수 있습니다.

    DispatcherServlet은 핸들러 매핑을 통해 요청을 처리할 컨트롤러를 찾습니다. 찾아낸 컨트롤러에서 요청을 처리하고, 처리 결과를 바탕으로 응답을 생성합니다.

  5. [클라이언트에 응답 반환] 생성된 응답은 서블릿을 거처 서블릿 컨테이너로 전달되고, 웹 서버는 동적으로 처리된 이 결과를 클라이언트에게 전송합니다.

위에서 확인할 수 있듯이, 스프링 부트 애플리케이션에서 DispatcherServlet은 모든 클라이언트 요청을 처리하는 스프링 MVC의 핵심 컴포넌트로, 웹 요청을 컨트롤러에게 전달하고 응답을 반환하는 역할을 합니다. 따라서 별도의 서블릿을 생성하지 않더라도, DispatcherServlet이 서블릿 역할을 수행합니다.

Reference

서블릿과 서블릿 컨테이너
톰캣을 Jetty로 변경해보기

profile
알고리즘 풀이 아카이브

0개의 댓글

관련 채용 정보