부트 개념과 활용-05.내장 웹 서버 응용(컨테이너와 포트)
내장 웹 서버 응용 1부 : 컨테이너와 포트
https://docs.spring.io/spring-boot/docs/current/reference/html/howto-embedded-web-servers.html
- 다른 서블릿 컨테이너로 변경
- 웹 서버 사용 하지 않기
- 포트
- server.port
- 랜덤 포트
- ApplicationListner
톰켓이 아닌 다른 서블릿 컨테이너를 쓰려면?
spring-boot-starter-web 의존성 안을 보면 spring-boot-starter-tomcat을 가져오고 있다.
이 부분을 먼저 제외시켜주고..(exclusion) 제티를 추가시켜주면..
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 기존 가져오는 tomcat exclusion -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- jetty 추가-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
2019-12-14 13:35:44.080 INFO 7107 --- [ main] o.s.b.web.embedded.jetty.JettyWebServer : Jetty started on port(s) 8080 (http/1.1) with context path '/'
제티로 실행이 됩니다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
undertow 로 변경도 동일합니다.
톰캣만 빼고 그냥 실행하면 웹이 아니니까 그냥 자바만 실행되고 끝.
(실행을 위해서 웹 서버 타입을 none으로 주고 자바만 실행시킨 것 과 동일)
추가로 이 설정도 프로퍼티에서 설정이 가능하다.
application.properties
spring.main.web-application-type=none
서버 뜨지 않고, 자바 애플리케이션 실행.
마찬가지로 서버 포트를 변경하려면
server.port=7070
2019-12-14 13:42:18.613 INFO 7130 --- [ main] o.s.b.w.e.u.UndertowServletWebServer : Undertow started on port(s) 7070 (http) with context path ''
랜덤 포트를 사용하려면
server.port=0
2019-12-14 13:42:56.757 INFO 7135 --- [ main] o.s.b.w.e.u.UndertowServletWebServer : Undertow started on port(s) 62089 (http) with context path ''
62089 포트에 실행된 것을 볼 수 있다.
그럼 랜덤하게 뜨는 포트, 고정시킨 포트를 어떻게 얻고, 초기화 되었는지 확인하는 방법?
레퍼런스에서 가장 추천하는 방법
You can access the port the server is running on from log output or from the ServletWebServerApplicationContext through its WebServer. The best way to get that and be sure that it has been initialized is to add a @Bean of type ApplicationListener
and pull the container out of the event when it is published.
예제코드
@Component
public class PortListner implements ApplicationListener<ServletWebServerInitializedEvent> {
@Override
public void onApplicationEvent(ServletWebServerInitializedEvent servletWebServerInitializedEvent) {
ServletWebServerApplicationContext applicationContext = servletWebServerInitializedEvent.getApplicationContext();
int port = applicationContext.getWebServer().getPort(); // 서블릿 애플리케이션 컨텍스트라서 서버를 꺼낼 수 있고 그 서버의 포트도 확인할 수 있다.
System.out.println("random port : " + port);
}
}
실행결과
2019-12-14 13:47:15.909 INFO 7141 --- [ main] o.s.b.w.e.u.UndertowServletWebServer : Undertow started on port(s) 62175 (http) with context path ''
random port : 62175
2019-12-14 13:47:15.912 INFO 7141 --- [ main] me.jaeuk.demo.WebApplication : Started WebApplication in 1.72 seconds (JVM running for 2.195)