And Brain said,

Node.js가 각광받은 이유 - 비동기(async), non-blocking 본문

IT/Node.js

Node.js가 각광받은 이유 - 비동기(async), non-blocking

The Man 2022. 10. 15. 12:58
반응형



Node.js는 역사가 굉장히 짧은 편임에도 개발자들의 눈길을 끌었고 자신의 존재감을 키웠다.

어떻게 Node.js는 단기간에 효과적으로 개발자들을 매료시켰을까?

Node.js가 각광받은 이유가 한 가지만은 아니지만, 그 중심에는 분명 비동기(asynchronous)와 Non-blocking이 있다.

그래서 오늘은 이 둘에 대해 살펴보자.



일단, 비동기(async)와 Non-blocking은 같은 개념이 아니다.

동기라고 무조건 Blocking이 아니며 비동기라 할지라도 Non-blocking이 아닐 수 있다.

각각의 개념에 대해 요약해보자면

블로킹 Blocking


A 함수가 B 함수를 호출할 때, B 함수가 자신의 작업이 종료되기 전까지 A 함수에게 제어권을 돌려주지 않는 것



논블로킹 Non-blocking


A 함수가 B 함수를 호출할 때, B 함수가 제어권을 바로 A 함수에게 넘겨주면서, A 함수가 다른 일을 할 수 있도록 하는 것.


동기 Synchronous


A 함수가 B 함수를 호출할 때, B 함수의 결과를 A 함수가 처리하는 것.


비동기 Asynchronous


A 함수가 B 함수를 호출 할 때, B 함수의 결과를 B 함수가 처리하는 것. (callback)


언뜻 보면 제어권을 주는 것과 함수 결과를 처리한다는 것이 똑같아 보이지만 엄밀히 다른 개념이다.

출처 - https://homoefficio.github.io/2017/02/19/Blocking-NonBlocking-Synchronous-Asynchronous/


기본적으로, 동기-블로킹, 비동기-논블로킹 이 두 가지 모델이 가장 익숙할 것이다.

여기서 비동기-논블로킹 모델이 바로 Node.js이며 4가지 모델 중 가장 효과적인 모델이다.

그럼 남은 두 가지 모델도 살펴보자

출처 - https://homoefficio.github.io/2017/02/19/Blocking-NonBlocking-Synchronous-Asynchronous/


동기-논블로킹 모델은 B 함수가 바로 제어권을 A 함수에게 주기에 A 함수는 다른 작업을 수행할 수 있지만 언제 종료되는지 알 수 없는 B 함수의 종료를 A 함수가 처리해야 한다.

A 함수가 직접 결과를 처리해야하는 상황이기에 B 함수의 종료를 반복적으로 물어봐야 하는 경우이다.

출처 - https://homoefficio.github.io/2017/02/19/Blocking-NonBlocking-Synchronous-Asynchronous/


마지막 비동기-블로킹 모델은 4가지 중 가장 비효율적인 모델이다.

동기-블로킹 모델과 성능 차이가 없으므로 굳이 이 모델을 사용할 이유가 없다.

근데 이렇게 사용되는 경우들이 발생하게 되는데 대표적으로 Node.js와 MySQL을 직접 연동시키면 이런 모델이 나온다.

MySQL의 드라이버는 블로킹 방식이라 비동기-블로킹 모델이 되고만다.

또한 자바에서 비동기 API를 만들고 싶은데 기존 JDBC를 사용하여 작업한다면 JDBC가 블로킹 방식으로 동작하니 이 모델이 된다.

그리하여 나온 것이 스프링의 R2DBC다. 이는 나중에 Webflux와 함께 따로 다루도록 하겠다.



Thanks for watching, Have a nice day.

반응형
Comments