본문 바로가기
Node.js

[Backend] Node.js란?

by Hangii 2023. 1. 6.

공식 홈페이지의 설명

  • Node.js는 크롬 V8 자바스크립트 엔진으로 빌드된 자바스크립트 런타임이다.
  • 노드 == 서버인가?
    • 서버의 역할도 수행할 수 있는 "런타임"이다.
    • 노드는 자바스크립트(언어)로 작성한 코드를 실행해 서버를 만드는 역할을 한다.
    • 서버 실행을 위해 필요한 http/https/http2 모듈을 제공한다.

노드는 자바스크립트의 런타임이다.

  • 런타임: 특정 언어로 만든 프로그램을 실행할 수 있게 해주는 가상 머신의 상태
  • 노드는 자바스크립트로 만든 프로그램(서버이든 게임이든..)을 실행할 수 있게 해줌
  • 다른 런타임으로는 웹 브라우저(크롬, 엣지, 사파리, 파이어폭스 등)가 있음
  • 노드 이전에도 자바스크립트 런타임을 만들기 위한 많은 시도가 있었으나, 엔진 속도 문제로 실패함
  • 노드는 single thread 비동기 모델이다. 따라서 간단한 코드로 빠른 성능을 이끌어낼 수 있다.

이벤트 기반

  • 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식
  • 이벤트: 클릭, 네트워크 요청, 타이머 등 어떤 동작을 했을 때 다른 동작이 일어나는 것
  • 이벤트 리스너: 이벤트를 등록하는 함수
  • 콜백 함수: 이벤트가 발생했을 때 실행될 함수

논블로킹 I/O

  • 논 블로킹: 오래 걸리는 함수를 백그라운드로 보내서 다음 코드가 먼저 실행되게 하고, 나중에 오래 걸리는 함수를 실행하는 방식
    • 논 블로킹 방식 하에서 일부 코드는 백그라운드에서 병렬로 실행됨
    • 일부 코드: I/O 작업(파일 시스템 접근, 네트워크 요청), 압축, 암호화 등
    • 나머지 코드는 블로킹 방식으로 실행됨
    • 따라서 I/O 작업이 많을 때 노드 활용성이 극대화된다.
  • 노드는 대부분 동기면서 블로킹, 비동기이면서 논블로킹이다. 동기이면 코드가 순서대로 실행되고, 비동기이면 순서대로 실행되지 않을 수도 있다. 물론 논블로킹이라고 코드가 랜덤하게 실행되는 것은 아니다. 실행 context와 이벤트 loop를 알면 논블로킹일 때도 코드가 어떻게 돌아가는지 알 수 있다.

프로세스 vs. 스레드

  • 프로세스: 운영체제에서 할당하는 작업의 단위, 프로세스 간 자원 공유 X
  • 스레드: 프로세스 내에서 실행되는 작업의 단위, 부모 프로세스 자원 공유 O
  • 기본적으로 사용자가 프로그램을 하나 띄울 때마다 프로세스가 하나 생성된다. (여러 개 뜨는 경우도 있음) 하나의 프로세스 내에서 여러 개의 스레드를 생성해 마치 독립적인 여러 개의 프로그램을 실행하는 듯한 효과를 볼 수 있다.
  • 노드는 사실 멀티 스레드이다.
    • 아까는 싱글 스레드라면서 뭔 개소리냐고?
    • 싱글 스레드(single thread)라는 것은, 하나의 프로세스 내에 하나의 프로그램만을 띄울 수 있다는 뜻이다.
    • 직접 노드를 실행해 작업 관리자(ctrl+shift+esc)로 스레드의 개수를 확인해보면 프로세스 안에 스레드가 여러 개 뜨는 것을 확인할 수 있다. 프로그래머는 그 중 하나만을 컨트롤할 수 있다. 나머지 스레드는 코드를 동시에 돌릴 준비를 하고 있다. 특정한 조건이 만족되면, 나머지 스레드들을 이용해서 코드를 동시에 돌리게 된다.
    • 노드는 멀티 스레드이지만 직접 다룰 수 있는 스레드는 하나이기 때문에 싱글 스레드라고 표현한다.
    • 노드는 주로 멀티 스레드 대신 멀티 프로세스를 사용한다.
  • 노드 14버전부터는 원한다면 멀티 스레드를 사용할 수 있게 되었다. (동시에 여러 가지 작업을 진행할 수 있어서 좋을 수도 있다. 예를 들어, 인스타그램, 트위터, 페이스북 탭을 모두 켜뒀을 때, 싱글 스레드라면 인스타그램 알람을 확인할 동안 트위터나 페이스북의 알람은 확인할 수 없게 된다. 다른 탭의 알람을 확인하고 싶다면 인스타그램을 끄고 페이스북을 켜야 한다. 반면에 멀티 스레드의 경우 모든 탭을 띄워두고 switching만 해주면 된다.)
  • 멀티 스레딩의 단점은 코딩이 너무 어렵다는 것이다. 그래서 노드는 초반에 싱글 스레딩 방식을 선택했고, 이후 멀티 스레딩이 가능하도록 허용은 하게 되었다. 

싱글 스레드

  • 스레드 하나는 CPU의 코어 하나를 잡아먹는다. 따라서 32 코어짜리 (매우 좋은..) CPU를 사더라도 싱글 스레드 프로세스를 실행하면 하나의 코어만 열일하고 나머지 31개의 코어는 놀고 있는 비효율적인 상황이 발생한다. 
  • 그치만 멀티 스레드는 코어를 많이 사용하고, 프로그래머가 코딩하기 어렵다. 
  • 따라서 노드는 이 두 방법을 절충한 방식을 사용한다. 실행해야 할 코드가 고객이고 코어가 점원이라면, 점원은 한 명만 사용하는 대신에 고객들의 주문을 미리 받아 주방에 올려두고, 원하는 프로세스가 완료되었을 때 고객에서 응답한다. 이를 논 블로킹 모델이라고 부른다. 
  • 논 블로킹 모델을 채택하여 일부 코드(I/O)를 백그라운드(다른 프로세스)에서 실행한다.
    • 요청을 먼저 받고, 완료될 때 응답하는 방식
    • I/O 관련 코드가 아닌 경우, 싱글 스레드 & 블로킹 모델과 같아진다.

  • 물론 이 방식도 한번에 너무 많은 주문이 몰려서 점원이나 주방장이 죽으면(..) 서비스가 망가지는 단점을 가지고 있다.따라서 이 단점을 극복하기 위해 체인점을 많이 생성하고 고객들을 각 체인점에 잘 분배하는 방식인 멀티 프로세싱을 선택한다. 

멀티 스레드 모델과의 비교

  • 노드에도 멀티 스레딩 기능이 있지만 이것이 절대 주력이 아님을 기억해야 한다. 멀티 스레딩이 없어서 아쉬웠던 것을 보완하기 위해 만든 것이지 노드는 대부분 싱글 스레드로 사용된다. 
  • 싱글 스레드 모델은 에러를 처리하지 못하는 경우 멈춘다.
    • 대신 프로그래밍 난이도가 낮고, CPU와 메모리 자원을 적게 사용한다.
  • 멀티 스레드 모델은 에러 발생 시 새로운 스레드를 생성하여 극복한다.
    • 단, 새로운 스레드 생성이나 놀고 있는 스레드 처리에 비용이 발생한다.
    • 프로그래밍 난이도가 높다.
    • 스레드의 수만큼 자원(코어)을 많이 사용한다.

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

비구조화 할당  (0) 2023.01.26
화살표 함수  (0) 2023.01.25
템플릿 문자열, 객체 리터럴  (0) 2023.01.24
var, const, let  (0) 2023.01.24
[Backend] 서버로서의 노드  (0) 2023.01.06

댓글