[Spring] Spring boot 내장 서버 (Tomcat , Undertow) 및 서블릿, 서블릿컨테이너
개요
Spring boot의 내장 Server에는 어떤 것이 있고,
적용은 어떠한 방법으로 되는지 알아보도록 하겠습니다.
설명
스프링 부트는 기본적으로 Tomcat이 내장되어 있습니다.
이러한 내장서버는 사용자가 용도에 따라서 바꿔줄 수 있는데, 사용할 수 있는 서버로는 Tomcat, Jetty, Undertow 등등이 있습니다.
서블릿 컨테이너를 이해하기 위해서 먼저 웹서버에 대해서 잠깐 보고 가도록 하겠습니다.
웹서버
웹서버는 데이터를 전송하기 위해 HTTP 프로토콜을 사용합니다. 일반적으로 클라이언트는 웹 브라우저에 URL을 입력하고 웹 페이지를 얻게 됩니다.
간단하게 말해 웹서버가 하는 일은 웹페이지를 사용자에게 전송하는 것입니다.
변화하는 것은 HTTP 프로토콜에서 형식이 지정되는 요청과 반응 메세지입니다.
내장 서블릿 컨테이너 응용
서블릿
서블릿이란.. 특정 servlet package에 정의된 인터페이스입니다.
클라이언트의 요청을 처리하고 그 결과를 다시 클라이언트에게 응답하는 Servlet
클래스의 구현 규식을 지킨 자바 프로그램입니다.
서블릿의 생명주기를 위한 세 가지 메서드를 정의할 수 있는데,
init() - 초기화
service() - 요청
destroy() - 파괴
로 정의 할 수 있습니다.
서블릿 컨테이너
서블릿 컨테이너란 서블릿들을 위한 박스(Container)입니다.
클라이언트의 Request를 받아주고 Response를 보내주며 정적인 웹 페이지 생성을 위해 존재합니다.
이러한 서블릿 컨테이너는 서블릿의 생명주기를 관리해주는 기능도 합니다.
이러한 서블릿 컨터이너는 다른 말로 WAS 즉, 웹 애플리케이션 서버라고도 불리며 위에서 말한 Tomcat, Jetty, Undertow 등이 대표적인 서블릿 컨네이너라고 할 수 있습니다.
그렇다면.. 서블릿 컨테이너와 웹서버는 어떻게 요청을 처리할까?
각 단계의 순서는 다음과 같습니다.
1. 웹서버가 HTTP 요청을 받습니다.
2. 웹서버는 요청을 서블릿 컨테이너로 전달합니다.
3. 서블릿이 컨테이너에 없다면, 서블릿을 동적으로 검색하여 컨테이너의 주소 공간에 로드합니다.
4. 컨테이너가 서블릿의 init() 메소드를 호출하면, 서블릿이 초기화 됩니다. (처음 로드될때 한번만 호출됨.)
5. 컨테이너가 서블릿의 service() 메소드를 호출하여 HTTP 요청을 처리합니다.
6. 웹서버는 동적으로 생성된 결과를 올바른 위치에 반환합니다.
Servlet 기반 웹 MVC 프로젝트를 개발할 때 자동 설정 파일로 인해 기본적으로 Tomcat을 사용하게 되는데,
다른 서블릿 컨테이너를 사용하고자 할 경우에 대해서 알아보겠습니다.
Tomcat이 기본 설정으로 되어있기에... build.gradle 파일의 configurations에 아래와 같이 설정을 해주면 됩니다.
configurations {
// 여러 설정 존재
.
.
.
// exclude Tomcat
compile.exclude module: 'spring-boot-starter-tomcat'
}
그런 다음 새로운 서블릿 컨테이너인 Undertow를 설정합니다.
build.gradle 파일의 dependencies에 아래와 같이 추가를 해줍니다.
providedCompile('org.springframework.boot:spring-boot-starter-undertow') {
//use org.jboss.logging
exclude group: 'org.jboss.logging', module: 'jboss-logging'
}
그렇게 되면 Server를 구동했을 경우 tomcat이 아닌 Undertow로 시작되는 것을 확인할 수 있습니다.
이렇게 서블릿과 서블릿컨테이너 및 Spring 내장 Server에 대해서 알아보았습니다.