728x90
CS를 진행하며 동기 / 비동기와 블로킹 / 논블로킹이 헷갈려 찾아봤다.
찾아보면 볼수록 헷갈렸지만, 알고보니 동기와 블로킹은 단지 조합하여 사용되는 것 뿐 전혀 다른 개념이었다.
1. 핵심 요약
동기 / 비동기 (Sync / Async) : 결과를 누가 확인하는가?
- 동기: 호출한 쪽(A)이 계속 결과를 확인해야 함
- 비동기: 호출받은 쪽(B)이 결과가 끝났을 때 알려줌
블로킹 / 논블로킹 (Blocking / Non-Blocking) : 제어권(실행 흐름)을 누가 갖고 있나?
- 블로킹: 호출받은 쪽(B)이 끝날 때까지 호출한 쪽(A)은 멈춤 (제어권을 B가 가짐)
- 논블로킹: 호출받은 쪽(B)은 실행되지만 호출한 쪽(A)은 멈추지 않고 자기 할 일 함 (제어권 A가 계속 가짐)
2. 일상 비유
카페에 코딩을 하기위해 커피를 주문한 개발자 시점으로 예시를 들자면
호출한 쪽(A) 는 개발자가 되며, 호출받은 쪽(B) 은 종업원이 된다.
동기 / 비동기
- 동기(Sync)
- 커피가 준비됐는지 개발자가 직접 확인해야 함
- 비동기(Async)
- 개발자는 커피가 나왔는지 신경 쓸 필요 없이 직원이 커피가 나왔음을 알려줌
블로킹 / 논블로킹
- 블로킹(Blocking)
- 개발자는 커피가 나올때까지 계산대 앞에서 기다림
- 제어권이 다른 주체(계산대)에게 넘어감(커피가 나올 때 까지 코딩 불가능)
- 직원이 메뉴를 줄 때까지 코딩작업을 할 수 없음
- 논블로킹(Non-Blocking)
- 개발자는 자리에서 기다림
- 제어권은 손님이 계속 가지고 있음(코딩 가능)
- 커피가 나오지 않아도 코딩작업을 진행할 수 있음
패턴 조합예시
Sync-Blocking (동기 + 블로킹)
- Sync : 커피가 나왔는지 개발자가 직접 확인해야 함
- Blocking : 개발자는 계산대 앞에서 커피가 나올 때까지 기다림
Sync-Nonblocking (동기 + 논블로킹)
- Sync : 커피가 나왔는지 개발자가 직접 확인해야 함
- Nonblocking : 개발자는 자리에서 코딩을 진행하며, 커피가 완성되었는지 틈틈히 확인함
Async-Nonblocking (비동기 + 논블로킹)
- Async : 커피가 완성되었으면 종업원이 알려줌 (콜백)
- Nonblocking : 개발자는 커피가 나오지 않았더라도 부담없이 자리에서 코딩가능
Async-Blocking (비동기 + 블로킹)
- Async : 커피가 완성되었으면 종업원이 알려줌 (콜백)
- Blocking : 개발자는 계산대 앞에서 커피가 나올 때까지 기다림
- 매우 비효율적인 방법
3. 정리
- 동기/비동기: 결과 확인 주체가 누구인가?
- 블로킹/논블로킹: 제어권이 누구에게 있나?
예시에서 보듯이, Async + Blocking(비동기 + 블로킹)은 매우 비효율적인 방식이다.
예를 들어, Node.js와 같이 Async 기반 환경에서 Blocking 방식의 MySQL 드라이버를 사용해야 하는 불가피한 경우가 아니라면, 개발자가 의도적으로 이런 방식으로 구현하는 경우는 거의 없다.
따라서 개발자는 자신이 사용하는 프레임워크나 라이브러리의 특성을 이해하고, 가능한 효율적인 방식으로 구현해야 한다.
'CS' 카테고리의 다른 글
Filter, Spring Security (0) | 2025.04.23 |
---|---|
[security] JWT와 Session의 차이 (0) | 2025.04.23 |
[Spring]Front Controller, Dispatcher Servlet, Spring MVC 처리 Flow (0) | 2025.04.03 |
[Backend] JSP (0) | 2025.04.02 |
RestTemplate, WebClient, RestClient, FeignClient (0) | 2025.02.15 |