상똥이의 Back-End 공부방

[Node.js] Node.js기초 본문

Node.JS

[Node.js] Node.js기초

상똥백 2024. 9. 3. 22:09

[1. Node의 작동방식]

1. 노드란?

- Node.js는 Chrome V8 Javascript 엔진으로 빌드된 자바스크립트 런타임(실행기)

 

2. 싱글스레드

- 프로세스에 스레드가 한 개 있는 것

- 프로세스: 운영체제에서 할당하는 작업의 단위. 프로세스간에는 자원 공유가 발생하지 않음

- 스레드: 브로세스 내에서 실행되는 흐름의 단위. 스레드는 부모 프로세스의 자원을 서로 공유함(같은 주소의 메모리에 접근 가능하므로)

- 노드는 싱글스레드가 아님. 프로세스에 여러 개의 스레드가 생성되지만, 제어할 수 있는 스레드가 한 개이기 때문에 싱글스레드처럼 보이는 것

- 효율적으로 코드를 작동시키기 위해 이벤트 루프와 논블로킹 방식을 사용함

 

3. 노드의 특성

- 이벤트 기반

- 논블로킹io

 

[2. 이벤트 기반]

1. 이벤트 기반 시스템

- 이벤트가 발생할 경우, 미리 지정한 작업을 수행하는 방식 (이벤트: 클릭, 네트워크 요청 등)

- 단계

   1. 이벤트 리스너에 이벤트 발생 시 수행할 콜백 함수를 등록

   2. 시스템에서 이벤트 발생

   3. 등록된 함수 호출

- 이벤트 루프: 이벤트 기반 시스템에서 다수의 이벤트가 동시에 발생할 경우 호출할 콜백함수의 순서를 결정하는 것 /. 노드가 종료될 때까지 이벤트 처리를 위한 작업을 반복함

- 백그라운드: 이벤트 리스너가 대기하는 곳, 여러 작업이 동시에 실행될 수 있음

- 태스크 큐: 이벤트 발생 후 이벤트 리스너에서 내보낸 콜백 함수들이 대기하는 곳

- 호출 스택: 호출된 콜백 함수들이 실행되는 곳

 

2. 코드가 실행되는 내부 과정

- 예시 코드

function run() {
	console.log('3초 후 실행');
}

console.log('시작');
setTimeout(run, 3000);
console.log('끝');

 

- 실행 과정

1) console.log('시작') 실행

   - 호출 스택에 console.log('시작')이 들어오며, 실행된 후 사라짐

 

2) setTimeout(run, 3000) 실행

   - 호출 스택에 setTimeout이 들어오고 실행되어 바로 사라짐 (3초 카운트 시작)

   - setTimeout이 실행됨에 따라 run이 3초 후에 실행될 수 있도록 run을 백그라운드로 이동시킴

 

 

3) console.log('끝') 실행

   - 3초가 카운트되는 동안

   - 호출 스택에 console.log('끝')이 들어오며, 실행된 후 사라짐

4) 3초 카운트 완료 시

   - 백그라운드의 run이 태스크 큐로 이동됨

   - 호출 스택이 비어있으므로 이벤트 루프가 태스크 큐의 콜백함수를 호출 스택으로 이동시킴

   - 호출 스택에서 run 실행 후 제거됨 (* 3초가 지나도 호출 스택이 비워져있지 않으면 호출 스택이 비워질때까지 실행되지 않음)

 

- 실행 결과

시작

3초 후 실행

 

[3. 논블로킹]

1. 논블로킹이란

- 이전 작업이 완료될 때까지 대기하지 않고 다음 작업을 수행하는 것

- 블로킹: 이전 작업이 끝나야 다음 작업을 수행하는 것

- 노드는 데이터 io작업을 논블로킹 방식으로 수행

- 다만, 동시에 수행될 수 있는 작업들이란 전제가 필요

- setTimeout은 코드를 논블로킹 처리 방식으로 만들어주기 위해 사용하는 기법

- 동시성과 다른 개념!! 동시성은 동시처리가 가능한 작업을 논블로킹 처리해야 얻을 수 있는 것

 

[4. 노드의 장단점과 활용]

1. 장점

- 멀티 스레드 방식에 비해 적은 컴퓨터 자원 사용

- 멀티 스레드 방식에 비해 프로그래밍 방식이 쉬움

- 논블로킹 방식을 사용하여 io작업이 많은 서버에 적합

- json이 자바스크립트 형식이기 때문에 json형식과 쉽게 호환됨

 

2. 단점

- 싱글 스레드 방식이므로 CPU 코어를 하나만 사용함

- 많은 CPU 작업을 필요로 하는 서버로는 부적합

- 스레드가 하나뿐이므로 멈추지 않도록 관리 필요

- 서버 규모가 커졌을 때 관리 어려움