서버/Node

NodeJS

realtrynna 2022. 7. 23. 19:55

 

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