본문 바로가기

Node.js

Node.js 의 정의

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)

728x90

'Node.js' 카테고리의 다른 글

비동기 : Promise  (0) 2023.06.28
class  (0) 2023.06.28
구조분해할당  (0) 2023.06.28
화살표함수  (0) 2023.06.28
호출스택  (0) 2023.06.28