본문 바로가기
Category/Spring

Spring의 멀티스레드와 Blocking I/O

by developer__Y 2025. 3. 12.

 


 

Spring Framework는 기본적으로 Blocking I/O 방식으로 사용자의 요청을 처리한다.

Blocking I/O란 입출력 작업(Input/Output)시에 동기식으로 해당 작업이 완료될때까지 해당 스레드가 대기하고있는 방식이다.

스프링에서의 Blocking I/O 작업이란 파일 I/O, 데이터베이스 I/O , 네트워크 I/O와 같은 작업에서

Blocking I/O 방식을 사용한다.

 

그런데, 스프링은 Blocking I/O방식으로 어떻게 다중 사용자의 요청을 처리할까?

 

 

Tomcat의 멀티스레드 + Spring Blocking I/O 방식

 

Spring 프레임워크가 Blocking I/O 방식으로 사용자의 요청을 처리한다면, 예를 들어서 10명의 사용자가 요청을 보내오면

Spring은 순차적으로 10명의 요청을 처리할까?

 

 

스프링 MVC 아키텍처 - 자료출처 : https://isaac-christian.tistory.com/entry/Spring-Spring-MVC-Framework-MVC-%ED%8C%A8%ED%84%B4%EC%9D%98-%EA%B5%AC%EC%A1%B0-%EB%8F%99%EC%9E%91-%EA%B3%BC%EC%A0%95

 

 

위 아키텍처는 Spring MVC 아키텍처이다.

클라이언트의 요청을 받아 각종 비즈니스 로직에 따라 다양한 I/O작업이 일어나고 이후 응답을 반환할 것이다.

 

Spring에서는 다중 사용자 요청을 처리하기위해 멀티스레드를 사용하여 각각의 요청당 각각의 스레드가 생성되고

개별 요청에 대한 개별 스레드가 Spring Blocking I/O 작업을 통해 처리되는 것이다.

 

그렇지만 멀티스레드 방식과 NonBlocking I/O는 다른 의미이다.

NonBlocking I/O 작업은 해당 스레드안에서 I/O작업이 일어나는 동안 대기하지않고 다른 작업을 처리하고, 콜백함수를 통해 요청을 처리하는 방식이다.

이러한 NonBlocking I/O를 사용하여 Spring의 비동기 프로그래밍은  Spring WebFlux를 통해 구현할수있다.

 

 

멀티스레드를 사용해서 다중 사용자의 요청을 처리하는 데에는 스레드간 Context switching 비용이 발생하고,

서버의 리소스 소모가 크다.

 

반면 WebFlux와 같은 NonBlocking I/O 방식은 스레드내에서 비동기적으로 I/O 작업을 처리하기때문에,

컨텍스트 스위칭 비용이 상대적으로 적고, 서버의 리소스를 효율적으로 사용할 수 있지만, 비동기 처리를 위한 다양한 루프 이벤트 및 콜백 함수를 관리해야하는등 구현이 복잡해진다는 단점이 있다.