[스터디] node.js는 싱글쓰레드로 동작할까?

lyshine·2023년 10월 23일
0

스터디

목록 보기
5/7

node.js란 무엇인가?

"Node.js®는 Chrome V8 JavaScript 엔진으로 빌드된 JavaScript 런타임입니다."

=> 웹애플리케이션을 개발할 때 JavaScript를 사용하는데 모든 브라우저가 JavaScript 코드를 해석하기 위해 JavaScript Engine을 내장하고 있다.
(Chrome - V8, Firefox - SpiderMonkey, Safari - Webkit 등)
=> Node.js는 Chrome의 V8엔진을 이용하여 브라우저에서 JavaScript를 해석하듯이 서버에서 JavaScript를 동작할 수 있도록 하는 환경(플랫폼)이다. -> 버퍼가 없고 빠른 코드 실행을 제공해준다.

  • Node.js는 서버를 직접 구현해 주어야 한다.
    Node.js 자체 모듈인 http모듈을 import하여 서버를 생성해 준다.

  • Node.js 라이브러리 내의 API는 모두 비동기식이다.
    (API를 실행하고 완료되기까지 기다리지않고 바로 다음 API를 실행)

  • 단일 쓰레드(single thread), 이벤트 루프 기반(event loop)

=> 이벤트 메커니즘을 통해 서버가 멈추지 않고 반응할 수 있어 확장성을 키워준다.

쓰레드 기반 동기방식(Blocking I/O)

  • 하나의 쓰레드가 request를 받으면 모든 처리가 완료될때까지 기다리다가 처리결과가 완료되면 다시 응답을 보냄
  • 기존 업무 처리가 완료되기 전에 또다른 request가 있으면 새로운 쓰레드가 업무를 처리함.
  • 동시 request가 많은 경우 많은 쓰레드가 필요하게 되어 서버 과부하

단일쓰레드 이벤트 루프 기반 비동기방식( Non-Blocking I/O)

  • 하나의 쓰레드가 request를 받으면 바로 다음 처리에 요청을 보내놓고 다른 작업을 처리하다가 먼저 요청한 작업이 끝나면 이벤트를 받아서 응답을 보낸다.
  • 동시 request가 오더라도 처리가 완료될때까지 기다리지 않아도 되기 때문에 서버 부하가 적다.

📌 단일 쓰레드 기반 비동기방식이 node.js의 가장 큰 특징이다

장점

  1. 새로운 언어를 습득하지 않고도 자바스크립트를 활용해 서버기술을 빨리 개발/응용할 수 있습니다.
  2. 개발이 빠르고 쉽다. 서버 설치부터 화면 띄우는 것까지 금방 처리 됩니다.
  3. 단일쓰레드 이벤트 루프 기반 비동기방식을 통한 높은 처리 성능(서버 무리가 적다)
    (java(jsp)는 쓰레드에 의한 동기방식이라 요청이 오면 반드시 결과를 받은 후에 다음 로직이 처리될 수 있다.)
  4. npm(node package manager)을 통한 다양한 모듈(패키지)을 제공해준다.(개발속도와 효율성이 증가)

단점

  1. 이벤트 기반 비동기방식이라 서버단 로직이 복잡한 경우 콜백함수의 늪에 빠질 수 있다.
  2. 코드를 순차적으로 실행하는 것이 아니라 비동기 방식으로 이벤트를 보내고, 응답(이벤트)이 오면 처리하는 방식이기 때문에 java 개발을 했던 방식(쓰레드 기반 동기방식)으로 설계하고 작성하면 큰 문제가 발생한다.
  3. 코드가 수행되어야 코드에 에러가 있는지 알 수 있으며, 에러가 날 경우 프로세스가 내려가기 때문에 테스트가 중요하다. 반드시 모든 케이스에 대해 소스코드를 검증해야 한다.

Nodejs의 비동기 처리

  • 자바스크립트 엔진(V8 엔진)은 Memory Heap과 Call stack으로 이루어져 있다. 자바스크립트 엔진 자체는 콜스택에 쌓인 실행 컨텍스트에 따라 위에서부터 차례로 실행이 일어나기 때문에 비동기 처리를 할 수 없다.
    비동기 처리가 필요하게 될 경우, 자바스크립트가 실행되는 환경인 브라우저 또는 Node를 통해 libuv 라이브러리에서 제공하는 비동기처리를 하게 된다.
  • Node.js는 싱글스레드 논블로킹 모델로 구성되어 있다. 하나의 스레드로 동작하지만, 비동기 I/O 작업을 통해 요청들을 서로 블로킹하지 않는 것이다.
    즉, 동시에 많은 요청들을 비동기로 수행함으로써 싱글스레드일지라도 논블로킹이 가능하도록 구성할 수 있는 것이다.

참고 :
https://medium.com/@yeon22/node-js-node-js%EB%9E%80-410ae3749c56
https://junspapa-itdev.tistory.com/3

0개의 댓글