실전 고수 팁 — 대규모 트래픽 톰캣 설정과 필터/인터셉터 로깅 튜닝
1. Tomcat 스레드 풀(Thread Pool) 튜닝
스프링 부트의 기본 내장 서블릿 컨테이너인 톰캣은 브라우저의 1개의 요청당 백엔드의 1개의 스레드가 할당되어 구동하는 동기식 스레드(Thread per Request) 모델을 따릅니다. 대량의 트래픽이 발생하면 스레드 고갈(Thread Exhaustion)로 일시적으로 서버가 병목 현상에 빠질 수 있습니다.
실제 서버 하드웨어 요구사항에 맞게 application.yml의 다음 속성들을 튜닝하는 것이 실무의 핵심 기술입니다.
server:
tomcat:
threads:
max: 200 # 서버가 허용하는 최대 동시 스레드 수 (기본 200)
min-spare: 10 # 대기 상태로 항시 유지하는 최소 스레드 여유분 (기본 10)
accept-count: 100 # 최대 스레드가 모두 사용 중일 때 OS 큐(Queue)에 대기 가능한 백로그 요청 수
connection-timeout: 20000 # 클라이언트가 커넥션을 맺고 데이터를 보내기까지 기다리는 최대 허용 시간 (20초)
팁
단순히 "트래픽이 높다"고 max 스레드를 10,000처럼 너무 크게 잡아버리면, 오히려 CPU 컨텍스트 스위칭(Context Switching) 오버헤드 비용으로 인해 서버 전체가 느려집니다. 통상 서버의 vCPU 코어 수, DB의 물리 커넥션 풀 크기, 외부 API 동기화 대기 시간 등을 다방면으로 고려하여 벤치마크 툴(JMeter, nGrinder)을 이용해 최적의 매직 넘버 수치를 찾아내야 합니다.
2. 보안(Security)은 Filter, 비즈니스 로직(Business)은 Interceptor
앞서 본 바와 같이 필터와 인터셉터는 둘 다 라우팅되는 클라이언트 요청을 중간에서 가로챈다는 공통점이 있습니다. 실무 아키텍처에서의 명확한 분리 원칙은 다음과 같습니다.
- Filter: 스프링 컨텍스트 이전에 톰캣 서블릿 단계에서 최우선으로 구동하므로 XSS 필터링 공격 방어, 파라미터 조작 난독화, 포트 번호 기반 CORS 검증 등 "웹 기술 레이어 자체"의 전역 보안 패스 및 공통 설정 레이어를 담당시킵니다.
- Interceptor: 스프링 컨텍스트 환경 내부의 정보(호출할 컨트롤러 메서드의 종류, 유저 인증 세션 및 캐시 기록 등)를 심층적으로 모두 조회/변경할 수 있으므로, 권한 인가 로직(
@PreAuthorize), 유저 멤버십 등급별 API Rate Limiting 등 "세분화된 비즈니스 룰 특화 검증 레이어"를 담당하는 것이 맞습니다.