Spring Boot 애플리케이션은 tomcat, jetty, undertow 내장 서버를 사용할 수 있지만 디폴트 내장 서버는 tomcat을 사용한다.
tomcat 내장 서버를 바로 사용할 수 있는 기본 구성 세트가 있지만 속성 또는 yaml 파일을 이용하여 내장 톰캣 서버를 구성하고 기본 설정을 변경할 수 있다.
내장 서버 autoconfiguration
spring-boot-autoconfigure에 포함된 내장 서버 관련 auto configuration 관련 코드는 다음 패키지에 있다.
- org.springframework.boot.autoconfigure.web.embedded
내장 서버 관련 설정 클래스는
- org.springframework.boot.autoconfigure.web.ServerProperties 클래스 파일이다.
ServerProperties 클래스 파일을 살펴보면
@ConfigurationProperties(prefix = "server", ignoreUnknownFields = true)
public class ServerProperties {
...
private final Tomcat tomcat = new Tomcat();
private final Jetty jetty = new Jetty();
private final Netty netty = new Netty();
private final Undertow undertow = new Undertow();
...
}
내장 서버의 타입에 따른 설정 항목은 다음과 같음을 알 수 있다.
- server.tomcat.* : Tomcat 관련 설정
- server.jetty.* : Jetty 관련 설정
- server.netty.* : Netty 관련 설정 (반응형 웹)
- server.undertow.* : Undertow 관련 설정
Tomcat 관련 설정 항목에 대해서 spring 공식 문서를 참고해도 좋지만 ServerProperties 파일에 정의된 Tomcat inner 클래스 정의를 살펴보는 것도 설정 항목을 파악하는 데 있어서 나쁘지 않은 것 같다.
ServerProperties 클래스 파일의 Tomcat inner class가 정의된 구성은 다음과 같다.
@ConfigurationProperties(prefix = "server", ignoreUnknownFields = true)
public class ServerProperties {
...
...
public static class Tomcat {
...
private final Accesslog accesslog = new Accesslog();
private final Threads thread = new Threads();
...
private final Resource resource = new Resource();
private final Mbeanregistry mbeanregistry = new Mbeanregistry();
private final Remoteip remoteip = new Remoteip();
...
...
//server.tomcat.accesslog.*
public static class Accesslog {
...
...
}
//server.tomcat.thread.*
public static class Threads {
...
...
}
//server.tomcat.resource.*
public static class Resource {
...
...
}
//server.tomcat.mbeanregistry.*
public static class Mbeanregistry {
...
...
}
//server.tomcat.remoteip.*
public static class Remoteip {
...
...
}
}
}
내장 Server and Port
server.port=8181
server.address=ip_address
server.port를 지정하지 않으면 디폴트로 8080포트가 사용된다.
서버 포트를 변경하는 방법에 대한 자세한 내용은 아래 링크를 참고하기 바란다.
2023.09.16 - [스프링부트] - Spring boot embedded server의 default 포트 변경
Tomcat access log 활성화 및 구성
기본적으로 내장 톰캣 서버의 access log 설정은 비활성화 된다.
ServerProperties 클래스 파일의 Tomcat.Accesslog inner class를 살펴보면 다음과 같이 초기값이 지정되어 있다.
server.tomcat.accesslog.enabled 속성을 사용하여 활성화할 수 있다.
server.tomcat.accesslog.enabled=true
다음은 access log 디렉터리 위치를 지정하는 설정이다.
server.tomcat.accesslog.directory=logs
다음과 같이 access log 파일 이름의 접미사 또는 접두사를 변경할 수 있다.
# access log 파일 접두사 설정
server.tomcat.accesslog.prefix=access
# access log 파일 접미사 설정
server.tomcat.accesslog.suffix=.log
다음과 같이 access log 파일 이름의 날짜 형식을 수정할 수 있다.
날짜 형식을 지정하지 않은 경우 디폴트로 ". yyyy-MM-dd"가 사용된다.
지정된 날짜 형식은 SimpleDateFormat 클래스에 의해서 날짜 변환이 된다.
server.tomcat.accesslog.file-date-format=yyyyMMdd
기본적으로 tomcat은 access log를 영구적으로 저장한다. 다음과 같이 access log 보관 일수를 설정할 수 있다.
server.tomcat.accesslog.max-days=7
Tomcat 서버 Connections 설정
Tomcat 내장 서버에는 스레드 풀링 메커니즘이 내장되어 있다.
간혹 서버 리소스의 제약으로 인해 스레드 풀 개수를 조정해야 할 필요가 있는 경우 설정을 통하여 변경할 수 있다.
디폴트는 다음과 같다.
- thread pool max : 200 (최대 thread pool 개수)
- thread min spare : 10 (최소 worker thread 수)
public static class Threads {
/**
* Maximum amount of worker threads.
*/
private int max = 200;
/**
* Minimum amount of worker threads.
*/
private int minSpare = 10;
...
}
다음은 thread pool max를 100으로 설정하고 최소 worker thread 수를 5개로 설정한 예이다.
server.tomcat.thread.max=100
server.tomcat.thread.min-spare=5
클라이언트로 연결 이후 요청을 받기까지 타임아웃 설정을 변경할 수 있다.
server.connection-timeout=10s
요청 헤더 크기 및 요청 본문 크기 설정
# 최대 HTTP 헤더 크기 설정 (디폴트 8KB)
server.max-http-request-header-size=8KB
# 최대 HTTP Request Body 크기 설정 (디폴트 2MB)
server.tomcat.max-swallow-size=2MB
# 최대 POST Request 크기 (디폴트 2MB)
server.tomcat.max-http-form-post-size=4MB
SSL 설정
# Enable SSL (디폴트 true)
server.ssl.enabled=true
# SSL 프로토콜 설정 (디폴트 "TLS")
server.ssl.protocol=TLS
# 별칭 설정
# 별칭은 키 저장소에 있는 키에 사용된다.
# 별칭을 지정하지 않으면 키 저장소의 첫 번째 키가 사용된다.
server.ssl.key-alias=tomcat
# 키 저장소 경로, 키 저장소 유형, 키 저장소 공급자 및 비밀번호 설정
server.ssl.key-store=<키 저장소 경로>
server.ssl.key-store-type=<키 저장소 유형>
server.ssl.key-store-provider=<키 저장소 공급자>
server.ssl.key-store-password=<키 저장소 비밀번호>
# 클라이언트 인증서는 trust store를 통해서 유효성을 검사한다.
# trust store 경로, 유형, 공급자 및 비밀번호 설정
server.ssl.trust-store=<trust store 경로>
server.ssl.trust-store-type=<trust store 유형>
server.ssl.trust-store-provider=<trust store 공급자>
server.ssl.trust-store-password=<trust store 비밀번호>
Spring Boot 내장 서버에 대한 주요 설정에 대해서 기록하였지만 상당히 많은 설정 항목이 있음을 알 수 있다.
Spring 공식 문서를 통해서 내장 서버에 대한 설정항목을 확인할 수도 있지만 spring-boot-autoconfigure의
org.springframework.boot.autoconfigure.web.ServerProperties 클래스 파일을 살펴보는 것도 설정항목을 파악하는데 많은 도움이 될 수 있을 것이다.
'스프링부트' 카테고리의 다른 글
spring multi module 프로젝트 만들기 (0) | 2023.11.19 |
---|---|
Spring REST 서비스 예외 처리 방법 (0) | 2023.11.09 |
Spring Data JPA 에서 공간 정보(Spatial Data) 사용하기 (0) | 2023.11.01 |
Spring REST 컨트롤러에서 HTTP 헤더 읽기 (0) | 2023.10.29 |
Spring에서 특정 HTTP 응답 상태 반환하기 (0) | 2023.10.28 |
댓글