Node.js의 특징, 비동기 구현, 이벤트 루프 & 큐

yunji_kim·2023년 3월 30일
0

Node.js

목록 보기
2/2

Node.js 특징

Node.is는 싱글 쓰레드이며, 그렇기 때문에 비동기 동작이 필요하다. 비동기 동작을 구현하기 위해 이벤트 기반의 동작 방식을 사용한다.

1. 싱글 쓰레드

쓰레드란 명령을 실행하는 단위. 싱글 쓰레드는 한 번에 한가지 동작만 실행 가능하다.

장점 - 쓰레드를 생산하는 비용이 없고, 쓰레드가 늘어나지 않기 때문에 리소스 관리에 효율적

단점 - 쓰레드 기반의 작업들의 효율이 떨어짐 ex) CPU 연산 작업

따라서 Node.js는 비동기 동작으로 쓰레드 기반의 작업을 최소화한다.

2. 비동기

  • 멀티 쓰레드 동기 방식 : 한 번에 여러가지 동작을 실행할 수 있지만 동작의 완료를 기다리는 동안 CPU 리소스가 낭비됨.
  • 싱글 쓰레드 비동기 방식 : 동작의 완료를 기다리지 않기 때문에 CPU 리소스를 효율적으로 관리 가능.

3. 이벤트 기반

이벤트 기반이란 비동기 동작의 완료를 처리하는 방법으로서 사용되는 방식이다. 비동기 방식은 동작의 완료를 기다리지 않기 때문에 특정 동작을 실행한 후, 해당 동작을 전혀 신경 쓰지 않는다. 대신 해당 동작이 완료될 경우 실행할 함수(이벤트)를 미리 등록한다. 비동기 동작이 완료가 되면 미리 등록된 함수(이벤트)를 실행한다.


Node.js 비동기 코딩 세 가지 구현 방법

비동기 코딩이란 이벤트 기반 동작을 코드로 구현하는 방법이다.

1. Callback

전통적인 JavaScript의 이벤트 기반 코딩 방식

  • 비동기 동작 수행 → 쿼리가 완료되면 callback 함수 실행
  • 콜백 지옥에 빠질 위험이 있다

2. Promise

callback의 단점을 보완한 비동기 코딩 방식

  • 동작 완료 → then에 등록된 callback 실행 / 오류 발생한 경우 catch에 등록된 callback 실행
  • chaining, short-hand 표현 방법으로 간결하게 사용 가능
  • 화살표 함수로 작성하면 return 생략 가능
  • Promise.all을 사용하면 Promise함수를 동시에 실행시키고 등록된 모든 함수가 마무리되면 결과값을 한꺼번에 반환한다.

3. async/await

Promise의 단점을 보완한 비동기 코딩 방식

  • async 함수 실행 → Promise 함수 결과를 await으로 받음
  • await한 promise 함수가 완료될 때까지 다음 라인으로 넘어가지 않음.
    따라서 순차적 프로그래밍처럼 작성이 가능.
  • async 함수의 return은 Promise이다.
  • try..catch로 오류 처리 가능

심화 - 이벤트 루프

  • 이벤트 루프란 이벤트를 처리하는 반복되는 동작이다. 즉, Node.js가 비동기-이벤트 동작을 처리하는 일련의 반복 동작이다.
  • 이벤트 루프를 이해하면 비동기 코딩이 어떤 순서로 수행되는지에 대해 이해할 수 있다.
  • 이벤트 루프는 JavaScript의 일반적인 동작 방식으로 Node.js뿐아니라 브라우저에도 있다.

이벤트 루프 구성요소

Call stack

  • 작성된 함수들이 순차적으로 등록되는 LIFO 스택
  • 이벤트 루프는 콜스텍이 비어있을 때까지 스택의 함수를 실행한다.

Message Queue

  • setTimeout 같은 지연실행 함수를 등록하는 FIFO 큐
  • 정해진 timing이 끝나고, 콜스택이 비어있을 경우, 등록된 함수를 콜스택에 추가한다.

Job Queue

  • Promise에 등록된 콜백을 등록하는 FIFO 큐
  • 상위 함수가 종료되기 전콜스택이 비어있지 않더라도 잡큐에 등록된 콜백을 콜스택에 추가한다.

(위 그림에서 메세지 큐 영역은 생략됨)

💡
LIFO : 후입선출 後入先出 Last In First Out
FIFO : 선입선출 先入先出 First In First Out


*이미지 출처 : 엘리스 코딩

profile
| FE Developer | 기록의 힘 |

0개의 댓글