동시에 요청이 들어오면 어떻게 처리하나요?
안녕하세요.
오늘은 동시 요청이 들어오면 어떻게 처리되는지 알아보겠습니다.
결론부터 말씀드리자면 WAS가 동시 요청을 위한 멀티 스레드 처리를 지원합니다.
앞서 WAS와 서블릿에 대한 글을 작성하였습니다. WAS와 서블릿을 모르시는 분은 아래 게시글을 참고해주세요.
https://passionate.tistory.com/30
위의 게시글에서 서블릿의 동작 방식을 설명하면서 'Servlet Container에 스레드를 생성하고 서블릿의 service() 메소드를 호출합니다.'라고 말씀드렸습니다. 이 부분을 자세히 알아봅시다.
생각해보면, WAS에서 서블릿 객체를 누가 호출할까요?
바로 스레드가 호출합니다.
스레드(Thread)
스레드의 정의는 아래와 같습니다.
프로세스(process)는 실행 중인 프로그램(program)이고,
스레드(thread)란 프로세스(process) 내에서 실제로 작업을 수행하는 주체를 의미한다[1].
스레드는 작업을 수행하는 주체입니다. 애플리케이션 코드를 하나하나 차례대로 실행합니다.
자바 메인 메소드를 처음 실행하면 main 메소드가 수행되는데, 이는 main이라는 이름의 스레드가 수행하는 것입니다.
스레드는 한 번에 하나의 코드 라인만 수행합니다.
따라서 동시 처리가 필요하면 스레드를 추가로 생성해야 합니다.
여러 요청이 동시에 들어왔는데 스레드가 하나라면, 사용자가 오래 대기하게 됩니다.
이를 방지하려면 여러 개의 스레드를 사용하면 됩니다.
요청마다 스레드를 생성하면, 처리가 지연되지 않을 것입니다.
요청마다 스레드를 생성하는 방식은 동시 요청을 처리할 수 있고, 리소스(CPU, 메모리)가 허용할 때까지 처리할 수 있다는 장점이 있습니다. 그리고 하나의 스레드가 지연되어도, 나머지 스레드는 정상 동작하니 피해를 줄일 수 있습니다.
그러나 요청마다 스레드를 생성하는 방식에는 여러 단점이 있습니다.
1. 스레드는 생성 비용이 매우 많이 듭니다. 따라서 고객의 요청이 올 때마다 스레드를 생성하면, 응답속도가 늦어집니다.
2. 스레드는 컨텍스트 스위칭(context switching) 비용이 발생합니다. 컨텍스트 스위칭 비용은 코어 1개가 스레드 여러 개를 처리해야 할 때, 스레드 전환 시 발생하는 비용을 의미합니다.
3. 스레드 생성에 제한이 없습니다. 고객 요청이 너무 많으면 CPU, 메모리 임계점을 넘어서 서버가 죽을 수 있습니다.
이 단점을 모두 보완할 수 있는 것이 스레드 풀입니다.
스레드 풀(Thread Pool)
스레드 풀은 필요한 스레드를 스레드 풀에 보관하고 관리하는 방법입니다.
스레드가 필요하면 이미 생성된 스레드를 스레드 풀에서 꺼내서 사용하고 사용을 종료하면 스레드 풀에 해당 스레드를 반납합니다.
최대 스레드를 지정할 수 있고 톰캣은 최대 200개로 기본 설정되어 있습니다.
최대 스레드가 모두 사용 중이어서 스레드 풀에 스레드가 없으면 요청을 거절하거나 특정 숫자만큼만 대기하도록 설정합니다.
스레드 풀 방식은 미리 스레드를 생성해놓기 때문에 고객의 요청이 지연되지 않고, 서버 리소스를 고려해서 스레드의 수를 조정하면 context switching을 줄일 수 있고, 스레드의 최대 개수가 정해져 있어서 서버가 죽지 않고 유지됩니다.
스레드 풀의 최대 스레드 수는 성능 튜닝에서 중요합니다.
최대 스레드가 너무 적으면 서버 리소스는 여유롭지만, 클라이언트에 응답이 지연될 수 있습니다.
반대로 너무 많으면 서버 리소스에 한계가 올 수 있습니다.
멀티 스레드에 대한 부분은 WAS가 처리하기 때문에, 개발자는 멀티 스레드 관련 코드는 신경 쓰지 않아도 됩니다.
개발자는 마치 싱글 스레드 프로그래밍을 하듯이 편리하게 소스 코드를 개발할 수 있습니다.
그래도 WAS 내부에서는 멀티 스레드로 서블릿 객체를 호출하고 있음을 인지하고 개발해야 합니다.
싱글톤 객체인 서블릿이나 스프링 빈은 주의해서 사용합시다. 멀티 스레드로 여러 요청이 동시에 수행될 수 있기 때문에 stateless 하게 사용해야 합니다.
인프런 '스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술' 강의를 듣고 공부하며 정리한 자료입니다.
잘못된 부분은 피드백 주시면 감사하겠습니다.
글 읽어주셔서 감사합니다 :-)
참고자료
[0] 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술, 섹션 1. 웹 애플리케이션 이해 https://www.inflearn.com/course/스프링-mvc-1
[1] http://www.tcpschool.com/java/java_thread_concept
'Spring > 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술' 카테고리의 다른 글
HttpServletRequest로 HTTP 요청 데이터 조회하기 (0) | 2022.01.18 |
---|---|
HttpServletRequest로 HTTP 요청 메시지 조회하기 (0) | 2022.01.18 |
서블릿 등록해서 사용하기 (0) | 2022.01.18 |
HTTP API (0) | 2022.01.17 |
WAS와 서블릿 (0) | 2022.01.16 |
댓글