Node.js 핵심 개념과 장단점 정리

컴클로딩·2022년 6월 7일
2

Nodejs-TIL

목록 보기
3/3
post-thumbnail

Intro


진행중인 SFS 프로젝트에서도 Node.js를 사용하고 Node.js관련 면접 준비할 겸 [Node.js 교과서]로 공부한 내용을 정리하고자 한다. 추후에는 [Node.js 디자인 패턴]로 공부한 내용도 추가할 것이다.

1장 노드 시작하기


1.1 핵심 개념 이해

Node.js크롬 V8 자바스크립트 엔진으로 빌드된 자바스크립트 런타임입니다. Node.js는 이벤트 기반, 논블로킹 I/O모델을 사용해 가볍고 효율적입니다. Node.js의 패키지 생태계인 npm은 세계에서 가장 큰 오픈 소스 라이브러리 생태계이기도 합니다.

  • Javascript Runtime
  • 이벤트 기반
  • 논블로킹 I/O 모델
  • (추가적) 싱글쓰레드

1. 자바스크립트 런타임

  • V8 : C++로 작성된 구글의 고성능 자바스크립트 및 웹어셈블리 엔진이다.(출처 : V8 공식홈페이지)
  • 런타임(Runtime) : 컴퓨터 과학에서 컴퓨터 프로그램이 실행되고 있는 동안의 동작을 말한다.(출처 : 위키백과)
  • Node js = V8 + libuv
    • libuv : C, C++로 작성된 이벤트기반, 논블로킹 I/O 모델 구현 라이브러리이다.
  • Node.js 아키텍처
    출처 : https://sjh836.tistory.com/79

2. 이벤트 기반

이벤트 기반 : 이벤트가 발생할 때 미리 저장해둔 작업을 수행하는 방식을 말한다. ex) 클릭이나 네트워크 요청 등이 있다.

  • Node.js도 이벤트가 발생하면 이벤트 리스너에 등록해둔 콜백 함수를 호출한다.

  • Node.js 내부 구조

    • 이벤트 루프(Event Loop) : 여러 이벤트 동시 발생시 어떤 순서로 콜백 함수를 호출할지 판단하는 역할 담당. 노드가 종료될 때까지 이벤트 처리를 위한 작업을 반복하므로 루프라 부린다.
    • 태스크 큐(Task Queue or Callback Queue) : 이벤트 발생 후 호출되어야 할 콜백 함수들이 기다리는 공간. 콜백들이 이벤트 루프가 정한 순서대로 줄을 서 있으므로 콜백 큐라고도 부른다.
      • API에 따라 마이크로 태스크 큐를 사용하거나, 매크로 태스크 큐를 사용한다.
      • 마이크로 태스크 큐(Event Queue) : requestAnimationFrame, I/O, UI rendering, setTimeout, setInterval, setImmediate
      • 매크로 태스크 큐(Job Queue) : process.nextTick, Promises, queueMicrotask(f), MutationObserver
    • 백그라운드(Background) : 타이머나 I/O 작업 콜백 또는 이벤트 리스너들이 대기하는 곳.

      출처 : https://velog.io/@yejineee
  • 이벤트 루프 동작 방식
    1. 매크로 태스크 큐에서 가장 오래된 태스크 를 꺼내서 실행시킨다.
    2. 마이크로 태스크 큐에 있는 모든 태스크를 실행시킨다.
    3. 렌더링 작업을 실행한다.
    4. 매크로 태스크 큐에 새로운 매크로 태스크가 나타날 때까지 대기한다.
    5. 1번으로 돌아간다.

3. 논블로킹 I/O 모델

논블로킹 : 이전 작업이 완료될 때까지 멈추지 않고 다음 작업을 수행함을 뜻한다.

출처 : Node.js 교과서(저자 : 조현영)

  • 블로킹보다 논블로킹 방식이 같은 작업을 더 짧은 시간 동안 처리할 수 있다.

  • 하지만 싱글 스레드라는 한계 때문에 자바스크립트의 모든 코드가 이 방식으로 시간적 이득을 볼 수 있는 것은 아니다. => 노드 프로세스 이외 다른 컴퓨팅 자원을 사용할 수 있는 I/0 작업이 주록 시간적 이득을 많이 보기 때문에 이를 고려하면 좋을 것 같다.

  • 논블로킹,블로킹 / 동기, 비동기에 대한 너무 잘 정리된 블로그를 발견해서 첨부한다.

4. 싱글 스레드

스레드(Thread) : 프로세스 내에서 실행되는 흐름의 단위. 하나의 프로세스는 스레드를 여러개 가질 수 있음. 스레드들은 부모 프로세스의 자원을 공유

프로세스(Process) : 운영체제에서 할당하는 작업의 단위. Node.js나 인터넷 브라우저 같은 프로그램은 개별적인 프로세스. 프로세스 간 메모리 자원 공유 X

  • 노드 프로세스는 내부적으로 스레드를 여러개 가지고 있지만 직접 제어할 수 있는 스레드는 하나 뿐 👉🏻 싱글 스레드라고 부름

  • 싱글 스레드, 논블로킹 모델

    • 효율적
    • 점원이 아파서 못나오면 매우 치명적
    • 주문을 받거나 서빙하는데 시간이 오래 걸린다면 주문이 많이 들어왔을 때 버거울 수 있음.

출처 : Node.js 교과서(저자 : 조현영)

  • 멀티 스레드, 블로킹 모델
    • 점원 한 명에게 문제가 생겨도 다른 점원으로 대체 가능
    • 손님의 늘어날 수록 점원 수도 늘어남
    • 손님 수가 줄었을 때 일하지 않고 노는 점원이 문제
    • 점원을 새로 고용하거나 기존 점원을 해고하는 데 비용 발생
      출처 : Node.js 교과서(저자 : 조현영)

👉🏻 Node.js에서는 cluster와 pm2 패키지를 통해 프로세스 자체를 복사해 여러 작업을 동시에 처리하는 멀티 프로세싱 방식 채택

5. 정리(장 단점)

장점단점단점 커버
멀티 스레드 방식에 비해 컴퓨터 자원 적게 사용싱글 스레드라서 CPU 코어 하나만 사용멀티 프로세싱으로 커버
I/O 작업이 많은 서버로 적합CPU 작업이 많은 서버로는 부적합AWS Lambda나 Google Cloud Functions 같은 서비스에서 작업 처리 지원해줌으로써 커버
멀티 스레드 방식보다 쉬움하나뿐인 스레드가 멈추지 않도록 관리해야 함try catch문으로 에러처리로 커버
웹 서버가 내장되어 있음서버 규모가 커졌으 때 서버를 관리하기 어려움nginx 등의 웹서버와 노드 서버 연결로 극복
자바스크립트를 사용함자바스크립트 자체의 문제점(ex. 암시적 형변환 등..)Typescript를 사용해 커버
JSON 형식과 호환하기 쉬움

👉🏻 에어비엔비, 우버, 넷플릭스, 링크드인, 페이팔, 월마트, 이베이 등에서 Node.js를 사용 중.

참고자료

profile
어떠한 가치를 창출할 수 있을까를 고민하는 개발자. 주로 Spring으로 개발해요. https://comclothing.tistory.com/ 👈🏻티스토리 블로그로 이전 완료

0개의 댓글