동기와 비동기
동기(Synchronous)
동기 방식은 일련의 실행 과정이 순차적으로 진행되는 것을 말한다. 즉 한 작업이 마무리되기 전까지 다른 작업이 기다려야 한다는 의미이다. 이러한 동기 방식은 호출한 함수 혹은 작업이 반환될 때까지 실행 흐름이 차단되는 특징이 있다.
비동기(Asynchronous)
비동기 방식은 작업들이 독립적으로 실행되는 것을 의미한다. 그래서 작업의 완료 여부에 상관없이 다른 작업을 실행할 수 있다. 비동기 방식은 I/O 처리나 네트워크 요청과 같이 시간이 오래 걸리는 작업에 적용하는 방식으로, 콜백, 프로미스, async/await 등으로 구현 가능하다.
그럼 (논)블로킹과 (비)동기는 어떤 차이가 있을까?
(논)블로킹과 (비)동기
사실 블로킹과 동기는 기다리는 거고, 논블로킹과 비동기는 기다리지 않는 거고 똑같은 의미 아닐까? 사실 이 두 개념은 관점의 차이이다. (논)블로킹은 제어권 관점에서 본 경우, (비)동기는 시간의 관점에서 본 경우를 말한다.
블로킹은 함수가 호출된 후 제어권을 해당 함수에게 넘겨준다. 예를 들어 A -> B 방향으로 호출이 되었다면 제어권이 A에서 B로 넘어간 상황이다. 반대로 논블로킹은 제어권이 넘어갔다가 거의 동시에 다시 돌아온다고 보면 된다.
정리
이러한 동기와 비동기 그리고 블로킹과 논블로킹은 조합하여 사용이 가능하다.
|
동기(sync) |
비동기(async) |
블로킹(blocking) |
제어권이 넘어가며 함수 호출의 결과가 중요한 경우를 말한다. 예로는 일반적인 자바 코드 호출, I/O 작업등이 있다. |
제어권이 넘어가는데 결과값이 중요하지 않은 경우이다. 하지만 앞의 정의와 같이 모순되는 부분이 있어 안티패턴으로 간주되고 잘 쓰이지 않는다. |
논블로킹(non-blocking) |
제어권이 넘어가지 않으며 함수 호출의 결과가 중요한 경우이다. 예로는 롤 게임 로딩창에서 로딩이 진행되는 와중에 유저 정보를 열람할 수 있는 기능이 있다. |
제어권이 넘어가지 않으며 함수 호출의 결과가 중요하지 않은 경우이다. 웹 어플리케이션에서 인증을 위해 메일을 보내는 경우 비동기+논블로킹으로 구현이 가능하다. |