[스프링 MVC 1편] 1 - (3) 멀티스레드
1. Web Service Architecture 훑어보기

- Web Server : HTTP 요청 Web Container에게 위임
* web.xml -> 어떤 URL과 Mapping되어 있는지 확인
* Client(browser)의 요청 URL을 보고 해당 Servlet을 실행(Thread 생성)
(web.xml에는 어떤 내용들이 구성되어 있는가?) - Web Container : service() 메소드 호출 전 Servlet 객체 메모리 적재
* Web Container는 적당한 Servlet 찾고 컴파일(.class 파일)
* 컴파일(.class)된 파일을 메모리에 적재 (Servlet 객체 생성)
* 메모리 적재 시, init() 메소드 실행 - Web Container : 요청이 올 때마다 Thread 생성
* 각 Thread는 단일 객체에 대해 service() 메소드 호출
[참고] Web Container가 생성하는 Thread의 정체?
* 할당된 Thread는 doGet() 혹은 doPost() 메소드를 수행한다.
* 해당 메소드의 값이 Return되면 destroy() 메소드를 실행한다. -> 자원 반납
* Client의 매 요청다마 doGet(), doPost() 메소드 수행 = 시스템의 오버헤드가 발생 가능성
오버헤드 방지 위해 “Thread Pool” 이용
2. 멀티스레드 이론

스레드 역할은?
웹 브라우저 or 클라이언트가 WAS에게 서버를 요청하고 응답받는 과정에서 연결하고 서블릿 객체를 호출한다
< 스레드 >
- 애플리케이션 코드를 순차적으로 실행 (한번에 하나의 코드 라인씩)
동시에 처리할 경우 스레드 추가로 생성 - 자바 메인 메서드 실행 = main이라는 스레드 실행
스레드 없으면 자바 실행 불가
단일 요청
- 스레드 하나일 때, 요청오면 스레드 써서 서블릿 호출
다중 요청
- 스레드 하나일 때, 서블릿 처리가 지연되는데 요청이 하나 더 들어오면 스레드 대기
(이러면 둘 다 죽음) - 해결방법1 : 스레드를 요청올 때마다 생성하는 방법
- 장점: 다중 요청 처리 가능 (CPU, 메모리 허용될 때까지)
- 단점: 스레드 생성 비용 비싸다 / 응답속도 느림 / 컨텍스트 스위칭 비용 발생
/ 너무 많이 생성하면 CPU, 메모리 임계점 넘어서 서버가 죽을 수 있다 - 해결방법2 : 스레드풀
○ 풀 안에 미리 스레드 만들어놓고 놀고 있는 스레드 가져다 쓰고 다 쓰면 반납
○ 풀에 스레드 없으면 대기 or 거절
○ 비용(CPU) 절약, 응답시간 빠름
** 실무팁 **
WAS는 최대 스레드 수 설정이 중요
너무 낮게 설정하면 서버는 여유로운데도 응답은 계속해서 지연
너무 높게 설정하면 CPU, 메모리 리소스 임계점 초과로 서버 다운
싱글톤 객체 주의해서 사용
그렇다면 적정 수는?
: 애플리케이션 로직의 복잡도, CPU, 메모리, IO 리소스 상황에 따라 다름 → 성능테스트 필요
[출처] 김영한 강사님 인프런 스프링 MVC 1편
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의
웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., 원
www.inflearn.com