스프링 다중 요청 처리
서블릿(스레드)
서블릿은 웹 페이지를 동적으로 생성하기 위한 자바의 Class이다. 서버에서 동작하고 HTTP 요청을 처리하고 응답을 생성해서 클라이언트에게 전달한다. 서블릿은 HttpServlet 클래스를 상속받거나 Servlet Interface를 구현한다.
이는 서블릿 컨테이너에서 관리된다.
서블릿 컨테이너(싱글톤)
서블릿 컨테이너는 WAS(톰캣)이라고 부른다.
서블릿의 생명주기를 관리하고 클라이언트 요청을 받아서 서블릿을 실행시키고 응답을 생성한다.
Tomcat은 스레드 풀에서 스레드를 클라이언트 요청마다 한 개씩 할당해준다.
그리고 스레드는 Dispatcher Servlet(배송지에 알맞게 배정해주는 부분)을 통해서 요청을 처리하게 된다.
하나의 connection(요청에 따른)에 대해서 스레드가 계속 할당되어 있다면 BIO(Blocking I/O) Connector이며, 대규모 요청이 들어오는 경우 유연한 대처가 힘듦으로 이에 대처하기 위해 스레드를 더 생성하게 되므로 부하가 발생하게 된다. 그렇지 않고, NIO(Non-Blocking I/O) Connector를 이용하여 스레드를 관리하면 여러 개의 스레드가 각각 필요에 따른 작업을 수행하게 되므로 부하를 줄이고 더욱 빠르게 대처할 수 있다. 하지만, NIO Connector 자체는 Thread-Safety를 보장하지는 못한다. 왜냐하면, 서블릿의 컨텍스트는 여전히 각 스레드 자체에 독립적으로 존재하고, 스레드 간에 공유되지 않기 때문이다. 따라서 적절한 동기처리를 설정해주어야 한다.
스프링은 어떻게 다중 요청을 처리할까?
스프링에서는 스레드 풀을 사용해서 멀티 스레딩을 사용한다. 즉, 멀티 스레드 모델을 사용하며 각각의 request에 1개의 스레드가 처리하는 thread-per-request 방식으로 동작한다.
일단 스프링 부트는 내장 서블릿 컨테이너인 Tomcat을 사용한다.
간단하게 starter dependency로 가져올 수 있다.
톰캣이 풀을 관리하고, WAS로서 애플리케이션 실행동안 Client-Server간 요청, 응답을 원할하게 만든다.
Last updated