
node
크롬 V8 엔진으로 빌드 된 자바스크립트 런타임 노드는 서버와 자바스크립트 엔진이 아니다. 런타임이다.
- 싱글 스레드
- 이벤트 기반 아키텍처
- 논 블로킹 I/O 모델
- 서버의 역할도 수행할 수 있는 자바스크립트 런타임
- 노드로 자바스크립트 언어로 작성된 서버를 실행
- 서버 실행을 위해 필요한 http/https/http2 모듈을 제공
- 내부는 내장 코어 라이브러리와 V8 그리고 libuv로 이루어져 있음
런타임이란
특정 언어로 작성된 프로그램을 실행할 수 있게 해주는 실행기(가상 머신) Node는 자바스크립트 실행기이다.
자바스크립트 | 언어 |
노드 | 런타임(실행기) |
엔진 | V8 |
노드 등장 전의 자바스크립트
브라우저가 HTML 파일을 읽으며 HTML 내부에 포함된 자바스크립트 코드를 읽어 실행했다. 이는 HTML 파일이 없으면 자바스크립트가 실행될 수 없다는 걸 의미한다. 즉 HTML에 종속돼있다고 표현할 수 있다.
노드 등장 후의 자바스크립트
노드가 등장함으로 자바스크립트는 브라우저와 HTML에 종속에서 해방되었다. 즉 노드를 통해 자바스크립트 코드를 실행시킬 수 있게 되었다.
브라우저와 HTML로부터 종속에서 해방된 이후
- 웹 브라우저뿐만 아니라 앱 제작도 가능
- 데스크톱 프로그램도 만들 수 있음
- 게임도 만들 수 있음
V8과 libuv
오픈 소스 자바스크립트 엔진이며 느린 자바스크립트의 실행 속도를 대폭 개선했다.
- 2008년 출시되어 2009년 노드 프로젝트가 시작됨
- 내부는 C와 C++로 이루어져 있음
- 이벤트 기반 작업과 논 블로킹 I/O 작업들은 libuv를 통해 구현됨

논 블로킹 I/O
작업 소요 시간이 많은 함수를 백그라운드로 보내 다음 코드가 먼저 실행되게 하고 나중에 소요 시간이 많은 함수를 실행
- 비동기 논블로킹 I/O는 동시에 개념이 아님
- 논 블로킹 I/O 방식에서는 일부 코드가 백그라운드에서 병렬로 실행
- 일부 코드란 I/O 작업(파일 시스템 접근과 네트워크 요청 압축 암호화 등)
- 일부 코드 외 나머지 코드는 동기 블로킹 방식으로 실행
- I/O 작업이 많을 경우 노드의 활용성이 극대화
프로세스와 스레드
프로세스 | 스레드 |
운영체제에서 할당하는 작업의 단위를 의미하며 프로세스 간 자원 공유 불가능 | 프로세스 내에서 실행되는 작업의 단위를 의미하며 부모 프로세스와 자원 공유 가능 |
노드에서의 프로스세와 스레드
노드 실행 시 여러 개의 스레드가 실행된다. 노드가 싱글 스레드라 불리는 이유는 개발자가 직접 제어할 수 있는 스레드가 하나이므로 싱글 스레드라고 불린다. 예를 들어 노드 실행 시 4개의 스레드가 생성된다면 직접 제어할 수 있는 스레드는 하나이고 나머지 3개의 스레드는 논 블로킹 I/O 작업을 동시에 실행할 준비를 하고 있다. 이는 논 블로킹I/O 작업이 발생되기 전까지 대기하는 상태를 의미하기도 한다.
싱글 스레드
스레드 하나가 주어진 일을 한 번에 하나만 처리할 수 있다. 스레드 하나는 CPU의 코어 하나를 잡아먹는다.
- 블로킹이 발생하는 경우 하나의 작업이 끝날 시점까지 나머지 작업이 대기
- 노드는 논 블로킹 모델을 채택하여 일부 코드(I/O)를 백그라운드(다른 프로세스)에서 실행 가능
- 여러 개의 요청을 먼저 받고 요청이 완료가 되는 순간 응답
- I/O 관련 작업이 아닌 경우 블로킹 싱글 스레드 기반으로 작동
멀티 스레드와 싱글 스레드
멀티 스레드 | 싱글 스레드 |
하나의 프로세스에서 여러 개의 스레드가 실행 컴퓨터 자원을 많이 사용하며 개발 난이도가 어려움 스레드가 여러 개이므로 하나의 스레드의 문제가 생겨도 다른 스레드로 대체 가능 | 하나의 프로세스에서 하나의 스레드가 실행 컴퓨터 자원을 적게 사용하며 멀티 스레드 방식에 비해 비교적 개발 난이도가 쉬움 스레드가 하나이므로 스레드가 죽으면 서비스 전체가 죽음 |
스레드 풀
CPU 연산이 많은 작업(파일 시스템 접근과 암호화 등)은 멀티 스레드 방식으로 작동
멀티 프로세싱
스레드가 하나인 노드의 단점을 극복하기 위해 멀티 프로세싱 방법을 사용할 수 있는데 여러 개의 스레드가 아닌 여러 개의 프로세스를 생성하는 방식이다. CPU 연산이 많은 경우 멀티 스레딩 방식을 사용하고 I/O 요청이 많을 경우 멀티 프로세싱 방식을 사용한다.
서버로서의 노드의 장단점
노드 서버의 장단점은 자바스크립트 언어의 장단점과 크게 다르지 않다. 자바스크립트 언어로 개발할 수 있으며 I/O 요청이 많을 경우 사용하면 적합하며 CPU 연산이 많은 작업의 경우 성능이 매우 느리고 CPU 연산이 많은 작업은 서버리스 기반의 서비스를 별도로 도입하여 운영할 수도 있다.
장점 | 단점 |
I/O 요청이 많을 경우 적합 | CPU 연산량이 많은 경우 부적합 |
싱글 스레드이므로 컴퓨터 자원을 적게 사용 | 싱글 스레드라 여러개의 CPU 코어 중 단 하나만 사용 |
멀티 스레드에 비해 개발 난이도 쉬움 | 스레드가 하나이므로 죽지않게 잘 관리해야함 |
자바스크립트 언어로 실행 가능 | 서비스 규모가 커질 시 관리 어려움 |
JSON 형식과 호환하기 쉬움 | 어중간한 성능 |
'서버 > Node' 카테고리의 다른 글
NodeJS xlsx Excel (0) | 2023.01.04 |
---|---|
NodeJS 작동 원리 (0) | 2022.07.25 |
NodeJS Crawling Puppeteer (0) | 2022.04.18 |
NodeJS axios cheerio xlsx (0) | 2022.04.18 |
NodeJS dotenv (0) | 2022.01.20 |