Node

Awesome·2021년 3월 25일
0

TIL

목록 보기
46/46
post-thumbnail

1. Node 시작

기초 개념

Node.js 는 Chrome V8 Javascript 엔진으로 빌드된 Javascript 런타임이다.

  • 런타임 : 특정 언어로 만든 프로그램들을 실행할 수 있는 환경
  • Javascript 런타임은 js 로 만든 프로그램들을 실행할 수 있는 환경을 의미함
  • Node 는 기존 웹 뿐만 아니라 웹이 아닌 환경에서도 js 를 실행시킬 수 있게 함
  • Node 는 내부적으로 V8 이라는 javascript 엔진과 libuv 라는 라이브러리로 구성됨
    • libuv 는 이벤트 기반, non-blocking I/O 모델을 구현함


출처

이벤트 기반(event-driven)

이벤트 기반이란 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식을 의미한다. 이벤트 기반 시스템에서는 이벤트 리스너에 콜백함수를 등록하여 특정 이벤트에 무엇을 할지 미리 등록한다.

  • 콜백함수 : 함수를 미리 정의해놓은 상태에서 특정 이벤트 혹은 시점에 도달하였을 때 호출하는 함수
  • 이벤트 루프 : 여러 이벤트가 동시에 발생했을 경우, 어떤 순서로 콜백 함수를 호출할지를 판단함
    • JS 는 단일 스레드 기반의 언어이다. 반면 JS 가 구동되는 브라우저는 여러 스레드가 활용된다. 따라서 브라우저 환경과 JS 엔진 간의 상호 연동을 위한 장치가 이벤트 루프라고 볼 수 있다.참고 사이트


코드가 실행될 때, 함수는 스택형태로 쌓이게 되는데 이를 Call Stack 이라고 한다. JS 는 변수가 저장되는 Memory Heap 과 Call Stack 으로 구성되어 있다.
코드가 실행되는 과정은 아래와 같다.

  • 함수가 Call Stack 에 쌓인다.
  • 함수 안에 Ajax 나 setTimeout 과 같은 Web API(비동기)가 실행되면서 이벤트 리스너는 백그라운드 라고 하는 곳으로 이동하는 동시에 Call Stack 에 있는 함수는 빠진다.
  • 백그라운드에서 이벤트가 발생하면, 해당 이벤트에 대해 인자로 받은 콜백함수가 Callback Queue(Task Queue) 라고 하는 큐에 쌓인다.
  • 이 때, 이벤트 루프는 Call Stack 이 비어있는지를 보고 있다가 비어있으면 큐에서 함수를 가져와서 스택에 쌓는다.
  • 함수가 실행되고 스택에서 빠진다.

논 블로킹 I/O

블로킹은 이전 작업이 완료된 후에 다음 작업이 수행되는 것을 말하며, 반대로 논 블로킹은 이전 작업이 완료될 때까지 기다리지 않고 수행하는 것을 의미한다. 노드는 파일 시스템 접근이나 네트워크 요청 등의 I/O 작업을 논 블로킹으로 처리한다. 이를 통해 처리 시간을 절약할 수 있다.

function longRunningTask() {
    console.log("작업 끝");
}

console.log("시작");
longRunningTask();
console.log("다음 작업");

위 코드는 블로킹 방식이다. 결과는 순서대로 시작 -> 작업 끝 -> 다음 작업 으로 출력된다.

function longRunningTask() {
    console.log("작업 끝");
}

console.log("시작");
setTimeout(longRunningTask, 0);
console.log("다음 작업");

반면 위 코드는 setTimeout(콜백, 0) 방식으로 논 블로킹으로 만들었다. 결과는 시작 -> 다음 작업 -> 작업 끝 으로 출력된다.

싱글 스레드

앞서도 말했듯이 노드는 싱글 스레드 기반이다. 많이 나오는 개념이 프로세스와 스레드이다.

  • 프로세스 : 운영체제에서 할당하는 작업의 단위를 의미하며, 서로 다른 프로세스 간에는 메모리 등의 자원을 공유하지 않는다. 만약 서로 다른 프로세스가 공유 자원에 동시에 접근하는 경우 Race condition 이 발생할 수 있으며, 이를 방지하기 위해 상호배제(Mutual Exclusion)가 필요하다.
  • 스레드 : 스레드는 자원을 할당받은 프로세스 내부에서 그 자원을 공유하여 작업하는 단위를 말한다. 프로세스는 여러 스레드를 가질 수 있으며, 병렬적으로 다양한 처리를 할 수 있다. 여러 프로세스가 동작할 때, Context Switching 의 overhead 가 큰 반면, 스레드는 하나의 프로세스 안에서 자원을 공유하고 있기 때문에 상대적으로 overhead가 적다. 그러나 프로세스가 뻗으면 스레드도 같이 뻗어버리는 단점이 있을 수 있다.

노드는 여러 스레드가 생성되지만 직접 제어할 수 있는 스레드는 하나다. 그래서 싱글 스레드라고 여겨진다. 이벤트 루프와 논 블로킹 I/O 를 통해서 최대한 효율적으로 실행한다.

profile
keep calm and carry on

0개의 댓글