* 노드의 정의
Node.js는 크롬 V8 자바스크립트 엔진으로 빌드된 자바스크립트 런타임이다.
여기서 런타임이란 특정언어로 만든 프로그램들을 실행할 수 있게 해주는 가상머신의 상태이다.
즉, 노드는 자바스크립트로 만든 프로그램들을 실행할 수 있게 해 준다.
노드는 V8과 libuv를 내부에 포함하고 있다.
- V8 엔진: 오픈소스 자바스크립트 엔진
- libuv: 노드의 특성인 이벤트 기반 및 논블로킹 I/O 모델을 구현한 라이브러리
* 노드의 특성
1. 이벤트 기반 동작
노드는 이벤트가 발생할 때 미리 지정해 둔 작업을 수행하는 방식을 사용한다.
- 이벤트 리스너: 이벤트를 등록하는 함수
- 콜백 함수: 이벤트 발생 시 실행될 함수
function run() {
console.log('3초 후 실행');
}
console.log('시작');
setTimeout(run, 3000);
console.log('끝');
/* 출력 */
시작
끝
3초 후 실행
위 코드 동작 방식
1. 호출 스택에 함수가 쌓여있다.
2. 콜백함수 run은 백그라운드로 가서 타이머 3초 대기 후
3. 태스크 큐로 가서 대기 후
4. 호출 스택 비워지면 올라감
5. 호출 스택에서 실행 후 비워지면
6. 이벤트 루프는 태스크 큐 콜백이 들어올 때까지 대기
- 이벤트 루프: 이벤트 발생 시 호출할 콜백함수 관리, 콜백함수의 실행 순서 결정(노드 종료까지 반복 작업)
- 태스크 큐(콜백 큐): 콜백 함수들을 기다리는 공간, 콜백들은 이벤트 루프가 정한 순서대로 대기
- 백그라운드: 타이머, I/O 작업 콜백, 이벤트리스너들이 대기하는 곳
2. 논블로킹 I/O
오래 걸리는 함수를 백그라운드로 보내서 다음 코드가 먼저 실행되게 한다.
논블로킹 방식(비동기식) 하에서 일부 작업은 백그라운드에서 병렬로 실행되고, 나머지는 블로킹 방식으로 실행된다.
여기서 일부작업은 네트워크 I/O(네트워크 연결/닫기, HTTP 요청 및 응답), 파일 I/O(파일 읽기/쓰기), 프로세스 및 시스템 작업을 말한다.
3. 싱글스레드
일부작업에서 논블로킹 방식을 사용하지만, 직접 처리할 수 있는 스레드(프로세스 내에서 실행되는 작업의 단위)는 하나이기 때문에 싱글스레드라고 표현한다.
블로킹이 발생하는 경우 나머지 작업은 모두 대기해야 하기 때문에 비효율적이다.
대신 위에서 말한 논블로킹 모델을 채택하여 일부 작업(I/O 관련 코드)을 백그라운드(다른 프로세스)에서 실행 가능하다.
즉, I/O 관련 코드가 아닌 경우 싱글 스레드(블로킹 모델)이다.
싱글스레드 모델은 메모리 자원을 적게 사용하지만, 에러를 처리하지 못하는 경우 멈추게 된다.
멀티스레드 모델은 에러 발생 시 새로운 스레드를 생성하여 극복할 수 있지만, 새로운 스레드 생성이나 놀고 있는 스레드 처리에 비용이 발생하고 자원을 많이 사용한다.
* 노드의 역할
1. 서버 역할
서버는 네트워크를 통해 클라이언트에 서비스를 제공하는 컴퓨터 또는 프로그램을 말한다.
노드는 서버가 아닌, 서버를 구성할 수 있게 하는 모듈을 제공한다.
노드 서버의 장단점은 아래와 같다.
장점 | 단점 |
멀티스레드 방식에 비해 컴퓨터 자원을 적게 사용 | 싱글스레드이기에 CPU 코어를 하나만 사용 |
I/O 작업이 많은 서버로 적합 | CPU 작업이 많은 서버로 부적합 |
웹서버가 내장되어 있음 | 서버 규모가 커졌을 때 서버 관리에 어려움 |
멀티스레드 방식보다 쉬움 | 하나뿐인 스레드가 멈추지 않도록 관리해야 함 |
JSON 형식과 호환이 쉬움 |
2. 서버 외 역할
노드는 자바스크립트 런타임이기 때문에 용도가 서버에만 한정되지 않는다.
웹, 모바일, 데스크톱 애플리케이션에도 사용된다.
- 웹 프레임워크: React, Vue, Angular 등
- 모바일 앱 프레임워크: React Native, NativeScript 등
- 데스크톱 개발 도구: Electron(Atom, Slack, VSCode, Discord 등)
성결대학교 정보통신공학과 웹서버프로그래밍 강의(2024)
본 게시물은 위 강의 및 교재를 기반으로 정리한 글입니다.
'전공수업 > Node.js' 카테고리의 다른 글
[Node.js] REPL, JS 파일 실행, 모듈화, 내장 모듈(os, path) (1) | 2024.04.21 |
---|---|
[Node.js] 내장 객체 (0) | 2024.04.21 |
[JavaScript] 기본 문법 #3 - 변수 선언, 템플릿 문자열, 객체 리터럴 (0) | 2024.03.28 |
[JavaScript] 기본 문법 #2 - 스코프, 함수, 객체 (0) | 2024.03.21 |
[JavaScript] 기본 문법 - 증감연산자, 배열, 반복문 (0) | 2024.03.20 |
댓글