And Brain said,
Node.js가 각광받은 이유 - 비동기(async), non-blocking 본문
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)
언뜻 보면 제어권을 주는 것과 함수 결과를 처리한다는 것이 똑같아 보이지만 엄밀히 다른 개념이다.
기본적으로, 동기-블로킹, 비동기-논블로킹 이 두 가지 모델이 가장 익숙할 것이다.
여기서 비동기-논블로킹 모델이 바로 Node.js이며 4가지 모델 중 가장 효과적인 모델이다.
그럼 남은 두 가지 모델도 살펴보자
동기-논블로킹 모델은 B 함수가 바로 제어권을 A 함수에게 주기에 A 함수는 다른 작업을 수행할 수 있지만 언제 종료되는지 알 수 없는 B 함수의 종료를 A 함수가 처리해야 한다.
A 함수가 직접 결과를 처리해야하는 상황이기에 B 함수의 종료를 반복적으로 물어봐야 하는 경우이다.
마지막 비동기-블로킹 모델은 4가지 중 가장 비효율적인 모델이다.
동기-블로킹 모델과 성능 차이가 없으므로 굳이 이 모델을 사용할 이유가 없다.
근데 이렇게 사용되는 경우들이 발생하게 되는데 대표적으로 Node.js와 MySQL을 직접 연동시키면 이런 모델이 나온다.
MySQL의 드라이버는 블로킹 방식이라 비동기-블로킹 모델이 되고만다.
또한 자바에서 비동기 API를 만들고 싶은데 기존 JDBC를 사용하여 작업한다면 JDBC가 블로킹 방식으로 동작하니 이 모델이 된다.
그리하여 나온 것이 스프링의 R2DBC다. 이는 나중에 Webflux와 함께 따로 다루도록 하겠다.
Thanks for watching, Have a nice day.
'IT > Node.js' 카테고리의 다른 글
Mongoose | 거대한 데이터베이스(MongoDB)를 다루는 작은 거인 (7) | 2022.11.11 |
---|---|
Mongoose | node.js를 위한 우아한 MongoDB 객체 모델링 (0) | 2022.11.07 |
[Express] req.params, req.query, req.body (0) | 2022.09.10 |
[Express, Mybatis, OracleDB] selectKey가 안 될 때 (0) | 2022.09.09 |
oracleDB를 잔뜩 담은 mybatis를 express에 넣어 보내버리기 (5) | 2022.08.17 |