Node.js에서 비동기의 개념?

정종화·2021년 11월 29일
0

Node.js가 뭐야?

  • Chrome V8 Javascript 엔진으로 빌드된 Javascript 런타임이다.
  • Javascript를 활용하며, Non-blocking I/O와 단일 스레드 이벤트 루프를 통한 높은 처리 성능을 가지고 있는 것이 특징이다.
  • 내장 HTTP 서버 라이브러리를 포함하고 있어 웹 서버에서 아파치 등의 별도 소프트웨어 없이 동작하는 것이 가능하며, 이를 통한 웹 서버의 동작에 있어 더 많은 통제에서 벗어나 여러 가지 기능을 가능하게 한다.

런타임이 뭐야?

  • 런타임은 프로그램이 실행되고 있을 때 존재하는 곳을 말한다.
  • 프로그래밍 언어가 구동되는 환경이라고 이해하면 된다.
  • Javascript라면 웹 브라우저에서 작동하는 Javascript 측면이 있고, Node.js라는 환경에서 구동되는 측면이 존재하는데, 여기에서의 웹 브라우저와 Node.js를 런타임이라고 볼 수 있다.

Node.js의 비동기적 개념이 뭐야?

  • 그전에 우선 알아야할 개념들이 좀 있다.

  • CPU Bound

    • CPU 자원을 사용하는 Task.
    • Javascript V8 Engine에서 처리된다.
    • 작업 속도가 빠르다.
    • I/O Bound를 제외한 대부분의 javascript 코드와 연산들이 이에 해당한다.
  • I/O Bound

    • Input/Output 즉 Disk, Network, Database와 관련된 Task.
    • Event Queue에 Message 형식으로 쌓이며 Event Loop가 돌면서 Event Queue에 쌓인 Task들을 처리한다.
    • 작업이 대부분 네트워크 등 통신을 해야하기 때문에 다소 느리다.
  • Event Loop

    • Event Loop는 NodeJS의 싱글 쓰레드에서 돌아가며 I/O Bound 작업들을 비동기적으로 처리해주기 위해서 필요하다.
    • Client에서 I/O Bound 요청이 온다면 이 요청들은 Message 형태로 Event Queue에 저장된다.
    • Event Loop는 Event Queue에 있는 Task들을 Pop하여 Non-Blocking 방식으로 Kernel에 처리를 요청하며 작업이 끝난 Task들을 감지하고 Callback function을 호출한다.
    • 내부적으로 Non-Blocking function을 지원하지 않는 I/O task들을 Multi Thread Pool로 처리해주기도 한다.

그래서 Node.js의 비동기적 개념이 뭔데?!

  • 클라이언트에서 요청이 들어오면 Event Queue에 담긴다. 그리고 싱글쓰레드(한번에 하나씩만 처리 할 수 있음)인 Node.js에서는 Event Loop가 돌아가면서 순차적으로 Event Queue에 담긴 요청들을 하나씩 처리를 하는데, 이때 만약 시간이 오래 걸리는 요청이나 조금 무거운 요청들이 들어오게 되면 한번에 하나씩만 처리를 할때 전체 요청들을 다 처리하려면 시간이 너무 오래 걸리기때문에 다른 요청들에 영향을 주게 된다.

  • 여기서 이러한 문제점을 해결하기 위해 비동기의 개념이 등장하는데, Event Loop는 시간이 오래 걸리거나 조금 무거운 요청들은 멀티스레드풀(워커스레드)에 요청을 넘기고 바로 다음 요청으로 넘어간다. 멀테스레드풀(워커스레드)은 전달받은 요청을 처리하고 콜백으로 다시 Event Loop에게 알려주고 그 사이 Event Loop는 또 다른 요청들을 처리하게 되어서 시간이 오래 걸리거나 조금 무거운 요청이 들어오게 된다 하더라도 싱글스레드에서 비동기적 개념이 적용되기에 이러한 문제점들을 해결할 수 있는것이다.

profile
Hello?

0개의 댓글