본문 바로가기
스프링(부트)/스프링부트 내용 정리

SpringBoot 내장 웹서버

by doflamingo 2020. 6. 4.

아래의 내용은 inflearn 강좌인 스프링 부트 개념과 활용을 보고 정리한 글입니다.


Backgrounds

SpringBoot는 Spring과 달리 웹서버에 대한 설정을 따로 해줄 필요가 없다. 그 이유는 바로 스프링부트에서 전에 말한 EnableAutoconfigure을 통해서 미리 내장 웹서버를 설정하기 때문이다.
이번 포스트는 SpringBoot의 내장웹서버에 대해 정리해본다.

SpringBoot 내장 웹서버

spring-boot-starter-web dependency에는 자동으로 spring-boot-starter-tomcat을 포함하는데 springboot web은 자동으로 tomcat을 Servlet Container로 사용하고 있다.

 

 

이 역시 EnableAutoConfiguration에 의해 자동으로 Servlet Container와 Dispatcher Servlet을 빈으로 등록한다. 지난번에 봤던 autoconfiguration을 설정해주는 spring.factories에 들어가보면 아래 두개의 클래스를 통해 DispatcherServlet과 Servlet Container을 설정한다.

org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration,

ServletWebServerFactoryAutoConfiguration 클래스를 들어가면 Servlet Container로 어떤것을 사용할 지 설정하는 클래스임을 알 수 있다.

Servlet Container란 동적인 페이지를 처리하기 위한 서블릿을 담고 있는 컨테이너로 쉽게 생각해서 Tomcat같은 WAS를 의미한다.
물론, Tomcat이외에도 jetty, undertow같은 서블릿 컨테이너가 존재한다.

이렇게 내장 웹서버를 통해서 SpringBoot는 웹서버를 따로 설치하지 않아도 애플리케이션 실행만으로 웹서비스를 만들 수 있다.

SpringBoot 내장 웹서버 활용

SpringBoot는 웹서버를 통해서 HTTP 통신을 할 수 있다. 컨트롤러를 하나 생성해서 HTTP통신을 진행해본다.

@RestController
public class TestController {

    @GetMapping("/hello")
    public String hello() {
        return "Hello Tomcat";
    }
}

위 처럼 컨트롤러를 하나 생성한 후 get을 통해 '/hello'라는 url로 받아오면 Hello Tomcat이 받아지는 걸 볼 수 있다.

그렇다면 SSL이 추가된 HTTPS 통신은 어떻게 할 수 있을까?

일단 HTTPS 통신을 하기 위해서는 keystore가 필요하다. key store는 인증서, private key등을 저장할 수 있는 저장소 인데 이걸 먼저 생성해야한다. 생성하는 방법은 터미널에서 아래의 명령어를 입력하면 된다.

**keytool -genkey 
  -alias spring 
  -storetype PKCS12 
  -keyalg RSA 
  -keysize 2048 
  -keystore keystore.p12 
  -validity 4000**

-option에 달린 값은 적절하게 넣어주면 된다. (keysize, 알고리즘 등등)

이 명령어를 입력하면 key의 비밀번호를 포함해서 물어보는데 적절하게 넘기면 된다. 귀찮으면 비밀번호만 입력하고 enter로 전부 생략해도 된다. 마지막에만 y로 답하면 된다.

keystore 생성

이렇게 하면 위에서 설정한 keystore이름으로 keystore가 형성되었다.

이 keystore는 프로젝트 root에서 생성했다.

그럼 이제 application.properties에 위에서 설정한 keystore내용을 추가해서 애플리케이션을 실행하면 HTTPS통신을 사용할 수 있다.

server.ssl.key-store=keystore.12
server.ssl.key-store-password=123456
server.ssl.key-store-type= PKCS12
server.ssl.key-alias=spring

그러나 주의해야할 점은 이렇게 했을 경우 설정한 포트는 HTTPS통신만 되어 있기 때문에 HTTP통신시 Bad Request가 발생한다.

HTTPS 통신 성공
HTTP 통신 실패 

만약 HTTP와 HTTPS를 모두 사용하고 싶다면 HTTP통신을 위한 Connector를 하나 더 열어줘야하는데 아래코드로 connector를 Bean으로 등록해서 port를 지정하면 사용할 수 있다.

@Bean
public ServletWebServerFactory serverFactory() {
    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;
}

HTTPS 통신 성공
HTTP 통신 성공

 

이렇게 스프링부트에서 내장 웹서버를 통해 HTTP통신과 HTTPS통신 모두 잘 진행할 수 있다. 

댓글