spring-boot-starter-tomcat
라이브러리는 스프링 부트 애플리케이션에서 기본적으로 사용되는 서블릿 컨테이너인 Apache Tomcat을 지원하기 위한 라이브러리입니다.
이 라이브러리를 사용함으로써, 개발자는 스프링 부트 웹 애플리케이션을 쉽게 구축하고 내장된 Tomcat 서버를 사용하여 애플리케이션을 실행할 수 있습니다.
스프링 부트가 아닌 순수 스프링 프레임워크에서는 일반적으로 별도의 외부 서블릿 컨테이너를 설치하고 설정해야 합니다.
반면 스프링 부트에서는 이처럼 내장 서블릿 컨테이너를 제공하므로, 개발 및 배포 과정이 단순화되어 속도와 편의성이 향상되었습니다.
순수 스프링 프레임워크와 같이 외부 서블릿 컨테이너를 사용하는 경우에는 WAR 파일로 패키징하여 외부 서블릿 컨테이너에서 실행시켜야 합니다.
스프링 부트로 개발한 웹 애플리케이션은 JAR 파일로 패키징하면 내장 서블릿 컨테이너인 톰캣을 사용하여 웹 애플리케이션을 실행할 수도 있고, WAR 파일로 패키징하여 전략적으로 외부 서블릿 컨테이너에서 실행시킬 수도 있습니다.
서블릿:
jakarta.servlet
package에 정의된 인터페이스인 Java Servlet API는 서블릿의 라이프 사이클을 위한 3가지 필수적인 메소드인 init()
, service()
, destroy()
를 제공합니다.서블릿 컨테이너:
클라이언트-서버 구조에서 웹 서버가 단순하게 존재한다면, 그저 단순한 컴퓨터에 불과한 서버는 그저 정적인 웹 페이지만 제공할 수 있을 것입니다.
그렇다면 사용자가 본인의 입력에 기초한 동적인 웹 페이지를 보고 싶다면 이 방식은 충분하지 않은 것이죠.
서블릿 컨테이너는 서버 사이드에서 서블릿을 활용하여 동적으로 웹 페이지를 생성하기 위해 탄생한 개념입니다.
스프링부트 내장 서버:
웹 애플리케이션을 개발할 때 별도의 웹 서버 설치 및 설정 과정 없이, 애플리케이션 내부에 포함된 Tomcat 서버를 사용하여 애플리케이션을 실행할 수 있습니다.
이로 인해 개발 및 배포 과정이 단순화되고, 환경에 따른 설정 차이를 최소화할 수 있습니다.
서블릿 및 필터 자동 등록:
스프링 부트는 자동 설정 기능을 통해 서블릿, 필터, 리스너 등의 웹 관련 컴포넌트를 자동으로 등록하고 구성해줍니다.
[클라이언트 요청 수신] 클라이언트가 웹 애플리케이션에 HTTP 요청을 보냅니다.
[웹 서버로 요청 전달] 톰캣 등 웹 서버는 요청을 서블릿 컨테이너로 전달합니다.
[서블릿 컨테이너에서 요청 처리] 서블릿 컨테이너는 클라이언트의 요청을 처리할 수 있는 서블릿을 찾습니다.
만약 서블릿이 컨테이너에 없다면, 서블릿을 동적으로 검색하여 컨테이너의 주소 공간에 로드합니다.
이후 컨테이너가 서블릿의 init() 메소드를 호출하면 서블릿이 초기화 됩니다(서블릿이 처음 로드됬을 때 한번만 호출됩니다).
스프링부트는 자동으로 Spring MVC 모듈의
DispatcherServlet
컴포넌트를 기본 서블릿으로 등록합니다. 이 서블릿은 프론트 컨트롤러로서 중앙 집중적인 역할을 수행하여 모든 클라이언트 요청을 받아 처리합니다. 이 때문에 개발자가 일반적으로 서블릿을 직접 생성하거나 관리할 필요가 없습니다.
[서블릿에서 요청 처리] 컨테이너가 서블릿의 service() 메소드를 호출하여 HTTP 요청을 처리합니다(예: 요청의 데이터를 읽고, 응답을 만들어냅니다.). 서블릿은 컨테이너 주소에 남아있고, 다른 HTTP 요청들을 처리할 수 있습니다.
DispatcherServlet
은 핸들러 매핑을 통해 요청을 처리할 컨트롤러를 찾습니다. 찾아낸 컨트롤러에서 요청을 처리하고, 처리 결과를 바탕으로 응답을 생성합니다.
[클라이언트에 응답 반환] 생성된 응답은 서블릿을 거처 서블릿 컨테이너로 전달되고, 웹 서버는 동적으로 처리된 이 결과를 클라이언트에게 전송합니다.
위에서 확인할 수 있듯이, 스프링 부트 애플리케이션에서 DispatcherServlet
은 모든 클라이언트 요청을 처리하는 스프링 MVC의 핵심 컴포넌트로, 웹 요청을 컨트롤러에게 전달하고 응답을 반환하는 역할을 합니다. 따라서 별도의 서블릿을 생성하지 않더라도, DispatcherServlet이 서블릿 역할을 수행합니다.
Reference