상세 컨텐츠

본문 제목

[Node.js] 1장 노드 시작하기

21-22/21-22 Node.js

by Kimpeep 2021. 10. 4. 14:00

본문

728x90

1. 노드의 핵심 개념

 

(1) 서버, 노드

  • 서버: 네트워크를 통해 클라이언트 요청에 응답하는 컴퓨터 또는 프로그램
  • 노드: 자바스크립트 런타임, 서버 애플리케이션을 실행하는 데 주로 사용됨
더보기

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

 

 

(2) 이벤트 기반(event-driven)

이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식 (ex. 이벤트 리스너에 콜백 함수 등록)

 

  • 이벤트 루프(event loop)

예시 코드

function run() {
	console.log(‘5초 후 실행’);
}
console.log(‘시작’);
setTimeout(run, 5000);   // 5초 후에 run 실행
console.log(‘끝’);

결과

더보기

시작

5초 후 실행

  • 이벤트 루프 : 이벤트 발생 시 호출할 콜백 함수를 관리하고 콜백 함수들의 실행 순서를 결정함. 노드가 종료될 때까지 이벤트 처리를 위한 작업을 반복.
  • 백그라운드 : 이벤트 리스너들이 대기하는 곳. 여러 작업이 동시 실행될 수 있음.
  • 태스크 큐 : 이벤트 발생 후 백그라운드에서 태스크 큐로 타이머나 이벤트 리스너의 콜백 함수를 전달.

출처: Node.js 교과서 개정2판(조현영 저) 20페이지

호출 스택에는 실행되는 모든 함수가 호출 스택에 담긴다. 그림 속 anonymous는 자바스크립트 코드가 시작될 때 들어갔다가 코드를 다 실행시키고 나면 스택에서 빠져나간다. 일단 호출 스택이기 때문에 FILO이고 새로운 함수가 위로 쌓인다.

console.log()와 같은 함수는 로그를 찍고 바로 빠져나가고, setTimeOut()과 같은 콜백 함수가 있는 함수들은 스택에 잠시 담겼다가 백그라운드로 콜백 함수와 타이머를 보내고 스택에서 빠져나간다. 

 

백그라운드로 이동한 타이머와 콜백함수는 타이머의 일정 시간이 흐르고 나면 콜백 함수만 태스크 큐로 이동한다.

run() 함수는 대기하고 있다가 호출 스택이 완전히 비면(anonymous까지 빠져나가면) 호출 스택으로 이동해 실행된다.

 

 

(3) 논 블로킹 I/O

  • 자바스크립트는 작업들이 동시 수행될 수 없지만 I/O 작업은 동시 수행 가능. 이때 논 블로킹 방식으로 처리.
  • I/O 작업: 파일 시스템 접근, 네트워크를 통한 요청
  • 논 블로킹: 이전 작업이 완료될 때까지 대기하지 않고 다음 작업 수행
  • 동시에 처리될 수 있는 작업을 최대한 묶어서 백그라운드로 넘기면 최대 효율!

출처 : Node.js 교과서 개정 2판(조현영 저) 22페이지

 

 

setTimeOut()을 이용한 논 블로킹 작업(setImmediate())

예시 코드

function Func1() {
	//오래 걸리는 작업
    console.log('작업 끝');
}

console.log('시작');
Func1();
console.log('다음 작업');

결과

더보기

시작

작업 끝

다음 작업

특별할 것 없이 절차적으로 실행되는 함수다. Func1()이 블로킹 방식의 I/O 작업을 수행한다고 가정했을 때 작업이 끝나기 전까지는 마지막 줄인 console.log('다음 작업'); 이 수행되지 않는다.


예시 코드

function Func1() {
	//오래 걸리는 작업
    console.log('작업 끝');
}

console.log('시작');
setTimeOut(Func1, 0);
console.log('다음 작업');

결과

더보기

시작

다음 작업

작업 끝

 

실제로 논 블로킹 작업을 수행하기 위해 setTimeOut() 함수사용하는 경우는 드물지만 예시로 들어봤다.

setTimeOut()은 호출 스택에서 사라지더라도 콜백 함수가 태스크 큐로 이동해서 순서대로 실행되지 않고 나중에 실행된다.

 

 

(4) 싱글 스레드

  • 프로세스와 스레드의 차이
프로세스 : 운영체제에서 할당하는 작업의 단위. 실행되고 있는 프로그램 하나라고 생각하면 됨. 프로세스끼리 자원 공유 안 함.
스레드 : 프로세스 내에서 실행되는 흐름의 단위. 프로세스는 스레드를 여러 개 생성해 여러 작업을 동시 처리 가능. 스레드 간 데이터 공유 가능.

 

  • 노드에서의 스레드
 실행 시에 프로세스 하나가 생성되고 그 프로세스는 코드에 따라 내부적으로 여러 개의 스레드를 생성할 수 있다. 그러나 노드에서는 직접 제어할 수 있는 스레드는 하나뿐이기 때문에 우리가 흔히 노드를 싱글 스레드라고 부른다.

 

  • 스레드 풀과 워커 스레드
스레드 풀(Thread Pool) : 노드가 특정 동작을 수행할 때 스스로 멀티 스레드 사용. ex) 암호화, 파일 입출력, 압축
워커 스레드(Worker Thread) : 노드 12 버전부터 멀티 스레드 사용이 가능하다.

 

 

멀티 스레딩 멀티 프로세싱
하나의 프로세스 안에서 여러 개의 스레드 사용 여러 개의 프로세스 사용
CPU 작업이 많을 때 사용 I/O 요청이 많을 때 사용

 


2. 서버로서의 노드

(1) 노드의 특징 == 싱글 스레드, 논 블로킹 모델의 특징 그대로!

  • 서버에서 많이 발생하는 I/O 처리를 잘함
  • 싱글 스레드이므로 CPU 부하가 큰 작업에 부적합

 

(2) 노드를 어디에 사용해야 하나?

  • 개수는 많고 크기는 작은 데이터를 실시간으로 주고받을 때
  • 실시간 채팅 애플리케이션, 주식 차트, JSON 데이터 제공하는 API 서버

3. 서버 외의 노드

  • 노드 기반의 웹 프레임워크 : 앵귤러(Angular), 리액트(React), 뷰(Vue), 리액트 네이티브

 

 

Corner Node.js

Editor PORO

728x90

관련글 더보기