[Spring/MVC] 동시 요청 - 멀티 스레드(Multi-Thread)

멀티 스레드에 대한 기본 개념부터 확인해보자.


다음은 웹 브라우저(클라이언트)에서 요청을 하는 상황이다.

이렇게 클라이언트의 요청이 있으면 WAS(서버)는 요청에 대한 응답을 할 것이다. 이를 위해서는 먼저 TCP/IP 연결이 이루어지고 WAS는 서블릿을 호출한다. 이 서블릿 객체는 누가 호출할까? 바로 스레드가 호출한다. 

 

 스레드는 애플리케이션 코드를 하나하나 순차적으로 실행하는 것을 말한다. 자바 메인 메서드를 처음 실행하면 main이라는 이름의 스레드가 실행된다. 만약 스레드가 없다면 자바 애플리케이션의 실행이 불가능하다. 스레드는 한 번에 하나의 코드 라인만 수행한다. 따라서 동시 처리가 필요하다면 스레드를 추가로 생성해야 한다. 

 

스레드가 단 한 개만 있다고 가정해보자.

클라이언트의 요청이 들어오면 그 하나의 스레드를 할당하고 이 스레드를 이용하여 서블릿 객체 호출을 시행한다. 그리고 이 스레드를 이용해 응답을 하고 나면 스레드는 휴식 상태로 들어가게 된다.

 

그렇다면 스레드는 한 개인데 다중 요청이 발생하면 어떻게 될까?

위 상황은 요청 1의 처리가 지연된 상태에서 요청 2가 들어온 상태이다. 이 경우 스레드가 1개밖에 없기 때문에 대기를 할 수밖에 없고 수행할 수 없게 된다. 결국에는 타임 아웃... 등의 이유로 오류가 발생할 것이다.

 

이를 어떻게 해결할까?

단순하게는 요청이 들어올 때마다 새로운 스레드를 생성하면 된다. 하지만 쓰레드의 생성 비용은 CPU 사용 등의 문제로 매우 비싸고, 요청이 들어올 때마다 쓰레드를 생성하면 응답 속도도 늦어질뿐더러 컨텍스트 스위칭(Context Switching) 비용도 발생한다. 또한, 쓰레드 생성에 제한이 없기 때문에 무작정 생성하면 CPU, 메모리 임계점을 넘게되어 서버가 죽을 수도 있다. 

 

따라서 이렇게 단순하게 해결하지 않고, 대부분의 WAS는 쓰레드 풀을 이용한다.

쓰레드 풀

 쓰레드 풀에 미리 쓰레드를 만들어 놓고 클라이언트의 요청이 들어오면 쓰레드 풀 안에 사용하지 않는 쓰레드를 사용한다. 쓰레드의 사용이 끝나면 버리는 것이 아니라 다시 쓰레드 풀에 반납한다. 만약, 쓰레드 풀에 생성되어있는 쓰레드를 모두 사용했다면 이후의 요청은 쓰레드 대기 혹은 거절 상태가 된다. 이는 설정에 따라 다르다. 

 

 정리해보면, 요청마다 스레드를 생성하는 것의 단점을 보완한 것이고, 필요한 스레드를 스레드 풀에 보관하고 관리하는 구조이다. 스레드가 미리 생성되어 있으므로, 스레드를 생성하고 종료하는 비용이 절약되고 응답 시간이 빠르다. 또한, 생성 가능한 스레드의 최대치가 있기 때문에 너무 많은 요청이 들어와도 기존 요청은 안전하게 처리할 수 있다.


핵심은, WAS가 멀티 스레드를 지원한다는 것이다. 멀티스레드에 대한 부분은 WAS가 처리해준다. 즉, 개발자가 멀티스레드 관련 코드를 신경 쓰지 않아도 된다는 것이다. 마치 싱글스레드 프로그래밍을 하듯이 편하게 소스 코드를 개발하기만 하면 된다.

'스프링(Spring) > MVC' 카테고리의 다른 글

[Spring/MVC-Servlet] Hello 서블릿  (1) 2022.08.22
[Spring/MVC] Servlet : 서블릿  (0) 2022.08.16