스프링은 어떻게 모든 요청을 동시에 처리할까?

스프링은 어떻게 모든 요청을 동시에 처리할까?

개발일기

 

스프링 프레임워크가 DispatcherServlet를 프론트 서블릿으로 사용해

모든 Request들을 처리한다는 부분은 숙지하였다.

여기서 의문이 생기는데 그것이 뭐냐하면 “모든 Request를 처리” 한다는 것이다.

 

네이버 같은 대형 포털사이트는 나도 하루에 수십 번씩 접속을 하는데,

인당 하루 최소 수십 번의 Request라면

전 세계 사람이 하루에 네이버에 요청하는 Request는 일견 생각하기에도

수백만수천만 이상의 횟수일 것이다.

 

아무리 요즘 개인PC의 CPU 연산속도가 초당 억 단 위이고,

슈퍼컴퓨터는 조 단위라고 하지만 DispatcherServlet하나로

“이 많은 요청들을 어떻게 그렇게 빠르게 처리할까?” 라는 의문이 또 들었다.

그럼 한개의 Request를 처리하는 동안 뒤에 있는 수백 수천만의 Request들은 대기를 해야 하는 걸까?

 

이 문제를 해결하려면 결국 멀티스레드가 필요하다는 결론이 나왔는데

나는 자바를 공부하면서 웹 애플리케이션을 만들 때 스레드에 관한 코드를 써본 적이 없었다.

그러면 결국 WAS에 답이 있지 않을까? PC에 설치한 톰캣의 server.xml을 살펴보았다.

 

-<Service name="Catalina">
<!--The connectors can use a shared executor, you can define one or more named thread pools-->
<!--<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"maxThreads="150" minSpareThreads="4"/> -->

 

답은 WAS였다.

역시나 스레드 어쩌고 하는 구문이 보인다.

카탈리나(Catalina)는 톰캣의 서블릿 컨테이너 이름이다.

카탈리나는 4~150개의 스레드를 스레드 풀에 보관할 수 있다는 주석을 찾았다.

Request가 들어오면 WAS는 스레드를 생성하고

해당 스레드는 DispatcherServlet 객체를 생성하여 Request를 처리하는 구조인 것 같다.

 

그리고 모든 Request에 트랜잭션을 적용하면

동시 접속으로 인한 데이터 충돌의 문제도 해결할 수 있다는 결론이 나온다.

또한, 그 많은 트랜잭션은 스프링의 AOP로 일괄 해결한다.

머릿속에 흩어져 있던 퍼즐 조각들이 합쳐지는 느낌이 난다.

해답을 찾은 것 같다.

 


© 2022. All rights reserved.