1. 쓰레드란?
- 애플리케이션 코드를 하나씩 순차적으로 실행
- 한번에 하나의 코드 라인만 수행
- 동시 처리가 필요하다면? 쓰레드 추가 생성
2. 요청에 따른 쓰레드 사용 예시
1) 단일 요청: 쓰레드 하나 사용
- 요청 > 연결 > 쓰레드 할당 > servlet 호출 > 응답 > 쓰레드 휴식
2) 다중 요청: 쓰레드 하나 사용
- 요청1 > 연결 > 요청1 처리중 > 요청2 > 연결 > 처리 지연(요청1 처리중)
3) 요청시마다 쓰레드 생성
- 장점
- 동시 요청 처리 가능
- 리소스(CPU, 메모리) 허용할 때까지 처리 가능
- 하나의 쓰레드가 지연되어도 나머지 쓰레드 정상 동작
- 단점
- 높은 쓰레드 생성 비용, 컨텍스트 스위치 비용 발생
- 쓰레드 생성 제한 없음 => 요청이 많아지면 리소스 임계점을 넘어 서버가 죽을 수 있음
3. 쓰레드 풀


- 특징
- 필요한 쓰레드를 쓰레드풀에 보관,관리
- 쓰레드풀에 생성 가능한 최대 수: 톰캣의 경우 최대 200개(default)
- 사용
- 쓰레드 필요 > 생성되어 있는 쓰레드 꺼내 사용 > 사용 종료 후 반납
- 최대 쓰레드가 모두 사용중이라면?
- 기다리는 요청은 거절 or 특정 숫자만큼 대기하도록 설정 가능
- 장점
- 이미 생성된 쓰레드를 사용하므로 쓰레드 생성/종료 비용 절약 가능, 응답시간 단축
- 생성 가능한 쓰레드 최대치가 있음 => 너무 많은 요청이 와도 기존 요청 안전하게 처리
실무에서의 쓰레드풀 사용 TIP
- WAS의 주요 튜닝 포인트는 최대 쓰레드(max thread) 수!
- 최대 쓰레드 수 too low?
- 동시요청이 많아지면 서버 리소스는 여유 but 클라이언트는 응답 지연
- 최대 쓰레드 수 too high?
- 동시요청이 많아지면 CPU/메모리 시소스 임계점 초과로 서버 다운
- 쓰레드풀의 적정 숫자는 어떻게 설정할까?
- 애플리케이션 로직의 복잡도, CPU/메모리, IO 리소스 상황에 따라 다름
- 성능 테스트 진행
4. WAS의 멀티 쓰레드 지원
- 사실상 WAS가 멀티 쓰레드에 대한 부분은 처리하므로, 개발자는 관련 코드를 신경쓸 필요는 없음
- 마치 싱글 쓰레드 프로그래밍을 하듯 편리하게 소스 개발 가능
- 단, 멀티 쓰레드 환경이므로 싱글톤 객체(서블릿, 스프링 빈)는 공유에 주의하여 사용 필요