1. 노드의 정의
1) 노드의 정의
Node.js는 크롬 V8 자바스크립트 엔진으로 빌드 된 자바스크립트 런타임(실행기)이다.
V8 자바스크립트 엔진으로 인해 html이나 브라우저의 종속성에서 벗어나 독립적으로 실행될 수 있다.
쉽게 설명하자면 노드는 자바스크립트 실행기(런타임)이다.
ex) java 개발환경과의 비교 : jre(런타임), jdk(node), java(javascript)
사람들이 많이 착각하는 부분 중 하나가 노드 자체를 서버라고 생각하지만 노드는 서버가 아니다.
노드는 서버의 역할도 수행할 수 있는 자바스크립트 런타임이며 자바스크립트로 작성된 서버를 실행할 수 있다.
또한 서버 실행을 위한 http/https/http2 모듈을 제공한다.
참고로 typescript 런타임은 deno이다(node와 그나마 대적 가능한 것이 deno)
2) 런타임
런타임이란 특정 언어로 만든 프로그램들을 실행할 수 있게 해주는 가상 머신(크롬의 V8엔진사용)의 상태를 의미한다.
- 노드 : 자바스크립트로 만든 프로그램들을 실행할 수 있게 해준다.
- 다른 런타임으로는 웹 브라우저(크롬, 엣지, 사파리, 파이어폭스 등)가 있다.
- 노드 이전에도 자바스크립트 런타임을 만들기 위해 많은 시도가 있었다.
But, 엔진속도 문제로 인해 실패하였고 성공한 케이스가 구글의 V8 자바스크립트 엔진이다.
노드는 간단한 싱글 스레드 비동기 모델이다.
3) 내부구조
⇒ 2008년 V8엔진 출시, 2009년 노드 프로젝트 시작
⇒ 노드는 V8과 libuv(리뷰비?)를 내부적으로 포함
- V8 엔진 : 오픈 소스 자바스크립트 엔진이며 속도문제를 개선하였다.
- libuv(리뷰비?) : 노드의 특성인 이벤트 기반, 논블로킹I/O 모델을 구현한 라이브러리
2. 노드의 특성
1) 이벤트 기반
⇒ 이벤트가 발생할 때 미리 지정해 둔 작업을 수행하는 방식이다.
- 이벤트의 예 : 클릭, 네트워크 요청, 타이머 등
- 이벤트 리스너 : 이벤트가 발생했을 때 그 처리를 담당하는 함수를 가르키며 이벤트 핸들러라고도 한다.
- 콜백 함수 : 이벤트가 발생 했을 때 실행 될 함수이다.
ex) step02. 이벤트 발생
시스템 ---------------------------------------------------> 이벤트 리스너 : step01. 이벤트 리스너에 콜백 함수를 등록
<--------------------------------------------------
step03. 등록된 콜백 함수를 호출
2) 논블로킹(비점유) I/O
⇒ 논 블로킹 : 오래 걸리는 함수를 백 그라운드로 보내 다음 코드가 먼저 실행되게 하고, 나중에
백 그라운드로 보낸 함수를 실행한다. (처리가 빠른 함수를 먼저 실행시킨다.)
- 논 블로킹 방식 하에서 일부 코드는 백 그라운드에서 병렬로 실행된다.
- 논 블로킹으로 실행되는 일부 코드 : I/O 작업(파일 시스템 접근, 네트워크 요청), 압축, 암호화 등
- 나머지 코드는 블로킹 방식으로 실행되며 I/O 작업이 많을 때 노드의 활용성이 극대화 된다.
3) 프로세스 vs 스레드
⇒ 프로세스와 스레드
- 프로세스 : 운영체제에서 할당하는 작업의 단위, 프로세스 간 자원을 공유하지 않는다.
- 스레드 : 프로세스 내에서 실행되는 작업의 단위, 부모 프로세스의 자원을 각각의 스레드가 공유한다.
노드는 14버전부터 멀티 스레드가 사용 가능해졌다.
⇒ 노드 프로세스는 멀티 스레드지만 직접 다룰 수 있는 스레드는 하나이기 때문에 싱글 스레드라고 표현한다.
다만 특정한 조건이 맞춰지면 여러 스레드가 동시에 수행된다.
⇒ 노드는 주로 멀티 스레드 대신 멀티 프로세스를 활용한다.
4) 싱글 스레드
⇒ 싱글 스레드는 주어진 일을 한번에 하나씩밖에 처리할 수 없는 것을 의미한다.
: 블로킹(점유)이 발생하는 경우 나머지 작업은 모두 대기해야 하므로 효율적이지 않다.
식당과 비교하자면 점원(스레드)이 한명이고 손님(일)이 여럿을 때 주문(요청)과 서빙(응답)은
모든 손님에게 동시에 이뤄지는 게 아니라 손님(일) 한 사람에게만 응대(블로킹) 가능하기 때문이다.
⇒ 노드는 논 블로킹(비점유) 모델을 채택하여 일부 코드(I/O)를 백 그라운드(다른 프로세스)에서 실행이 가능하다.
모든 손님들에게 주문(요청)을 일괄적으로 받고 조리가 끝나는 음식 순서대로 서빙(응답)한다.
But, I/O 관련 코드가 아닐 경우에는 싱글 스레드, 블로킹 모델과 동일하다.
5) 멀티 스레드 모델과의 비교
⇒ 싱글 스레드 모델은 에러를 처리하지 못하는 경우 멈춘다.
대신 프로그래밍 난이도가 낮고, CPU, 메모리 자원을 적게 사용한다.
⇒ 멀티 스레드 모델은 에러 발생 시 새로운 스레드를 생성하여 극복한다.
But, 프로그램의 난이도가 높고 신규 스레드 생성 및 놀고 있는 스레드로 인해
자원이 많이 필요하며 불필요한 자원낭비가 발생할 수 있다.
6) 노드 멀티 스레드의 활용
⇒ 노드14버전부터 멀티 스레드를 사용할 수 있도록 worker_threads 모듈을 도입했다.
- 멀티 프로세스 외의 멀티 스레드를 지원하나 싱글 스레드의 장점을 가진 노드에서는 크게 쓰일 일이 없다.
- 멀티 스레딩 : 하나의 프로세스에서 여러 개의 스레드를 사용, CPU 작업이 많을 때 사용, 프로그래밍 어려움
- 멀티 프로세싱 : 여러 개의 프로세스를 사용, I/O 요청이 많을 때 사용, 프로그래밍이 멀티스레드보다 상대적으로 쉽다.
3. 노드의 역할
1) 서버로서의 노드
⇒ 서버 : 네트워크를 통해 클라이언트에 정보나 서비스를 제공하는 컴퓨터 프로그램
⇒ 클라이언트 : 서버에 요청을 보내는 주체(브라우저, 데스크탑 프로그램, 모바일 앱, 다른 서버에 요청을 보내는 서버)
ex) 브라우저(클라이언트)가 네이버 웹 사이트(서버)에 접속
ex2) 핸드폰(클라이언트)가 앱 스토어(서버)에서 앱 다운로드
⇒ 노드 != 서버, but 노드는 서버를 구성할 수 있게 하는 모듈을 제공한다.
⇒ 노드 서버의 장점
- 멀티 스레드 방식에 비해 컴퓨터 자원을 적게 사용한다.
- I/O 작업이 많은 서버에 적합하다.
- 멀티 스레드 방식보다 쉽고 웹 서버가 내장되어 있다.
- 웹 언어 중 점유율이 가장 높은 javascript 언어를 사용하고 있고 json 형식과 호환하기가 쉽다.
⇒ 노드 서버의 단점
- 싱글 스레드라서 CPU코어를 하나만 사용하고 스레드가 하나뿐이라 멈추지 않도록 잘 관리해야 한다.
- CPU 작업이 많은 서버로는 부적합하다. 성능이 어중간하기 때문이다.
: node 언어의 특성을 모두 활용했을 때 언어의 한계가 다가오며 그때 성능이 부족할 경우 node를 다른 것으로 변경처리
- 서버의 규모가 커졌을 때 서버를 관리하기 어렵다.
⇒ 노드는 CPU 작업을 위해 AWS Lambda나 Google Cloud Functions 같은 별도 서비스를 사용한다.
⇒ 노드는 페이팔, 넷플릭스, 나사, 월마트, 링크드인, 우버 등에서 메인 또는 서브 서버로 사용되고 있다.
2) 서버 외의 노드
⇒ 노드는 자바스크립트 런타임이기 때문에 용도가 서버로만 한정되지 않는다.
⇒ 웹, 모바일 데스크탑 애플리케이션에도 사용된다.
- 노드 기반의 웹 프레임워크 : Angular, React, Vue, Meteor
- 노드 기반의 모바일 앱 프레임워크 : Electron(Atom, Slack VSCode, Discord 등 제작)
'BackEnd > Node' 카테고리의 다른 글
[노드교과서] 섹션 3. http 모듈로 서버 만들기. 섹션 4. 패키지 매니저 (0) | 2023.12.19 |
---|---|
[노드교과서] 섹션 2. 노드 기본 기능 익히기 (0) | 2023.12.17 |
[노드교과서] 프런트엔드 자바 스크립트 (0) | 2023.12.13 |
[노드교과서] 섹션 1. 알아두어야 할 자바스크립트 (0) | 2023.12.12 |
[노드교과서] 챕터0. Node.js 설치하기 (0) | 2023.12.01 |