1. 노드 시작하기

진영민·2022년 9월 3일
0

Node.js 교과서

목록 보기
1/13

해당 내용은 Node.js 교과서 2판의 내용을 요약, 정리한 것입니다.

Node.js

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

런타임

특정 언어로 만든 프로그램들을 실행할 수 있는 환경을 뜻함.
노드는 자바스크립트 프로그램을 컴퓨터에서 실행할 수 있다.
쉽게 말하면 노드는 자바스크립트 실행기이다.

Node.js의 역사

기존에는 자바스크립트 프로그램을 웹 브아루저 위에서만 실행할 수 있었다.
브라우저 외의 환경에서 자바스크립트를 실행하기 위한 여러 시도가 있었으나, 자바스크립트의 실행 문제 때문에 큰 효과는 없었다.

하지만 구글이 V8엔진을 사용한 크롬을 출시했다.
V8엔진은 다른 자바스크립트 엔진과 달리 매우 빨랐고, 오픈소스로 공개되었다.

속도 문제가 해결되자 V8 엔진 기반의 노드 프로젝트를 시작했다.

이벤트 기반

이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식.
이벤트 기반 시스템에서는 특정 이벤트가 발생할 때 무엇을 할지 미리 등록해두어야 한다.

이벤트 기반 모델에서는 이벤트 루프가 등장한다.
여러 이벤트가 동시에 발생했을 때 어떤 순서로 콜백 함수를 호출할지를 이벤트 루프가 판단한다.

이벤트 루프

이벤트 발생 시 호출할 콜백 함수들을 관리하고, 호출된 콜백 함수의 실행 순서를 결정하는 역할을 담당한다.

백그라운드

setTimeout같은 타이머나 이벤트 리스너들이 대기하는 곳입니다.
여러 작업이 동시에 실행될 수 있습니다.

태스크 큐

이벤트 발생 후, 백그라운드에서는 태스크 큐로 타이머나 이벤트 리스너의 콜백 함수를 보낸다.
정해진 순서대로 콜백들이 줄을 서 있으므로 콜백 큐라고도 부른다.

만약 3초를 기다리고 실행되는 코드가 있다고 하자.

  1. 해당 함수는 호출 스택에 쌓인다.
  2. 함수 호출 시 백그라운드에 타이머와 콜백을 백그라운드로 보낸다.
  3. 백그라운드에서는 3초를 센 후 태스크 뷰로 보낸다.
  4. 호출 스택의 실행이 끝나 호출 스택이 비워지면 이벤트 루프가 태스크 큐의 콜백을 호출 스택으로 올린다.

만약 호출 스택에 함수가 너무 많이 쌓여 있으면 3초가 지난 후에도 함수가 실행되지 않을 수 있다.
호출 스택이 비워져야만 태스크 큐에 있는 함수를 가져오기 때문이다.

논 블로킹 I/O

노드는 I/O에 대해 논블로킹 방식으로 처리하는 방법을 제공한다.
반대로 블로킹은 이전 작업이 끝나야만 다음 작업을 할 수 있다.

function longRunningTask(){
	//오래 걸리는 작업
    console.log("끝");
}
console.log('시작');
setTimeout(longRunningTask,0);
console.log('다음 작업');

setTimeout은 코드를 논 블로킹으로 만들기 위해 사용하는 기법 중 하나로,
출력은 다음과 같다.

시작
다름 작업
끝

하지만 이 방법은 longRunningTask를 태스크 큐에 보내 호출 스택이 끝날때 까지 기다리고 실행되기 때문에 전체 소요 시간이 짧아지지는 않는다.

스레드

프로세스

운영체제에서 할당하는 작업의 단위. 프로세스 간에는 메모리 등의 자원을 공유하지 않는다.

스레드

프로세스 내에서 실행되는 흐름의 단위. 프로세스는 스레드를 여러 개 생성해 여러 작업을 동시에 처리할 수 있다. 부모 프로세스의 자원을 공유한다.

노드가 싱글 스레드라고 하는 말이 있다.
이는 노드를 실행하면 프로세스가 하나 생성되고, 프로세스에서 스레드를 여러 개 생성하는데, 실제로 직접 제어할 수 있는 스레드는 하나 뿐이기 때문에 싱글 스레드라고 여겨진다.

서버로서의 노드

서버에서는 기본적으로 I/O요청이 빈번히 발생한다. 노드는 코드를 논 블로킹 방식으로 작성했다면 I/O작업을 논 블로킹 방식으로 처리하기 때문에 스레드 하나가 많은 수의 I/O를 감당할 수 있다.
하지만 우리가 작성하는 코드는 모두 스레드 하나에서 처리되기 때문에 CPU연산을 많이 요구하면 스레드 하나가 감당하기 어렵다.

때문에 개수는 많지만 크기는 작은 데이터를 실시간으로 주고받는 데 적합하다.
네트워크나 데이터베이스, 디스크 작업 같은 I/O에 특성화되어 있기 때문이다.

하지만 멀티스레딩 작업이 어렵고, 멀티 스레드 프로그래밍을 하더라도 C, C++, Rust, Go같은 언어에 비해 속도가 많이 느리다.

노드에는 웹 서버가 내장되어 있어 입문자가 쉽게 접근할 수 있다.

정리

장점

멀티 스레드 방식에 비해 적은 컴퓨터 자원 사용
I/O작업이 많은 서버로 적합
멀티 스레드 방식보다 쉬움
웹 서버가 내장되어 있음
자바스크립트(?)
JSON 형식과 쉽게 호환됨

단점

기본적으로 싱글스레드라서 CPU코어를 하나만 사용
CPU작업이 많은 서버로는 부적합
하나뿐인 스레드가 멈추지 않도록 관리가 필요함
서버 규모가 커졌을 때 관리가 어려움
어중간한 성능

사용하는 곳

NASA, 에어비엔비, 우버, 넷플릭스, 링크드인
페이팔, 월마트, 이베이와 같이 결제 시스템을 사용하는 대기업들도 노드로 서비스를 운영함.
국내에서는 네이버, 카카오, 위메프, 야놀자와 같은 기업들이 사용함.

프레임워크

노드 기반 웹 프레임워크로는 앵귤러, 리액트, 뷰 등이 있다.
앵귤러는 구글 진영에서 프런트엔드 앱을 만들 때 주로 사용한다.
리액트는 페이스북 진영에서 주로 사용한다.

profile
코린이

0개의 댓글