강의 chap1-3
동시 요청 – 멀티 쓰레드
1. 쓰레드

- 쓰레드 : 서블릿 객체를 호출한다.
- 쓰레드는 애플리케이션 코드를 하나하나 순차적으로 실행하는 것이다.
- ex) java main 메서드를 처음 실행하면 main이라는 이름의 쓰레드가 실행된다.
- 쓰레드가 없으면 애플리케이션 실행이 불가능하다.
- 쓰레드는 한 번에 하나의 코드 라인만 수행한다.
- 동시 처리가 필요하면 쓰레드를 추가로 생성해줘야 한다.
2. 단일 요청(쓰레드 하나 사용)

- 쓰레드는 휴식을 하고 있다가 요청이 오면 커넥션 연결이 쓰레드를 할당해주고 서블릿 코드를 실행해준다.

3. 다중 요청(쓰레드 하나 사용)
- 쓰레드는 하나인데 다중 요청이 들어오는 경우

- 요청1을 처리중에 어떠한 이유 때문에 서블릿 처리가 지연되고 있는 경우이다.
- 이 때 요청2가 들어온다. 이 때 쓰레드를 대기한다.

- 이 경우 요청1에 대한 쓰레드 처리가 되지 않아 요청1도 에러, 요청2도 에러가 난다.
4. 요청마다 쓰레드 생성

-
요청이 들어올 때마다 쓰레드를 생성한다.
-
장점
-> 동시 요청 처리 가능하다
-> 리소스(CPU, 메모리)가 허용할 때까지 처리 가능하다.
-> 하나의 쓰레드가 지연되어도 나머지 쓰레드는 정상 동작한다.
-
단점
-> 쓰레드는 생성 비용이 매우 비싸다(CPU를 많이 쓴다.)
-> 고객의 요청이 올 때마다 쓰레드를 생성하면 응답 속도가 늦어진다.
-> 쓰레드는 컨텍스트 스위칭 비용이 발생한다.(CPU의 코어 수만큼 쓰레드는 동작한다.)
-> 쓰레드 생성에 제한이 없다.(고객의 요청이 굉장히 많이 오면, 메모리 임계점을 넘어서 서버가 죽을 수 있다. 예로 많은 요청이 오면 그에 해당하는 쓰레드를 생성하는 메모리가 터질 수 있다.)
5. 쓰레드 풀
- 위의 단점들을 해결하기 위하여 WAS가 쓰는 방법이다.

- 쓰레드 풀 안에 쓰레드를 미리 만들어 놓는다.
- 요청이 오면 쓰레드 풀에 요청한다.
- 응답을 다 하고 다 쓰면 쓰레드를 버리는 것이 아닌 풀에 다시 넣는다.
- 만약 쓰레드 풀 안에 쓰레드의 개수보다 더 많은 요청이 오면 그 이상의 요청은 설정에 따라 대기시키거나 거절할 수 있다.
6. 쓰레드 풀 특징
- 쓰레드 풀에 생성 가능한 쓰레드의 최대치를 관리한다.
- 톰캣은 최대 200개 기본 설정이 되어있다.(변경 가능하다.)
- 장점
-> 쓰레드가 미리 생성되어 있으므로 쓰레드를 생성 및 종료하는 비용(CPU)이 절약되고 응답 시간이 빨라진다.
-> 쓰레드의 최대치가 있으므로 너무 많은 요청이 들어와도 기존 요청은 안전하게 처리할 수 있다.
7. 쓰레드 풀 실무 팁
-
성능 튜닝에 관한 팁이다.
-
WAS의 주요 튜닝 포인트는 최대 쓰레드 수이다.
-
너무 낮게 설정할 경우

-
너무 높게 설정
-> 동시 요청이 많으면, 리소스 임계점 초과로 서버가 다운될 수 있다.
-
장애가 발생할 경우
-> 클라우드면 일단 서버부터 늘리고 나중에 튜닝을 하자..
-> 클라우드가 아니면 튜닝을 하자..
8. 쓰레드 풀의 적정 숫자
- 애플리케이션 로직의 복잡도, CPU, 메모리, IO 리소스 등의 상황에 따라 모두 다르다.
- 최대한 실제 서비스와 유사하게 성능 테스트를 해본다.
-> 툴 : 아파치 ab, 제이미터, nGrinder
9. 핵심
- WAS는 멀티 쓰레드에 대한 부분을 지원한다.
- 개발자는 멀티 쓰레드 관련 코드를 신경 쓰지 않아도 된다.(애플리케이션 로직에 관한 개발만 신경쓰면 된다.)
- 개발자는 마치 싱글 쓰레드 프로그래밍을 하듯이 편리하게 소스 코드를 개발할 수 있다.
- 멀티 쓰레드 환경이므로 싱글톤 객체(서블릿, 스프링 빈)는 주의해서 사용해야 한다.
-> 공유 변수를 조심해야 한다.
출처
인프런 강의 - 김영한
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard