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명의 요청을 처리할까?
위 아키텍처는 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 작업을 처리하기때문에,
컨텍스트 스위칭 비용이 상대적으로 적고, 서버의 리소스를 효율적으로 사용할 수 있지만, 비동기 처리를 위한 다양한 루프 이벤트 및 콜백 함수를 관리해야하는등 구현이 복잡해진다는 단점이 있다.
'Category > Spring' 카테고리의 다른 글
스프링 스케줄러를 사용하여 커넥션풀의 현재 커넥션 개수 측정하기 (0) | 2024.10.16 |
---|---|
[SpringBoot] 스프링 시큐리티 사용하기 (1) | 2024.02.16 |
[SpringBoot] JPA를 통해 게시판 페이징 처리하기 (0) | 2024.02.15 |
[SpringBoot] @Valid, Validator를 통한 유효성 검사 (1) | 2024.02.15 |
[스프링부트] Thymeleaf - classappend와 fragment (0) | 2024.02.14 |