본문 바로가기

노드 공부

2021.07.21 / 1장

1.1 핵심 개념 이해하기

노드(공식 사이트) : Node.js는 Chrome V8 Javascript 엔진으로 빌드된 Javascript 런타임입니다.

1.1.1 서버

서버 : 네트워크를 통해 클라이언트에 정보나 서비스를 제공하는 컴퓨터 또는 프로그램이다.

클라이언트 : 요청을 보내는 주체로 브라우저일 수도 있고, 데스크톱 프로그램일 수도 있고, 모바일 앱일 수도 있고, 다른 서버에 요청을 보내는 서버일 수도 있다.

 

1.1.2 자바스크립트 런타임

노드는 자바스크립트 런타임이다.

런타임 : 특정 언어로 만든 프로그램들을 실행할 수 있는 환경을 뜻한다.

따라서 노드는 자바스크립트 프로그램을 컴퓨터에서 실행할 수 있다.

 

1.1.3 이벤트 기반

이벤트 기반(event-driven) : 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식을 의미한다.

이벤트로는 클릭이나 네트워크 요청 등이 있다.

이벤트 리스너(event listener)에 콜백(callback) 함수를 등록한다 : 이벤트 기반 시스템에서 특정 이벤트가 발생할 때 무엇을 할지 미리 등록해두는 것이다.

이벤트가 발생하면 이벤트 리스너에 등록해둔 콜백함수를 호출한다. 발생한 이벤트가 없거나 발생했던 이벤트를 다 처리하면, 노드는 다음 이벤트가 발생할 때까지 대기한다.

 

 

노드는 자바스크립트 코드의 맨 위부터 한 줄씩 실행한다. 함수 호출 부분을 발견했다면 호출한 함수를 호출 스택에 넣는다. 

 

function first(){
	second();
    console.log('첫번째');
}
function second(){
	third();
    console.log('두번째');
}
function third(){
	console.log('세번째');
}
first();

콘솔 출력결과

세번째

두번째

첫번째

 

first 함수가 제일 먼저 호출되고, 그 안의 second 함수가 호출된 뒤, 마지막으로  third 함수가 호출된다. 실행은 호출된 순서와 반대로 실행이 완료된다.

 

function run(){
	console.log('3초 후 실행');
}
console.log('시작');
setTimeout(run,3000);
console.log('끝');

 

콘솔 출력결과

시작

3초 후 실행

 

이벤트 루프 : 이벤트 발생 시 호출할 콜백 함수들을 관리하고, 호출된 콜백 함수의 실행 순서를 결정하는 역할을 담당한다. 노드가 종료될 때까지 이벤트 처리를 위한 작업을 반복하므로 루프라고 부른다. 여러 이벤트가 동시에 발생했을 때 어떤 순서로 콜백 함수를 호출할지 판단한다. 

백그라운드 : setTimeout 같은 타이머나 이벤트 리스너들이 대기하는 곳이다. 자바스크립트가 아닌 다른 언어로 작성된 프로그램이라고 봐도 된다. 여러 작업이 동시에 실행될 수 있다.

태스크 큐 : 이벤트 발생 후, 백그라운드에서는 태스크 큐로 타이머나 이벤트 리스너의 콜백 함수를 보낸다. 정해진 순서대로 콜백들이 줄을 서 있으므로 콜백 큐라고도 부른다. 콜백들을 보통 완료된 순서대로 줄을 서 있지만 특정한 경우에는 순서가 바뀌기도 한다.

 

코드가 실행되는 내부 과정를 묘사한 그림

 

먼저 전역 컨텍스트인 anonymout가 호출 스택에 들어간다. 그 뒤 setTimeout이 호출 스택에 들어간다. 호출 스택에 들어간 순서와 반대로 실행되므로 setTimeout이 먼저 실행된다. setTimeout이 실행되면 타이머와 함께 run 콜백을 백그라운드로 보내고, setTimeout은 호출 스택에서 빠진다. 그다음으로 anonymous가 호출 스택에서 빠진다. 백그라운드에서는 3초를 센 후 run 함수를 태스크 큐로 보낸다. 3초를 센다는 것은 백그라운드에 맡겨진 작업이 완료된 것으로 이해해도 된다.

 

그림에서는 태스크 큐가 하나의 큐처럼 보이지만 실제로는 여러 개의 큐로 이루어져 있다. 이벤트 루프는 정해진 규칙에 따라 콜백 함수들을 호출 스택으로 부른다.

만약 호출 스택에 함수들이 너무 많이 들어있으면 3초가 지난 후에도 run 함수가 실행되지 않을 수도 있다. 이벤트 루프는 호출 스택이 비어있을 때만 태스크 큐에 있는 run 함수를 호출 스택으로 가져오기 때문이다. 이 점이 setTimeout의 시간이 정확하지 않을 수도 있는 이유이다.

 

1.1.4 논 블로킹 I/O 

이벤트 루프를 잘 활용하면 오래 걸리는 작업을 효율적으로 처리할 수 있다. 

작업은 동시에 실행될 수 있는 작업과 동시에 실행될 수 없는 작업으로 나누어진다. 기본적으로 자바스크립트 코드는 동시에 실행될 수 없다. 하지만 I/O 작업 같은 것은 동시에 처리될 수 있다.

I/O는 입력/출력을 의미한다. 파일 시스템 접근(파일 읽기, 파일 쓰기, 폴더 만들기 등)이나 네트워크를 통한 요청 같은 작업이 I/O의 일종이다. 노드는 이런 작업을 할 때 논 블로킹 방식으로 처리한다.

논 블로킹 : 이전 작업이 완료될 때까지 대기하지 않고 다음 작업을 수행한다.

블로킹 : 이전 작업이 끝나야만 다음 작업을 수행한다.

 

블로킹 방식보다 논 블로킹 방식이 같은 작업을 더 짧은 시간에 처리한다.

 

노드는 I/O 작업을 백그라운드로 넘겨 동시에 처리한다. 따라서 동시에 처리될 수 있는 작업들은 최대한 묶어서 백그라운드로 넘기면 시간을 절약할 수 있다.

 

동시 처리로 얻는 시간적 이득

 

case 1과 같은 순서대로 작업하면 5초 정도가 소요된다. 같은 양의 작업을 case 2처럼 순서만 바꾸면 3초 정도로 작업 시간이 단축된다. 

동시에 처리할 수 있는 I/O 작업이라도 논 블로킹 방식으로 코딩하지 않으면 의미가 퇴색된다.

 

 

블로킹 방식의 코드

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

 

콘솔 출력결과

시작

작업 끝

다음 작업

 

 

setTimeout을 사용한 코드

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

 

콘솔 출력결과

시작

다음작업

작업 끝

 

setTimeout(콜백, 0)은 코드를 논 블로킹으로 만들기 위해 사용하는 기법 중 하나. 

setTimeout(콜백, 0) : 밀리초를 0으로 설정했으므로 바로 실행되는 것으로 착각할 수 있다. 하지만 브라우저와 노드에서는 기본적인 지연 시간이 있으므로 바로 실행되지 않는다.

 

1.1.5 싱글 스레드

싱글 스레드 : 스레드가 하나뿐이다.

프로세스 : 운영체제에서 할당하는 작업의 단위이다. 노드나 웹 브라우저 같은 프로그램은 개별적인 프로세스이다. 프로세스 간에는 메모리 등의 자원을 공유하지 않는다.

스레드 : 프로세스 내에서 실행되는 흐름의 단위이다. 프로세스는 스레드를 여러 개 생성해 여러 작업을 동시에 처리할 수 있다. 스레드들은 부모 프로세스의 자원을 공유한다. 같은 주소의 메모리에 접근 가능하므로 데이터를 공유할 수 있다.

노드는 싱글 스레드로 동작하지는 않는다. 프로세스 내에서 스레드를 생성하는데, 이때 우리가 제어할 수 있는 스레드가 하나뿐이다.

 

멀티 스레딩 멀티 프로세싱
하나의 프로세스 안에서 여러 개의 스레드 사용 여러 개의 프로세스 사용
CPU 작업이 많을 때 사용 I/O 요청이 많을 때 사용
프로그래밍이 어려움 프로그래밍이 비교적 쉬움

 

I/O 작업을 처리할 때는 멀티 스레딩보다 멀티 프로세싱이 효율적이므로 노드는 멀티 프로세싱을 많이 한다.

 

1.2 서버로서의 노드

노드는 기본적으로 싱글 스레드, 논 블로킹 모델을 사용하므로, 노드 서버 또한 동일한 모델이다. 따라서 노드 서버의 장단점은 싱글 스레드, 논 블로킹 모델의 장단점과 크게 다르지 않다.

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

노드의 장점은 언어로 자바스크립트를 사용한다는 것이다. 웹 브라우저도 자바스크립트를 사용하므로 서버까지 노드를 사용하면 하나의 언어로 웹 사이트를 개발할 수 있다.

 

 

노드의 장단점

장점 단점
멀티 스레드 방식에 비해 적은 컴퓨터 자원 사용 기본적으로 싱글 스레드라서 CPU 코어를 하나만 사용
I/O 작업이 많은 서버로 적합 CPU 작업이 많은 서버로는 부적합
멀티 스레드 방식보다 쉬움 하나뿐인 스레드가 멈추지 않도록 관리가 필요함
웹 서버가 내장되어 있음 서버 규모가 커졌을 때 서버를 관리하기 어려움
자바스크립트를 사용함 어중간한 성능
JSON 형식과 쉽게 호환됨  

 

1.3 서버 외의 노드

노드는 자바스크립트 런타임이므로 용도가 서버에만 한정되지 않는다. 사용 범위가 점점 늘어나서 노드는 웹, 모바일, 데스크톱 애플리케이션 개발에도 사용되기 시작했다.

 

 

 

출처 : Node.js 교과서 개정2판

 

'노드 공부' 카테고리의 다른 글

2021.07.24 / 2.2장  (0) 2021.07.24
2017.07.23 / 2.1장  (0) 2021.07.23