1. 내장 웹 서버 이해
1-1) SpringBoot
Spring Boot를 학습하면서 가장 오해하기 쉬운 것 중 하나가 스프링 부트가 서버라고 생각하는 거임.
스프링 부트는 서버가 아니며 그냥 내장 서블릿 컨테이너나
스프링 프레임워크를 사용하는 툴로 이해해야함.
서버는 Tomcat, Netty, Jetty, Undertow임.
이들은 자바 코드로 서버를 만들 수 있는 기능을 제공함.
1-2) SpringBootApplication
1-2)-1. tomcat
SpringBootApplication을 만들면 기본적으로 의존성에 Tomcat이 들어와 있음.
1-2)-2. 톰캣 작성
1-2)-3. 서블릿 작성
1-2)-4. 서블릿에서 톰캣 등록
→ Servlet 이름을 지정해주고, servlet 객체를 helloServlet이라는 이름으로 context에 추가해줌.
→ context에 맵핑을 추가하는데 루트 요청이 오면 servlet을 보여주도록 만들었다.
1-2)-5. 내장 서버를 톰캣만 써서 작성
1-3) 스프링 부트의 자동설정
1-3)-1. 서블릿 웹 서버 생성
스프링부트가 Servlet Container를 띄워주는 걸까. 바로 자동설정과 관련이 있는데
의존성 중에서 autoconfigure에 있는 spring.factories를 열어서 자동 설정 파일 중 ServletWebServerFactoryAutoConfiguration이 있음.
ServletWebServerFactoryAutoConfiguration (서블릿 웹 서버 생성)
ServletWebServerFactoryAutoConfiguration을 살펴보면
ServletRequest라는 클래스가 클래스패스에 있으면 자동 설정하도록 되어있다.
import된 configuration을 보면 BeanPostProcessorsRegistrar, EmbeddedTomcat, EmbeddedJetty, EmbeddedUndertow가 있다.
여기서 Tomcat을 보면 TomcatServletWebServerFactory가 있다. Servlet, Tomcat, UpgradeProtocol 클래스가 있으먼 자동 설정되어 우리가 Tomcat을 만들지 않아도 된다.
여기서 더 파고들어가지 않고 ‘자동설정으로 톰캣이 만들어지는구나,
내장 서블릿 컨테이너가 만들어지는구나’하고 넘어가면 된다.
1-3)-2. Spring MVC
이렇게 만들어진 서블릿은 어디서 등록을 하는가. 스프링 MVC, 특히 서블릿 기반의 MVC라면 DispatcherServlet을 만들어야 한다. 그리고 spring.factories에는 DispatcherServlet의 자동 설정인 DispatcherServletAutoConfiguration파일이 설정되어 있다.
DispatcherServletAutoConfiguration을 살펴보면 Http 서블릿을 상속해서 만든 스프링 MVC의 핵심 클래스인 DispatcherServlet을 만들고 서블릿 컨테이너에 등록한다.
1-3)-3. 왜 둘은 분리되어 있을까?
서블릿 컨테이너는 설정에 따라서 달라질 수 있지만 서블릿은 변하지 않는다.
DispatcherServlet은 어떠한 서블릿 컨테이너를 쓰든 상관없이
서블릿을 만든 다음에 현재의 서블릿 컨테이너에 등록하는 과정이 DispatcherServletAutoConfiguration 안에서 이루어진다.
2. 컨테이너와 포트
2-1) 다른 서블릿 웹 서버 사용하는 방법
2-1)-1. spring-boot-starter-web
2-2) 웹 서버 사용하지 않기
→ 기본적으로 의존성에 웹 관련 기술이 들어와 있으면 스프링 부트는 웹 애플리케이션으로 만들려고 함.
2-2)-1. WebApplicationType
코드를 작성하여 의존성이 있지만 애플리케이션으로 동작하도록하는 방법으로 NONE.
2-2)-.2 Properties로 등록하기
2-3)-3. 포트 띄우기
server.port=7070
2-3)-4. 랜던 포트
server.port=0
2-3)-5. ApplicationListener
랜덤 포트를 애플리케이션에서는 어떻게 쓸 것이냐에 대해
EventListener의 역할을 할 빈이 필요하므로 ApplicationListner 클래스 생성.
Event에서 WebApplicationContext를 꺼냄.
applicationContext는 ServletWebServerApplicationContext이기 때문에 웹 서버를 알 수 있고
웹 서버를 통해서 포트를 알 수 있음. 이렇게 한 후 실행해 보면 서버가 실행되고
콜백이 실행되면서 서버 포트가 찍히고 그 다음 바로 로그에 찍히는 것이 같은 것을 확인할 수 있음.
3. HTTP vs HTTPS
3-1) 키스토어
3-1)-1. Linux 키스토어 설정
keytool -genkey -alias spring -storetype PKCS12 -keyalg RSA
-keysize 2048 -keystore keystore.p12 -validity 4000
3-1)-2. application.properties