
1. 요청량이 급증하여 톰캣의 초과 스레드가 활용될 때, TIMED_WAITING 상태의 스레드가 급증하는 이유[ TIMED_WAITING 스레드가 급증하는 상황 ]기본 스레드 만을 활용하는 상황이전 포스팅에서 살펴보았듯, 톰캣은 내부적으로 자바와 거의 유사한 ThreadPoolExecutor를 활용하는데, 해당 과정의 동작 방식은 다음과 같다. (참고로 이러한 부분은 톰캣에 종속적이니, 보다 자세한 내용을 위해서는 반드시 이전 포스팅을 참고하도록 하자.)작업 요청이 들어오면, core 사이즈 만큼 스레드를 생성함core 사이즈를 초과하면 max 사이즈 만큼 스레드(초과 스레드)를 만들어 실행시키는데, 이는 설정된 시간을 넘어서도 활용되지 않으면 소멸됨스레드의 수가 max 사이즈를 초과하면, 더 이상 초..
1. @Async를 활용한 비동기 처리를 위한 올바른 설정 가이드[ 스프링 부트의 @Async 기본 설정 ]개발을 하다 보면 빠른 API 응답 등을 위해 특정 작업을 비동기로 처리해야 하는 경우가 있다. 스프링을 이용해 개발을 하는 경우에는 @Async를 사용해 비동기 처리를 위임하는 경우가 많은데, 관련 설정을 올바르게 해주지 않으면 서비스에 문제를 일으킬 수 있다.@Async는 @Transactional과 동일하게 AOP 기반으로 프록시 패턴을 활용하여 스레드 풀에 작업을 제출하는 방식으로 동작한다. 따라서 @Async를 통해 제출한 작업을 수행할 스레드 풀이 필요한데, 스프링에서는 별도의 @Async 관련 설정을 해주지 않을 경우 TaskExecutorConfigurations 클래스를 통해서 S..

1. 스프링 부트 톰캣 애플리케이션의 Graceful Shutdown 동작 방식(Spring Boot Tomcat Graceful Shutdown)[ GracefulShutdown의 필요성 ]새로운 버전의 서버를 배포하기 위해서는 기존에 실행중인 서버를 종료하는 과정이 필요한데, 이때 기존의 서버 프로세스를 바로 종료하게 되면, 처리중 혹은 대기중인 요청에 문제가 될 수 있다. 따라서 서버 애플리케이션은 기존에 처리되던 요청을 모두 마무리하고 안전하게 서버를 내릴 수 있는 GracefulShutdown 을 지원해야 한다.프로세스를 종료할 때 강제 종료(리눅스의 -9, SIGKILL)를 하지 않는 한 운영체제는 프로세스에게 종료 시그널을 전달하게 되는데, JVM은 종료 시그널을 받게 될 경우 종료 훅(sh..

1. 올바른 스프링 부트 톰캣 애플리케이션 설정 가이드 (SpringBoot Tomcat Configuration) [ 다양한 스프링 부트 톰캣 애플리케이션 설정들 ]이전 포스팅에서 설명하였듯 ThreadPoolExecutor는 자바 버전과 톰캣 버전 두 종류가 존재하는데, 실질적으로 큰 차이는 없다.톰캣의 ThreadPoolExecutor가 생성되는 코드는 다음과 같은데, 스프링 역시 이에 맞춰 해당 값을 설정할 수 있는 속성들을 제공하고 있다. 스프링 부트에서 조정 가능한 설정값은 크게 4가지가 존재하는데 각각 다음과 같다server.tomcat.max-connections설명: 서버가 동시에 수락하고 처리할 수 있는 최대 연결의 수로, 이 한도에 도달하면 운영체제가 "acceptCount" 설정..

1. 멀티 스레드 기반으로 다중 요청을 처리하는 톰캣(Tomcat)의 구조와 동작 방식[ 웹 애플리케이션 서버(WAS, Web Application Server)과 톰캣 ]스프링 MVC 프레임워크는 자바 엔터프라이즈 개발을 편리하게 해주는 경량급 오픈소스 애플리케이션 프레임워크이며, 대량의 동시 요청 처리를 수행행할 수 있도록 멀티 스레드 모델을 기반으로 하고 있다. 이때 클라이언트와의 요청을 수립하고 이를 받는 부분은 웹 애플리케이션 서버(WAS, Web Application Server)가 수행하며, 대표적으로 톰캣(Tomcat)이 이를 구현하고 있다. [ NIO 기반의 톰캣의 동작 방식 ]사용자 요청이 들어오면 OS 계층에서 TCP 3-way handshake가 발생하고, TCP 연결이 완료된다..