동기와 비동기는 작업의 완료와 결과를 처리하는 방식에 대한 개념이고, 블로킹과 논블로킹은 작업을 기다리는 동안 호출한 실행 흐름이 제어권을 가지고 있는지에 대한 개념입니다.

따라서 두 개념은 독립적인 축이며, @Async로 JDBC 작업을 별도 스레드에서 실행하는 것처럼 비동기이면서 내부적으로는 블로킹인 구조도 가능합니다.

  • 동기/비동기: 요청한 작업에 대해 완료 여부를 신경 써서 작업을 순차적으로 수행할지 아닌지에 대한 관점
  • 블로킹/논블록킹:현재 작업이 block(차단, 대기) 되느냐 아니냐에 따라 다른 작업을 수행할 수 있는지에 대한 관점

동기/비동기의 주요 관심사는 실행 순서와 결과 처리이다.
블로킹/논클로킹의 주요 관심사는 제어권이다.

구분의미대표 동작사례
Blocking결과나 이벤트를 기다리는 동안 호출한 스레드가 대기데이터가 없는 소켓에서 blocking read()가 대기파일 I/O, 소켓 I/O
Non-blocking지금 처리할 수 없으면 기다리지 않고 반환non-blocking read()가 EAGAIN/EWOULDBLOCK 반환네트워크 서버, 이벤트 드리븐 시스템
동기 I/O호출 안에서 I/O를 수행하고 반환값으로 처리 결과를 받음read()가 실제 읽은 바이트 수를 반환작업 간 의존성이 있는 경우 (트랜잭션)
비동기 I/O요청을 제출한 뒤 호출과 분리하여 I/O가 진행되고 완료 결과를 확인AIO 요청 후 완료 알림이나 상태 조회로 결과 확인네트워크 요청, 이벤트 기반 프로그래밍

예를 들어 non-blocking 소켓의 read()는 데이터가 있으면 읽은 결과를 반환하고, 없으면 재시도가 필요하다고 반환합니다. 반면 비동기 읽기는 요청이 접수되면 호출이 돌아온 뒤에도 읽기가 진행될 수 있습니다. 준비 상태 알림과 실제 I/O 완료 알림을 구분하는 것이 핵심입니다.

Java/Spring에서는 다음과 같이 사용됩니다.

조합의미Java/Spring에서 생각할 예
동기 + Blocking결과를 직접 받고, 결과가 나올 때까지 스레드도 기다림JDBC/JPA, 일반 Spring MVC 코드
동기 + Non-Blocking직접 결과를 확인하지만 준비 안 됐으면 즉시 반환Java NIO SocketChannel
비동기 + Blocking작업은 따로 실행하지만 결과를 기다리며 호출자가 BlockingFuture.get(), CompletableFuture.join()
비동기 + Non-Blocking작업을 맡기고 호출자는 계속 실행, 완료되면 callback/eventReactor, WebFlux, 비동기 I/O

출처 및 참고자료

동기, 비동기, 블로킹, 논블로킹 차이점프로그래밍을 하다 보면 동기와 비동기, 블로킹과 논블로킹이라는 개념을 자주 접하게 됩니다. 이 용어들은 서로 비슷해 보이지만, 실제로는 중요한 차이점을 가지고 있어서 혼란을 겪곤 합니다. 이러한 이유로 이번 글에서는 동기와 비동기, 블로킹과 논블로킹의 개념을 명확히 정리하고 그 차이점을 살펴보려 합니다. 1. 동기, 비동기, 블로킹, 논블로킹 개념[ 동기 ]동기 작업은 하나의 작업이 완료될 때까지 다른 작업을 대기하는 방식입니다. 즉, 현재 작업이 끝나야만 다음 작업이 시작됩니다. 작업이 순차적으로 실행되며, 작업 간에 의존성이 있는 경우에 주로 사용됩니다. 데이터베이스 트랜잭션, 파일 읽기/쓰기 작업, 연속적인 계산 작업 등등에 사용합니다. 예시 코드public class Example { ..coor.tistory.com