[Springboot] 내장 웹 서버(Embedded Web Servers) #1

2022. 9. 23. 13:59JAVA/Spring

개요

각각의 스프링 부트 웹 애플리케이션은 내장 웹 서버를 가지고 있습니다. 이 글에서는 내장 웹 서버를 변경하는 방법이나 포트번호를 변경하는 방법을 소개합니다.

 

1. 다른 웹 서버 사용하기

많은 스프링 부트 스타터들은 기본적인 내장 컨테이너들을 포함하고 있습니다.

  • "spring-boot-starter-web" 라이브러리에는 "spring-boot-starter-tomcat" 의존성 라이브러리가 있고 톰캣을 포함하고 있습니다. 그러나 "spring-boot-starter-jetty" 또는 "spring-boot-starter-undertow" 라이브러리를 대신 사용하여 내장 웹 서버를 변경할 수 있습니다.
  • "spring-boot-starter-webflux" 라이브러이에는 "spring-boot-starter-reactor-netty" 의존성 라이브러리가 있고 Reactor Netty를 포함하고 있습니다. 그러나 Reactor Netty 대신에 "spring-boot-starter-tomcat", "spring-boot-starter-jetty", "spring-boot-starter-undertow" 라이브러리를 사용하여 톰캣, 네티, 언더토우 내장 웹 서버로 변경할 수 있습니다.

예를 들어 기본적인 내장 웹 서버인 톰캣에서 언더토우로 변경하고자 할때 의존성의 설정을 변경해야 합니다. 다음은 설정은 "spring-boot-starter-web" 라이브러리에서 "spring-boot-starter-tomcat"을 제외하고 "spring-boot-start-undertow" 라이브러리를 추가하는 코드입니다.

maven

<properties>
    <servlet-api.version>3.1.0</servlet-api.version>
</properties>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <!-- Exclude the Tomcat dependency -->
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<!-- Use Undertow instead -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-undertow</artifactId>
</dependency>

gradle

dependencies {
	implementation ('org.springframework.boot:spring-boot-starter-web'){
		// 톰캣 제거
		exclude module: "spring-boot-starter-tomcat"
	}
	// 언더 토우 추가
	implementation("org.springframework.boot:spring-boot-starter-undertow")
}

Gradle 프로젝트를 다시 불러오고 확인하면 "spring-boot-start-comcat"은 없어지고 "spring-boot-start-undertow"가 추가된 것을 확인할 수 있습니다.

스프링 부트 애플리케이션을 실행하면 기존 톰캣대신 언더토우 웹 서버로 실행하는 것을 확인할 수 있습니다.

 

2. 웹 서버 비활성화

애플리케이션을 실행하는데 웹 서버를 실행하는 것을 비활성화하고 싶다면 application.yml 파일에서 다음과 같이 설정하면 웹 서버가 실행되지 않습니다.

spring:
  main:
    web-application-type: "none"

 

3. HTTP Port 변경

스탠드얼론 애플리케이션(standalone application, 서버가 부팅할 때 또는 명령을 내려 데몬을 작동시키며 데몬은 백그라운드에서 요청을 기다렸다가 요청이 들어오면 혼자서 처리하는 방식) 안에서 메인 HTTP 포트 번호는 기본적으로 8080입니다. 그러나 application.yml 또는 시스템 속성에서 포트 번호를 변경할 수 있습니다. 

application.yml

server:
  port: 7070 # 특정 포트번호 사용

위와 같이 설정하고 웹 서버 애플리케이션을 실행하면 다음과 같이 7070 포트번호를 사용하고 있다고 출력합니다.

 

4. 랜덤 HTTP Port 번호 사용하기

application.yml 파일 서버 포트 번호를 0으로 설정하면 웹 서버 애플리케이션 실행시 랜덤 포트번호를 사용합니다.

server:
  port: 0 # 랜덤 포트번호 사용

위와 같이 설정하고 웹 서버 애플리케이션 수행시 포트번호가 랜덤으로 할당되어 실행되는 것을 확인할 수 있습니다.

 

5. 실행중에 HTTP Port 번호 확인

WebServerApplicationContext 클래스를 통하여 실행중인 웹 서버의 포트번호를 확인할 수 있습니다. 가장 좋은 방법은 ApplicationListener<WebServerInitializedEvent> 인터페이스를 구현한 클래스를 통하여 확인할 수 있습니다.

@Component
public class PortListener implements ApplicationListener<ServletWebServerInitializedEvent> {
    @Override
    public void onApplicationEvent(ServletWebServerInitializedEvent event) {
        ServletWebServerApplicationContext applicationContext = event.getApplicationContext();
        int port = applicationContext.getWebServer().getPort();
        System.out.println("Port : " + port);
    }
}

위와 같이 컴포넌트를 설정하고 웹 서버 애플리케이션을 실행하면 포트번호를 실행중에 확인 할 수 있습니다.

 

 

References

source code : https://github.com/yonghwankim-dev/springboot_study
https://docs.spring.io/spring-boot/docs/current/reference/html/howto.html#howto.webserver
[인프런] 스프링부트 개념과 활용