1. 노드란?
- Node.js는 크롬 V8 자바스크립트 엔진으로 빌드된 자바스크립트 런타임(=실행기)
=> Node.js가 있기때문에 자바스크립트는 HTML, CSS의 종속성으로부터 벗어난다.
- 자바스크립트로 만든 프로그램을 실행할 수 있게 해준다.
-런타임 : 특정 언어로 만든 프로그램들을 실행할 수 있게 해주는 가상머신의 상태
=> 다른 런타임으로는 웹브라우저가 있다.(크롬, 엣지, 사파리, 파이어폭스 등)
2. 노드의 내부 구조
1) V8 엔진 : 오픈 소스 자바스크립트 엔진(속도 문제를 개선)
2) libuv : 노드의 특성인 이벤트 기반, 논블로킹 I/O모델을 구현한 라이브러리(비동기 I/O)
3. 노드의 특성
1) 이벤트 기반 : 이벤트가 발생할 때 미리 지정해 둔 작업을 수행하는 방식
- 예시 : 클릭이벤트, 네트워크요청, 타이머 등
- 이벤트 리스너 : 이벤트 등록 함수
- 콜백함수 : 이벤트가 발생했을 때 실행될 함수
2) 논블로킹 I/O : 오래 걸리는 함수를 백그라운드로 보내서 다음 코드가 먼저 실행되게 하고, 나중에 오래 걸리는 함수를 실행
-노드는 블로킹이면서 동기, 논블로킹이면서 비동기 2가지가 있다.
* 블로킹(Blocking) : 자신의 작업을 진행하는 중에 다른 주체의 작업이 시작되면 자신의 작업을 멈추고 해당 작업이 끝나길 기다렸다가 다시 자신의 작업을 시작한다.
* 논 블로킹(Non-Blocking) : 다른 주체의 작업에 관련 없이 자신의 작업을 하는 것
-논블로킹이면서 비동기 : 논블로킹 방식 하에서 일부 코드는 백그라운드에서 병렬로 실행된다.
(* 일부코드는 I/O작업(파일시스템 접근, 네트워크 요청), 압축, 암호화)
-블로킹이면서 동기 : 나머지 코드는 순서대로 실행된다.
3) 프로세스 vs 스레드
- 프로세스 : 운영체제에서 할당하는 작업 단위(프로세스 간의 자원 공유 X) 예) 크롬브라우저
- 스레드 : 프로세스 내에서 실행되는 작업 단위(부모 프로세스 자원 공유 O) 예) 브라우저 내의 탭들
- 노드의 프로세서는 멀티 스레드이다!(노드 14버전부터 멀티 스레드 사용 가능하다.)
=> 단, 직접 다룰 수 있는 스레드는 하나이기 때문에 싱글스레드라고 표현한다.
=> 동작하지 않는 나머지 스레드들은 특정한 기준이 될 때까지 대기하고 있다.
=> 특정 기준을 만족하면 동시에 동작 가능하다.
4) 싱글스레드와 멀티스레드
싱글 스레드 모델 | 멀티 스레드 모델 |
- 에러를 처리하지 못하는 경우에 멈춘다. - 프로그래밍 난이도가 쉽다. - CPU, 메모리자원을 적게 사용한다. |
- 에러 발생 시 새로운 스레드를 생성하여 극복한다. - 새로운 스레드를 생성하거나, 놀고 있는 스레드 처리에 비용이 발생한다. - 프로그래밍 난이도가 어렵다. - 스레드 수만큼 자원을 많이 사용한다. |
4. 서버로서의 노드
1) 노드 서버의 장점과 단점
장점 | 단점 |
- 컴퓨터 자원을 적게 사용한다. - I/O 작업이 많은 서버로 적합한다. - 멀티스레드 방식보다 쉽다. - 웹서버 내장 - 자바스크립트 사용 - JSON 형식과 호환이 쉽다. |
- 싱글 스레드라서 CPU코어를 하나만 사용한다. - CPU 작업이 많은 서버로는 부적합하다. - 하나뿐인 스레드가 멈추지 않도록 관리해야한다. - 서버규모가 커지면 관리가 어렵다. - 어중간한 성능 |
=> CPU 작업을 위해 Aws Lambda, Google Cloud Functions 같은 별도의 서비스를 사용한다.
2) 자바스크립트 언어를 쓰는 프로그램
-웹 프레임워크 : Angular, React, Vue, Meteor
-모바일 앱 프레임워크 : ReactNative
-데스크탑 개발 도구 : Electron (Atom, Slack, VSCode, Discord)