본문으로 건너뛰기

part0

제로초의 Node.js 교과서 섹션 0 요약

1.1 노드의 정의

  • 노드는 크롬 브라우저에 내장된 V8 자바스크립트 엔진으로 만들어진 **자바스크립트 런타임(실행 환경)**이다.
    • 그럼 자바스크립트 엔진은 무엇인가? -> 자바스크립트 코드를 실행하는 프로그램, 또는 인터프리터를 말한다. 출처: 위키백과
  • 그럼 노드는 서버가 아닌가?
    • 그렇다. 서버의 역할도 수행할 수 있는 것이지 그 자체로 서버는 아니다.
    • 서버의 역할을 수행하기위해 필요한 http/https/http2 모듈을 제공한다.
  • 내부 구조는 어떻게 돼있나?
    • 노드는 내부적으로 자바스크립트를 실행하기 위한 V8 엔진과 이벤트 기반, 비동기 I/O 모델을 제공하기 위한 libuv라는 라이브러리를 포함하고 있다.
    • V8은 C++로, libuv는 C로 짜여있어서 속도가 매우 빠르다.

1.2 노드의 특성

  • 이벤트 기반이란?

    • 프로그램의 실행 흐름이 이벤트에 의해 주도되는 것. 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식이라 할 수 있다.

    • 이벤트 예시 : click, keyup, keydown, scroll, http request, timer 등

    • 이벤트 리스너: 해당 DOM에 대해 이벤트 발생 여부를 탐지하는 객체. (mdn에서는 수신기라고 번역되어있던데, 나는 탐지기가 조금 더 와닿았다.)

    • 콜백 함수 : 이벤트가 발생했을 때 해당 리스너에 의해 실행될 함수. (여담이지만 콜백 함수라는 이름은 다음 표현에서 따온게 아닐까 싶다. 뇌피셜이다. 아님 말고...)

      If you listen this message, please call back for me.

    • 사용자와 상호작용이 많은 대부분의 웹 또는 앱은 이벤트 기반으로 만들어져있다. 이것이 인간의 직관과 밀접해있기 때문이다. (사람은 버튼을 누르면 어떤 변화가 생길 것임을 예상하고 있다. 예를 들면, 모달 창의 "X"를 누르면 창이 닫힐 것임을 알고 있다.)

    • 그런데 모든 이벤트 기반의 프로그램이 인간의 직관과 밀접해있지는 않다. 웹 브라우저 입장에서 받아들이는 모든 이벤트를 해당 브라우저의 사용자가 모두 인지하지는 못한다.

  • 논 블로킹 I/O 란?

    • 처리에 오랜 시간이 걸리는 작업을 백그라운드로 보내서 다음 작업이 먼저 처리되도록 하는 방식. (전체 작업의 처리 시간은 동일하나, 평균 작업별 처리 시간은 감소)
    • 이 때 일부 작업은 백그라운드에서 병렬적으로 실행될 수 있음.
      • 일부 작업 : I/O(파일 시스템, 네트워크 요청 등), 압축, 암호화
    • 나머지 코드는 블로킹 방식(순서대로)으로 실행.
    • 논블로킹 -> 코드가 순서대로 실행되지 "않을 수도" 있다.
    • 블로킹 -> 코드가 순서대로 실행된다.
  • 프로세스 vs 스레드

    • 프로세스는 OS에서 할당하는 작업 단위, 쉽게 말하면 프로그램.
    • 스레드는 프로세스 내에서 실행되는 작업 단위, 쉽게 말하면 프로세스의 목적 달성을 위한 작은 TODO들
    • 노드 프로세스는 멀티 스레드이지만, 직접 다룰 수 있는 스레드는 하나이기 때문에 싱글 스레드라고 표현됨. (진짜 멀티 스레드 프로세스는 다수의 스레드가 병렬적으로 실행됨.)
    • 노드는 주로 멀티 스레드 대신 멀티 프로세스를 활용
    • 노드 14 버전부터 멀티 스레드 직접 활용 가능
    • 크롬의 경우, 한 개의 탭 -> 한 개의 프로세스로 할당
  • 싱글 스레드 (블로킹 모델)

    • 싱글 스레드는 작업을 한 번에 하나씩 처리 (일할 직원이 한 명 밖에 없다!!)
      • 블로킹(처리가 오래 걸리는 작업이 다른 자잘한 작업의 실행을 지연시키고 있는 경우)이 발생하면 큰 비효율성이 발생
      • 에러를 처리하지 못하면 프로세스 종료
      • 대신 프로그래밍이 쉽고, CPU, 메모리 등의 자원을 적게 소모
  • 멀티 스레드 (논 블로킹 모델)

    • 장점
      • 멀티 스레드는 여러 작업을 동시에 처리 (일할 직원이 많으니 작업 처리량 굿)
      • 에러 발생 시 새로운 스레드를 생성
    • 단점
      • 새로운 스레드 생성, 이미 생성된 스레드 유지에 비용 발생
      • 프로그래밍 난이도 어려움
      • 스레드 수만큼 자원을 많이 사용
  • 노드의 싱글 스레드

    • 논 블로킹 모델을 일부 채택
    • 일부 코드(I/O 관련)를 백그라운드(다른 프로세스)에서 실행 가능
    • 요청을 먼저 받고, 완료 될 때 응답
    • I/O 관련 코드가 아닌 경우는 싱글 스레드 모델의 특성 적용
  • 멀티 스레드의 활용

    • 노드 14 버전에 멀티 스레드를 활용할 수 있도록 worker_threads 모듈 도입
    • CPU를 많이 사용하는 작업인 경우에 효율적 (암호화, 이미지 리사이징, 알고리즘 처리 관련 작업 등)
    • 실무에서는 그닥 활용할 기회가 없을 것
    • 기회가 생기면 배우자

1.3 노드의 역할

  • 서버로서의 노드

    • 서버 : 네트워크를 통해 정보를 제공하는 컴퓨터 또는 프로그램 ("받아.")
    • 클라이언트 : 서버에게 정보를 요청하는 주체 ("줘.")
    • 앞서 말했듯 노드는 서버가 될 수 있는 것이지 그 자체로 서버가 아니다!
    • 서버를 구성할 수 있게 해주는 모듈을 제공
    • 노드 서버의 장단점
      • 장점
        • 멀티 스레드 방식의 서버에 비해 자원을 적게 소모, 프로그래밍 쉬움
        • I/O 작업이 많은 경우 효율성 증대
        • 웹 서버 내장
        • 자바스크립트 사용
        • JSON Type 데이터와 호환성 좋음
      • 단점
        • 싱글 스레드라서 CPU 코어를 하나만 사용, 이 스레드가 멈추지 않도록 관리 필요
        • CPU 활용이 많은 작업이 많은 경우는 서버로서 부적합
        • 서버 규모가 커졌을 때 유지 보수 어려움
        • 성능이 어중간
  • 서버 외의 노드

    • 자바스크립트 런타임이기 때문에, 자바스크립트가 활용되는 모든 도메인에서 활용 가능
    • Ex:
      • 웹 : SPA 3대장(RVA), Meteor
        • Meteor는 처음 들어봐서 살짝 찾아보니, Full-JS, Full-Stack 웹 개발 프레임워크라고 한다. 스벨트랑 포지셔닝이 비슷한 것 같은데 왜 못 들어봤지...?
      • 모바일 : RN
      • 데스크탑 : Electron, Ionic