- 스프링부트는 내장 서블릿 컨테이너인 Tomcat을 이용합니다.
- Tomcat은 다중 요청을 처리하기 위해서, 부팅할 때 스레드의 컬렉션인 Thread Pool을 생성합니다.
- 유저 요청(HttpServletRequest)가 들어오면 Thread Pool에서 하나씩 Thread를 할당합니다. 해당 Thread에서 스프링부트에서 작성한 Dispatcher Servlet을 거쳐 유저 요청을 처리합니다.
- 작업을 모두 수행하고 나면 스레드는 스레드풀로 반환됩니다.
톰캣 3.2 이하에선 클라이언트에서 요청이 하나 들어올때마다 Thread를 생성하고
요청이 끝나면 Destroy 했습니다.
이 방식은 OS와 JVM에 부하를 주게되고 동시다발적인 요청도 처리하지 못하였습니다.
쓰레드풀의 작동 플로우는
- 첫 작업이 들어오면, core size만큼의 스레드를 생성합니다.
- 유저 요청이 들어올 때마다 작업 큐에 담아둡니다.
- core size의 스레드 중, 유휴상태인 스레드가 있다면 작업 큐에서 작업을 꺼내 스레드에 작업을 할당하여 작업을 처리합니다.
3-1. 만약 유휴상태인 스레드가 없다면, 작업은 작업 큐에서 대기합니다.
3-2. 그 상태가 지속되어 작업 큐가 꽉 찬다면, 스레드를 새로 생성합니다.
3-3. 3번과정을 반복하다 스레드 최대 사이즈 에 도달하고 작업큐도 꽉 차게 되면, 추가 요청에 대해선 connection-refused 오류를 반환합니다.- 태스크가 완료되면 스레드는 다시 유휴상태로 돌아갑니다.
4-1. 작업큐가 비어있고 core size이상의 스레드가 생성되어있다면 스레드를 destory합니다.
스레드를 미리 만들어놓고 필요한 작업에 할당했다가 돌려 받습니다.
reference https://velog.io/@sihyung92/how-does-springboot-handle-multiple-requests