2022. 9. 23. 13:59ㆍJAVA/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
[인프런] 스프링부트 개념과 활용
'JAVA > Spring' 카테고리의 다른 글
[Spring] Resource 인터페이스와 Resource 인터페이스 구현체 (0) | 2022.09.25 |
---|---|
[Spring][IoC] ApplicationEventPublisher (0) | 2022.09.23 |
[Spring][IoC] MessageSource (0) | 2022.09.13 |
[Spring][IoC] Environment, 프로파일 및 프로퍼티 (0) | 2022.09.01 |
빈(Bean)의 스코프 (0) | 2022.08.31 |