논블록킹 vs 비동기 vs 멀티스레딩 ― 헷갈리는 세 용어 한방에 정리하기

이동휘·2025년 5월 1일
0

매일매일 블로그

목록 보기
3/49

백엔드 성능 최적화 자료를 보다 보면 논블록킹(Non-blocking), 비동기(Asynchronous), 멀티스레딩(Multi-threading) 이 뒤섞여 쓰이는 경우가 많습니다. 하지만 세 용어는 초점이 서로 다릅니다. 개념을 명확히 잡아 두면 아키텍처 선택과 성능 튜닝에 큰 도움이 됩니다.


1. 논블록킹 ― “호출자를 멈춰 세우지 마!”

  • 정의
    호출된 함수가 작업이 끝났는지와 상관없이 즉시 제어권을 반환하면 논블록킹이라 부릅니다.
  • 핵심 포인트
    “호출자가 기다려야 하나?” → 아니요. 블록되지 않습니다.
  • 예시
    논블록킹 소켓의 recv()는 읽을 데이터가 없으면 곧바로 돌아와 “데이터 없음”만 알려 줍니다. 그 사이 호출 스레드는 다른 일을 처리할 수 있습니다.


2. 비동기 ― “결과는 나중에 알려 줄게”

  • 정의
    작업 실행을 백그라운드로 넘기고, 완료되면 콜백·Future·Promise 등으로 결과를 통지받는 모델입니다.
  • 핵심 포인트
    “결과를 언제 받나?” → 나중에, 별도 매커니즘으로.
  • 예시
    • JavaScript fetch(): 네트워크 요청 후 즉시 Promise 반환, 실제 응답은 .then()/await로 비동기 처리.
    • Spring @Async: 메서드를 스레드풀에 위임하고 바로 반환, Future로 결과 조회.

💡 논블록킹 + 비동기 조합이 가장 효율적입니다. Node.js 이벤트 루프가 대표적 사례입니다.


3. 멀티스레딩 ― “실행 흐름을 여러 개 쓰자”

  • 정의
    하나의 프로세스에서 여러 스레드를 돌려 동시성(Concurrency)·병렬성(Parallelism)을 얻는 구조.
  • 특징
    • CPU 코어를 여러 개 활용해 진짜 병렬 수행 가능
    • 공유 메모리로 협업이 쉬우나, 동기화·교착 상태 관리가 필요
    • 스레드 생성·문맥 전환에 비용 발생


4. 서로의 관계 한눈에 보기

  • 논블록킹: 함수 호출 패턴(즉시 반환 여부)에 관한 속성
  • 비동기: 작업 수행 vs 결과 통지를 분리하는 모델
  • 멀티스레딩: 실행 흐름(스레드) 개수에 관한 아키텍처 선택

싱글 스레드 환경에서도 논블록킹·비동기를 구현할 수 있고(Node.js), 멀티스레드 환경에서도 블록킹 방식(Java Servlet T-per-R)이 흔합니다. 세 개념은 독립적이지만 조합해 쓰면 시너지 효과가 큽니다.


5. 실전에서 보는 조합 예시

▸ 싱글 스레드 + 논블록킹 + 비동기 (Node.js)

이벤트 루프가 하나뿐이지만, 모든 I/O를 논블록킹으로 요청하고 완료 이벤트를 큐에 쌓습니다. I/O 대기 동안 스레드가 놀지 않아 적은 자원으로 높은 동시성을 달성합니다.

▸ 멀티스레드 + 블록킹 (전통 Java Servlet)

클라이언트 요청마다 스레드를 할당하고, DB I/O 중엔 스레드가 그대로 대기합니다. 동시 요청이 늘면 스레드 수가 폭증해 메모리·컨텍스트 스위칭 비용이 커집니다.

▸ 멀티스레드 + 논블록킹 + 비동기 (Netty)

여러 이벤트-루프 스레드가 논블록킹 NIO + 비동기 콜백을 처리해 높은 처리량을 얻으면서도 스레드 수를 최소화합니다.


6. 자주 묻는 질문(FAQ)

Q. 왜 현대 웹 서버는 논블록킹·비동기를 선호할까?

스레드 기반 블록킹 모델은 동접이 늘수록 스레드 수가 선형 증가해 메모리와 컨텍스트 스위칭 비용이 치솟습니다. 반면 논블록킹·비동기 모델은 I/O 대기 시간에 스레드가 다른 요청을 처리하므로 자원 효율확장성이 뛰어납니다.

Q. 논블록킹이면 항상 비동기인가요?

아닙니다. 논블록킹이지만 동기 폴링(결과 준비 여부를 주기적으로 확인)할 수도 있습니다. 가장 효율적인 패턴은 논블록킹 + 비동기(알림 기반)입니다.

Q. 멀티스레드 환경에서 논블록킹/비동기를 쓰면 어떤 이점이 있나요?

스레드 블로킹 시간이 줄어들어 더 적은 스레드더 많은 요청을 처리할 수 있습니다. 메모리·CPU 사용량이 줄고 응답성도 개선됩니다.


7. 더 공부해 볼 거리

  1. Node.js 이벤트 루프 단계별 흐름 실험해 보기
  2. Java CompletableFuture로 CPU-bound · I/O-bound 작업 혼합 처리 성능 측정
  3. Netty, Vert.x, Spring WebFlux 등 논블록킹 네트워크 프레임워크 비교 체험

마치며

논블록킹, 비동기, 멀티스레딩은 각기 다른 레이어의 개념이지만, 올바르게 결합하면 최적의 성능과 확장성을 끌어낼 수 있습니다. 프로젝트 성격과 자원 제약을 고려해 알맞은 조합을 선택해 보세요!

0개의 댓글