동기는 동시에 일어난다는 뜻입니다. 무엇이 동시에 일어난다는 것일까요? 바로 요청과 결과입니다.
동기란 요청과 그 결과가 동시에 일어난다는 것인데요. 동기 방식으로 동작한다면, 요청을 하면 시간이 얼마가 걸리든지 요청한 자리에서 결과가 주어져야 합니다.
은행 창구를 예로 들 수 있습니다. 은행 접수원은 고객의 요청에 시간이 얼마가 걸리든지 그 자리에서 결과를 줍니다. 전산 처리가 오래 걸릴 것 같다고 다른 고객을 받으며 일하진 않죠.
비동기는 동시에 일어나지 않는다는 뜻입니다. 요청과 결과가 동시에 일어나지 않는다는 것인데요. 요청을 처리하는 시간이 오래 걸린다면 그 시간동안 다른 일을 할 수 있음을 내포하고 있습니다.
예를 들어 '스타벅스'를 보겠습니다. 고객 A와 B가 있습니다. 먼저 A가 샌드위치를 데워달라고 주문합니다. 그 이후 B는 아메리카노를 만들어 달라고 주문합니다. 이때 직원은 샌드위치를 오븐에 넣어 데우고, 동시에 샌드위치가 데워지는 시간 동안 음료를 만들었습니다.
이러한 방식으로 동작하는 것이 비동기입니다.
정리
- 동기 프로그래밍(Synchronous): 작업이 순차적으로 실행되며 하나의 작업이 끝나야 다음 작업이 시작됩니다.
- 예: 파일 다운로드가 완료될 때까지 프로그램이 다른 작업을 하지 못하고 기다리는 경우(다수의 게임)
- 비동기 프로그래밍(Asynchronous): 작업이 비순차적으로 실행되며 작업이 진행되는 동안 다른 작업을 동시에 처리할 수 있습니다.
- 예: 파일 다운로드가 진행되는 동안 사용자 입력을 처리하는 경우(크롬)
장단점
동기 프로그래밍
- 장점:
- 구현이 간단하고 직관적입니다.
- 디버깅과 유지보수가 용이합니다.
- 단점:
- 작업 대기 시간이 길어질 수 있습니다 (blocking).
- 병렬 처리에 부적합하며, 성능이 낮을 수 있습니다.
비동기 프로그래밍
- 장점:
- 작업을 병렬로 처리할 수 있어 효율적입니다.
- 사용자 경험(UX)을 향상시키며 응답성이 뛰어납니다.
- 단점:
- 구현이 복잡하며 디버깅이 어려울 수 있습니다.
- 비동기 코드의 흐름을 이해하고 관리하기 어렵습니다.
Blocking vs Non-blocking
이 둘은 기다리느냐, 기다리지 않고 다른 것을 하느냐의 기준으로 나뉩니다. 전자가 Blocking, 후자가 Non-blocking 입니다. 은행에서 고객이 접수원에서 어떤 요청을 보내고, 그 요청에 대한 응답을 하염없이 기다리면 Blocking, 기다리면서 핸드폰으로 다른 일을 한다면 Non-blocking 입니다.
동기 프로그래밍에서는 Blocking이 항상 발생합니다. 함수 A가 내부에서 B를 호출한다면, B의 결과를 기다려야 하는 것입니다.
비동기 프로그래밍은 기본적으로 non-blocking을 지향하지만, 특정 조건이나 코딩 방식에 따라 blocking이 발생할 수 있습니다. 스레드 풀이 가득 찬 경우를 예로 들 수 있습니다. 비동기 프로그래밍에서도 스레드 풀이 가득 차서 새로운 작업이 대기하는(blocking) 상태가 발생할 수 있습니다. 또 비동기임에도 락을 획득해야 하는 경우에는 blocking이 발생할 수 있습니다.
ExecutorService executor = Executors.newFixedThreadPool(2);
// 세 개의 비동기 작업을 실행
executor.submit(() -> longRunningTask());
executor.submit(() -> longRunningTask());
executor.submit(() -> longRunningTask()); // blocking
'기타' 카테고리의 다른 글
로컬 캐시(Local Cache) vs 글로벌 캐시(Global Cache) (0) | 2024.12.29 |
---|---|
캐시란 무엇일까? (0) | 2024.12.23 |
프로젝트 즉시 교환 서비스에서 상태값 (0) | 2024.12.18 |
Docker - linux, windows, mac (0) | 2024.12.17 |
WSL, Git bash, Terminal (0) | 2024.12.17 |