1. 내장 톰켓 자동설정 위치

경로: spring-boot-autoconfigure > META-INF

org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration

  • ServletWebServerFactoryAutoConfiguration (서블릿 웹 서버 생성)
  • TomcatServletWebServerFactoryCustomizer (서버 커스터마이징)

org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration

  • 서블릿 작성과 등록 수행

2. 내장 웹 서버 응용

2.1 참고 문서

Howto embedded web server

2.2 톰켓에서 다른 서블릿 컨테이너로 변경

  • tomcat dependency 제거
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>
  • 원하는 웹 서버 dependency 추가
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
  • jetty 기동 확인
2020-04-05 18:47:13.206  INFO 6997 --- [           main] o.s.b.web.embedded.jetty.JettyWebServer  : Jetty started on port(s) 8080 (http/1.1) with context path '/'
2020-04-05 18:47:13.210  INFO 6997 --- [           main] c.s.d.s.SpringbootBasicApplication       : Started SpringbootBasicApplication in 2.578 seconds (JVM running for 3.717)

3. 웹 서버 사용 하지 않기

  • application.properties 에 아래 스크립트 등록
spring.main.web-application-type=none

3.1 포트 변경

  • application.properties에 아래 스크립트 등록
server.port=7070

3.2 랜덤 포트 사용 설정

server.port=0
  • Random port 확인 하는 Event Listener 구현
@Component
public class PortListener implements ApplicationListener<ServletWebServerInitializedEvent> {
    @Override
    public void onApplicationEvent(ServletWebServerInitializedEvent servletWebServerInitializedEvent) {
        ServletWebServerApplicationContext applicalicationContext =  servletWebServerInitializedEvent.getApplicationContext();
        int port = applicalicationContext.getWebServer().getPort();

        System.out.println("Port: " + port);
    }
}

4. HTTPS 와 HTTP2

4.1 HTTPS 설정하기

keytool -genkey -alias tomcat -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 4000
  • 키스토어 생성확인
-rw-r--r--   1 Summit  staff   2583 Apr  5 19:20 keystore.p12
  • application.properties 설정
server.ssl.key-store=keystore.p12 //또는 server.ssl.key-store=classpath:keystore.p12
server.ssl.key-store-type=PKCS12
server.ssl.key-store-password=123456
server.ssl.key-alias=tomcat
  • 검증
curl -I -k --http2 https://localhost:8080/


HTTP/1.1 200 
Content-Type: text/plain;charset=UTF-8
Content-Length: 12
Date: Sun, 05 Apr 2020 10:34:15 GMT

  • 기본적으로 springboot에서 http 관련 커넥터가 하나라서 https를 적용하면 http를 사용할 수 없음

  • 하지만 아래 방법을 참고하여 코드로 해결할 수 있음

HTTP 커넥터는 코딩으로 설정하기

@SpringBootApplication
public class SpringbootBasicApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootBasicApplication.class, args);
    }


    @Bean
    public ServletWebServerFactory servletContainer() {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
        tomcat.addAdditionalTomcatConnectors(createStandardConnector());
        return tomcat;
    }

    private Connector createStandardConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setPort(8080);
        return connector;
    }

}

4.2 HTTP2 설정

  • HTTP2 설정은 undertow 기반에서 손쉽게 설정 가능함
  • 우선 application.properties에 아래 설정을 등록함
server.http2.enabled=true
  • pom.xml에 tomcat을 exclude하고 undertow를 설정 함
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
  • Springboot 실행 후 cul 명령어로 확인 결과 HTTP/2 확인
sftth-mac:springboot-basic Summit$ curl -I -k --http2 https://localhost:8443/
HTTP/2 200 
content-type: text/plain;charset=UTF-8
content-length: 12
date: Sun, 05 Apr 2020 14:07:59 GMT
  • 톰켓의 경우 톰켓 9버전대와 java 9+ 버전을 사용하면 별다른 설정없이 HTTP/2 설정 가능

카테고리:

업데이트:

댓글남기기