Node.js 의 구조

 

Node.js는 "Javascript를 브라우저가 아닌 컴퓨터에서 브라우저 없이 실행하게 도와주는 환경"을 말한다.

이는 Core Library와 V8 Engine, 그리고 libuv라는 라이브러리를 통해 가능해진다.

 

V8 Engine은 구글이 개발하여 구글 크롬 브라우저에서 사용하는 Javascript Engine이다.

Node.js에서 이 Engine을 활용해서, 브라우저 환경 이외에서도 Javascript를 사용할 수 있게 되었다.

 

libuv는 Node.js가 비동기 I/O 작업을 수행할 수 있게 해주는 중요한 라이브러리다.

이 라이브러리 덕분에 Node.js는 논 블로킹 I/O 모델이라는 특징을 가지게 되었다.

 

이 두가지 주요 구성 요소인 V8 Engine과 libuv는 C와 C++ 언어로 작성되어 있어서, Node.js 사용자가 Javascript으로 작성하면 Node.js Bindings을 통해 c++로 변환되어 실행된다.

 

Node.js는 대표적으로 논 블로킹( Non-blocking ) I/O, 싱글 스레드, 이벤트 루프의 특성이 있다.

Node.js는 싱글 스레드로 동작하나, I/O 작업이 발생한 경우 이를 비동기적으로 처리해 여러 작업을 동시에 처리할 수 있게 한다.


호출 스택

콜스택, 이벤트 루프

 

Javascript는 코드를 실행하며 호출 스택 ( Call Stack )에 함수를 추가하고 함수가 완료되면 호출 스택에서 제거한다.

이는 비동기 작업에서 문제가 되는데, 특히 네트워크 요청과 같이 시간이 많이 걸리는 작업을 기다리는 동안

Javascript는 다른 어떠한 작업도 처리할 수 없게 된다. 이 문제를 해결하기 위해 Javascript는 이벤트 루프와 이벤트 큐를

사용하게 된다.

 

이벤트 루프

이벤트 루프

 

이벤트 루프는 여러 이벤트들과 같은 비동기 작업들을 모아서 관리하고, 어떤 순서대로 실행해야하는지 도와주는 도구다.

 - 이벤트 루프는 호출 스택과 이벤트 큐를 관찰하며, 호출 스택이 비어있고, 이벤트 큐에 작업이 있으면, 이벤트 큐의 작업을 호출 스택으로 이동하는 역할을 담당한다.

 - 이벤트 루프를 활용한다면, 자바스크립트는 시간이 오래 걸리는 작업을 이벤트 큐에 넣어 비동기적으로 처리하고, 그 동안 호출 스택에서 다른 작업들을 계속 처리할 수 있다.

 

이벤트 루프 동작 방식 코드로 살펴보기

function firstFunction() {
  console.log('firstFunction 입니다.');
  secondFunction();
}

function secondFunction() {
  // 2 초간 기다린다.
  setTimeout(function () {
    console.log('secondFunction 입니다.');
  }, 2000);
}

firstFunction();
console.log('전역 코드 실행 중!');

// print: firstFunction 입니다.
// print: 전역 코드 실행 중!
/** 2 초간 기다린다. **/
// print: secondFunction 입니다.

 

위 코드에서 firstFunction은 호출 스택에 추가되고, 실행되며 'firstFunction 입니다.'를 콘솔에 출력하고 secondFunction을 호출 한다. 그 다음 secondFunction은 호출 스택에 추가되고, setTimeout 함수를 실행한다.

setTimeout은 비동기 함수이므로, Javascript는 이 작업을 이벤트 큐에 넣고 secondFunction을 호출 스택에서 제거한다.

그 다음 firstFunction도 호출 스택에서 제거하고, '전역 코드 실행 중!'을 콘솔에 출력한다.

2초가 지난 후, 'secondFunction 입니다.'를 출력하는 작업이 이벤트 큐에서 호출 스택으로 이동하고 실행된다. 이때 호출 스택은 비어 있기 때문에 이벤트 루프가 이 작업을 호출 스택으로 이동시킬 수 있었다.

이처럼, 이벤트 루프와 이벤트 큐를 사용함으로써 Javascript는 비동기 작업을 처리할 수 있게 된다.

'Javascript' 카테고리의 다른 글

[Javascript] Module  (0) 2024.08.29
[Javascript] Express.js 프레임 워크  (0) 2024.08.28
[Javascript] 자료형  (0) 2024.08.24
[Javascript] 화살표함수  (0) 2024.08.22
[Javascript] 프로토타입 ( Prototype )  (0) 2024.08.22

+ Recent posts