[Node.js] Node.js는 왜 비동기 처리 방식을 하는지?

곽태민·2023년 4월 12일
0

TIL

목록 보기
4/63

개요


Node.js를 사용하면서 그냥 싱글스레드 기반의 비동기 처리 방식을 사용한다. 이렇게만 알고 왜 비동기 처리 방식을 하는지는 생각을 안해봤다.

그래도 개발자고 Node.js를 사용해서 Server를 만드는데 모르는건 좀 모순인거 같다는 생각이 들어서 정리를 해보게 됐다.

❓Javascript는 왜 싱글 스레드인가?


우선 정리하기 전에 Node.js는 Javascript를 사용하니까 Javascript는 왜 싱글 스레드를 선택을하게 되었는지 정리를 해보려고 한다.

일단 Javascript는 웹페이지 보조적인 기능을 수행하기 위해서 브라우저에서 동작하는 경량 프로그래밍 언어를 만든 언어가 Javascript다.

웹사이트를 구현하던 개발자들에게 Java는 좀 무겁고 난이도가 있는 언어였기 때문에, Javscript가 생겼는데 Java가 왜 무겁고 난이도가 있는 언어라고 생각했냐면 멀티 스레드 모델은 프로그래밍 난이도가 높기때문이다.

멀티 스레드로 구현된 서비스에서는 이 동시성 문제에 대해 신경을 쓰는데, Javascript는 멀티 스레드 환겨에서 발생할 수 있는 복잡한 시나리오를 신경 쓸 필요가 없다.

실제로 Google Chrome 브라우저는 기존 웹 페이지에서 동시성 문제를 일으킬 수 있다는 이유로 단일 웹 사이트 페이지의 Javascript 코드가 동시에 실행되는 것을 허용하지 않는다.

🧐 비동기 처리 방식


Javascript 엔진은 Javascript로 작성한 코드를 해석하고 작동하는 인터프리터인데, 대표적으로 Chrome의 V8 엔진있다.

Javascript는 기본적으로 single thread 기반 언어로, 한번에 한가지 일만 처리를 할 수 있다. single thread기반의 Javascript가 비동기 처리를 어떻게 작업하는지 보면

Call Stack

Call Stack은 실행되는 순서를 기억하는 자료구조로, 함수를 실행하면 그 함수는 Call Stack에 들어가고, 그 함수 안에서 다른 함수가 호출이 되면 그 함수도 Stack에 쌓이게 된다.

함수의 작업이 끝나고 반환이 되면 Stack에서 제거되며, 이런 작업이 반복되는 방식으로 작동한다.

Stack의 자료구조적인 특성을 이용해서 작업들을 처리하는 원리다. 작업을 처리하는 Call Stack은 하나여서 Javascript는 Single Thread기반 언어라고 불린다.

Memory Heap

동적으로 생성된 인스턴스(객체)가 저장되는 공간으로 작업들이 진행되면서 생성되는 변수나 함수들을 저장하는 공간으로 사용된다.

Task Queue

Javascript 런타임 환경에서는 처리해야 하는 작업들을 임시로 저장하는 Queue가 있는데 그게 Task Queue다.

Javascript에서 비동기 요청이 들어오게되면 Call Stack으로 들어가서 바로 처리하는게 아니라 Task Queue를 거치게 된다.

Call Stack에 있는 작업들이 모두 처리되고 비워지게 되면 Task Queue에 있는 작업들을 들어온 순서대로 dequeue를 해서 Call Stack에 넣는다.

Event Loop

Event Loop는 Javascript가 비동기 작업을 처리할 수 있게 도우는 핵심 역할을 하는데, Event Loop는 우선 Call Stack에 작업이 있는지 확인을 한다.

작업이 있으면 Call Stack에 있는 작업을 먼저 실행하고, Call Stack에 있는 작업이 끝나면 Task Queue를 확인해서 대기 중인 작업들을 순서대로 Call Stack에 넣어준다.

이럭시으로 Event Loop는 Call Stack에 현재 실행 중인 작업이 없는지와 Task Queue에 대기중인 작업이 있는지 반복적으로 확인한다.

이런 방법으로 Javascript는 비동기 작업을 처리하고, 비동기 작업을 통해서 작업들이 동시에 일어나는 것처럼 보이게 된다.

Javascript는 Single Thread지만 브라우저와 Node.js의 도움을 받아서 비동기적으로 작업을 처리할 수 있게 된다.

😮‍💨 비동기 처리 방식을 사용하는 이유는?


Javascript는 Single Thread기반 언어인데, 기본적으로 한번에 하나의 작업을 처리할 수 있다. 그러나 I/O 작업이나, DB 접근과 같이 시간이 오래 걸리는 작업을 Single Thread인데 동기적으로 처리를 한다면
작업이 끝날 때 까지 다른 작업을 못하고 완료될 때 까지 기다려야 한다.

이러한 작업은 매우 비효율적이며 사용자도 상당한 불편함을 겪게된다. 비동기 방식의 장점은 병렬 처리를 Thread로 처리하지 않고 Multi Thread가 갖는 자원적인 문제에서 자유롭다.

하지만 Event 처리하는 Event Loop는 single Thread로 이루어져 있어서 Event가 비동기적으로 처리되더라도 작업 자체가 오래 걸리게되면 Server 전체에 영향을 끼칠 수 있다.

profile
Node.js 백엔드 개발자입니다!

0개의 댓글