✅들어가면서
프로그래밍을 하다 보년 동기와 비동기, 블로킹과 논블로킹이라는 개념을 자주 접하게 된다. 동기/비동기와 블로킹/논블로킹 이 두 개념은 표현 형태는 비슷해 보이지만, 서로 다른 차원에서 작업의 수행 방식을 설명하는 개념이다. 두 가지의 개념의 차이점을 정확하게 알아보자!
⭐동기/비동기
1️⃣동기
동기 작업이란 작업을 수행하는 두 개 이상의 주체가 서로 동시에 수행하거나, 동시에 끝나거나, 끝나는 동시에 시작할 때를 의미한다. 시작과 종료를 동시에 하거나, 하나의 작업이 끝나는 동시에 다른 주체가 작업을 시작하면 이는 동기 작업이라고 볼 수 있다.


동기 작업은 순차적으로 처리되기 때문에 "작업 1 시작 -> 2초 대기 -> 작업 1 완료 -> 작업 2 시작" 흐름으로 처리된다.
스레드 관점에서 보기

스레드 1이 순차적으로 모든 작업을 수행한다.
2️⃣비동기
비동기 작업은 두 주체가 서로의 시작, 종료시간과는 관계 없이 별도의 수행 시작/종료시간을 가지고 있을 때를 뜻한다. 서로 다른 주체가 하는 작업이 자신의 작업 시작, 종료시간과는 관계가 없을 때 비동기라고 부를 수 있다.


비동기 작업은 대기하지 않고 다음 작업을 계속 진행하기 때문에 "작업 1 시작 -> 작업 2 시작 -> 2초 대기 -> 작업 1 완료" 흐름으로 진행된다.
스레드 관점에서 보기

- 스레드 1이 "작업 1"을 시작하고 비동기 작업은 스레드 2에서 실행된다.
- 스레드 1은 비동기 작업이 완료될 때까지 기다리지 않고 다음 작업인 "작업 2"를 시작한다.
- 비동기 스레드 2는 백그라운드에서 2초 동안 대기한 후 "작업 1 완료"를 출력한다.
⭐블로킹/논블로킹
1️⃣블로킹
블로킹 작업은 작업이 완료될 때까지 제어권을 반환하지 않는 방식이다. 호출한 작업이 끝날 때까지 호출한 스레드는 멈춘다. 작업이 완료될 때까지 다른 작업을 수행할 수 없으며, 리소스 낭비가 발생할 수 있다. 간단하고 직관적인 구현이 가능하지만 성능이 저하될 수 있다.


블로킹은 네트워크 요청이 완료될 때까지 제어권이 반환되지 않으므로, "네트워크 요청 시작 -> 네트워크 요청 완료 -> 작업 1 시작" 흐름으로 진행된다.
스레드 관점에서 보기

- 스레드 1에서 네트워크 요청을 보낸다. 해당 작업이 완료될 때까지 스레드 1은 블로킹 상태에 있다.
- 응답을 받으면 작업 1을 시작한다.
2️⃣논블로킹
논블로킹 작업은 작업이 완료되지 않아도 제어권을 즉시 반환하는 방식이다. 호출한 작업이 완료되지 않아도 호출한 쓰레드는 멈추지 않고 다른 작업을 계속 진행한다. 작업을 요청한 후 바로 제어권을 반환하여 다른 작업을 수행할 수 있으며, 작업이 완료되면 별도의 콜백 함수나 이벤트를 통해 결과를 처리다.


네트워크 요청이 비동기로 실행되므로, 메인 스레드는 대기하지 않고 다음 작업을 계속 진행한다. 네트워크 요청이 완료되면 콜백 메서드가 실행된다. 실행 흐름은 "네트워크 요청 시작 -> 작업 1 시작 -> 네트워크 요청 완료" 실행한다.
스레드 관점에서 보기

- 스레드 1에서 "네트워크 요청 시작"을 출력한다.
- nonBlockingTask 메서드를 호출하여 비동기로 스레드 2에서 네트워크 요청을 보낸다.
- 스레드 1은 네트워크 요청이 완료될 때까지 기다리지 않고 즉시 다음 명령으로 이동하여 "작업 1 시작"을 출력한다.
- 비동기 스레드 2는 백그라운드에서 네트워크 요청을 처리하고, 요청이 완료되면 콜백 메서드(thenAccept)를 실행하여 응답을 출력한다.
⭐동기/비동기 & 블로킹/논블로킹 조합
프로그램 아키텍쳐에서는 이 두 개념이 함께 조합되어 사용된다. 예를 들어 다음 4가지로 조합이 가능하다.
- 동기 + 블로킹 (Synchronous + Blocking)
- 동기 + 논블로킹 (Synchronous + Non-blocking)
- 비동기 + 블로킹 (Asynchronous + Blocking)
- 비동기 + 논블로킹 (Asynchronous + Non-blocking)

1️⃣ [동기 + 블로킹]
동기 + 블로킹 조합은 다른 작업이 진행되는 동안 자신의 작업을 처리하지 않고 (Blocking), 다른 작업의 완료 여부를 바로 받아 순차적으로 처리하는 (Sync) 방식이다. 다른 작업의 결과가 자신의 작업에 영향을 주는 경우에 활용할 수 있다. 예를 들어 파일을 읽는 함수가 호출되면, 파일을 모두 읽을 때까지 호출한 프로그램은 아무 작업도 하지 않고 기다린다. 하지만 작업이 완료될 때까지 다른 작업을 할 수 없어 비효율적일 수 있다.
2️⃣ [동기 + 논블로킹]
동기 + 논블로킹 조합은 다른 작업이 진행되는 동안에도 자신의 작업을 처리하고 (Non Blocking), 다른 작업의 결과를 바로 처리하지 않아 작업 순서가 지켜지지 않는 (Async) 방식이다. 다른 작업의 결과가 자신의 작업에 영향을 주지 않은 경우에 활용할 수 있다. 예를 들어 파일을 읽는 함수가 호출되면, 파일을 바로 읽기 시작하지만 호출자는 주기적으로 파일 읽기가 완료되었는지 확인해야 한다. 하지만 주기적으로 상태를 확인해야 하므로 여전히 비효율적일 수 있다.
3️⃣ [비동기 + 블로킹]
비동기 + 블로킹 조합은 다른 작업이 진행되는 동안 자신의 작업을 멈추고 기다리는 (Blocking), 다른 작업의 결과를 바로 처리하지 않아 순서대로 작업을 수행하지 않는 (Async) 방식이다. Async-blocking의 경우는 실무에서 잘 마주하기 쉽지 않아 다룰일이 거의 없다.
4️⃣ [비동기 + 논블로킹]
비동기 + 논블로킹 조합은 다른 작업이 진행되는 동안에도 자신의 작업을 처리하고 (Non Blocking), 다른 작업의 결과를 바로 처리하지 않아 작업 순서가 지켜지지 않는 (Async) 방식이다. 다른 작업의 결과가 자신의 작업에 영향을 주지 않은 경우에 활용할 수 있다.
'네트워크' 카테고리의 다른 글
| 멀티 스레딩과 성능 (0) | 2026.03.13 |
|---|---|
| 멀티 프로세스 vs 멀티 스레드 (0) | 2026.03.12 |
| 프로세스와 스레드 (1) | 2026.03.12 |