[Spring Boot] 내장 웹 서버
1. 스프링 부트는 웹 서버가 아니다.
: 스프링 부트는 내장 서블릿 컨테이너를 쉽게 사용할 수 있게 해주는 툴
ex) 웹 서버 : Tomcat, Jetty, Netty, Undertow
2. 톰캣을 이용해 서버 만들기
- 톰캣 객체 생성
- 포트 설정
- 톰캣에 컨텍스트 추가
- 서블릿 만들기
- 톰캣에 서블릿 추가
- 컨텍스트에 서블릿 매핑
- 톰캣 실행 및 대기
웹 서버는 Java 코드로 서버를 만들 수 있는 기능을 제공함
기본적으로 Spring Boot Application을 만들었으면 의존성에 Tomcat이 들어와있음
(없는 경우 dependency에 spring-boot-starter-web 있는지 확인)
# 실습코드
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.catalina.Context;
import org.apache.catalina.LifecycleException;
import org.apache.catalina.startup.Tomcat;
public class Application {
public static void main(String[] args) throws LifecycleException {
Tomcat tomcat = new Tomcat(); // 톰캣 객체 생성
tomcat.setPort(8080); // 포트 설정
Context context = tomcat.addContext("/", "/"); // 톰캣에 컨텍스트 추가
HttpServlet servlet = new HttpServlet() { // 서블릿 만들기
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws
ServletException,
IOException {
PrintWriter writer = resp.getWriter();
writer.println("<html><head><title>");
writer.println("Hey, Tomcat");
writer.println("</title></head>");
writer.println("<body><h1>Hello Tomcat<h1></body>");
writer.println("</html>");
}
};
String servletName = "helloServlet";
tomcat.addServlet("/", servletName, servlet); // 톰캣에 서블릿 추가
context.addServletMappingDecoded("/hello", servletName); // 컨텍스트에 서블릿 매핑
tomcat.start(); // 톰캣 실행
// tomcat.getServer().await(); // 톰캣 대기
}
}
3. Spring Boot는 자동설정을 통해 위의 모든 과정을 보다 유연하게 설정 및 실행
① ServletWebServerFactoryAutoConfiguration : 서블릿 웹 서버 생성
: spring.factories 내에 자동설정 부분을 보면 ServletWebServerFactoryAutoConfiguration 확인 가능
# Auto Configure
org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration,\
# ServletWebServerFactoryAutoConfiguration
@ConditionalOnClass(ServletRequest.class)
: ServletRequest class가 classpath에 있으면 자동설정으로 사용함
@Import
: import는 다른 configuration을 같이 사용하는 것
# ServletWebServerFactoryConfiguration
@ConditionalOnClass({ Servlet.class, Tomcat.class, UpgradeProtocol.class })
: Servlet, Tomcat, UpgradeProtocol 클래스가 있으면 설정으로 사용함
# TomcatServletWebServerFacotry
: tomcat 생성
② DispatcherServletAutoConfiguration : 서블릿 만들고 등록
서블릿 기반의 MVC라면 DispatcherSevlet을 만들어야 함
마찬가지로 spring.properties 파일 내에서 DispatcherServletAutoConfiguration 확인 가능
# Auto Configure
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration,\
# DispatcherServletAutoConfiguration
dispatcherServlet : httpservlet을 상속해서 만든 Spring MVC의 핵심 클래스
DispatcherServletAutoConfiguration에서 dispatcherServlet을 만들고 등록함
# ServletWebServerFactoryAutoConfiguration 과 DispatcherServletAutoConfiguration 이 떨어져 있는 이유
: 서블릿 컨테이너는 pom.xml에 따라 달라질 수 있지만, 서블릿은 변하지 않기 때문에 분리되어 있음
즉, dispatcherServlet은 어떠한 서블릿 컨테이너를 사용하는지 상관없이 서블릿을 만들고 서블릿 컨테이너에 등록함
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8/dashboard
스프링 부트 개념과 활용 - 인프런 | 강의
스프링 부트의 원리 및 여러 기능을 코딩을 통해 쉽게 이해하고 보다 적극적으로 사용할 수 있는 방법을 학습합니다., - 강의 소개 | 인프런...
www.inflearn.com