💡 개요
오늘은 네트워크 환경에서 자주 언급되는 Blocking과 Non-blocking IO 에 대해 정리해 보자.
📕 Blocking IO
Blocking이란 단어의 뜻은 ‘막다’이다. 그리고 IO의 의미는 Input, Ouput이다.
그렇다면 이 막는다는 개념이 네트워크에선 어떻게 사용될까?
다음 이미지는 Blocking IO의 동작 과정을 나타낸 것이다.
이미지를 보면 알 수 있듯이 요청 보낸 스레드가 응답을 받기 전까지 Blocking, 즉 막힌다.
그렇기 때문에 서버 2와 서버 3에 요청을 전달하는 서버 1은 자연스럽게 응답을 받기 위한 대기 시간이 길어지고, 클라이언트 또한 응답을 받기까지의 지연시간이 늘어난다.
이러한 문제를 해결하기 위해 대부분의 Blocking I/O 기반 통신에서는 멀티스레딩 방식을 사용한다.
대표적으로 Spring MVC는 Thread-Per-Request(스레드 당 요청)을 따르는 Blocking I/O 방식을 사용한다.
만약 하나의 스레드만 운영된다면, 클라이언트 요청이 몰릴 경우 각 요청이 순차적으로 처리되면서 대기 시간이 길어질 수밖에 없다.
이를 방지하기 위해, 톰캣과 같은 서블릿 컨테이너는 스레드 풀(Thread Pool)을 사용해 여러 개의 스레드를 관리한다.
일반적으로 스레드 개수는 CPU 코어 수에 맞춰 설정하는 것이 효율적하지만, 애플리케이션의 특성과 부하량에 따라 조정될 수도 있다.
📕 Non Blocking IO
Non Blocking IO는 Blocing IO와 반대로 요청을 보낸 스레드가 이어서 다른 동작을 수행할 수 있다.
다음은 Non Blocking IO의 동작 과정을 나타낸 것이다.
기존의 Blocking I/O 방식에서는 서버 2에 요청을 보낸 후, 응답이 도착할 때까지 해당 스레드는 대기 상태에 들어간다.
반면, Non-Blocking I/O 방식에서는 응답을 기다리지 않고 서버 3에도 요청을 보낼 수 있다.
즉, 하나의 스레드가 특정 요청의 응답을 대기하지 않고 계속해서 다른 작업을 수행할 수 있기 때문에, 대기 시간 없이 효율적으로 동작하며 전체적인 지연 시간을 줄일 수 있다.
Spring Framework에서는 Spring WebFlux가 대표적인 Non-Blocking I/O 기반의 웹 프레임워크이고, 특히 MSA와 같이 서버 간 통신이 빈번한 환경에서 활용되며, 높은 동시성을 요구하는 시스템에서 성능을 극대화할 수 있다.
'개발 일기' 카테고리의 다른 글
[개발 일기] 2025.04.03 - @DataJpaTest vs @SpringBootTest (0) | 2025.04.03 |
---|---|
[개발 일기] 2025.04.02 - Spring Boot 서버가 작동될 때 발생되는 일 (0) | 2025.04.02 |
[개발 일기] 2025.03.31 - WSS (WebSocket Secure) (0) | 2025.03.31 |
[개발 일기] 2025.03.30 - Docker를 사용하는 이유가 뭐에요? (0) | 2025.03.30 |
[개발 일기] 2025.03.29 - deleteAll() vs deleteAllInBatch() (0) | 2025.03.29 |