[번역] Node.js에 대한 일반적인 오해 바로잡기

Sonny·2025년 3월 16일
5

Article

목록 보기
33/33
post-thumbnail

원문: https://medium.com/@manikmudholkar831995/debunking-common-nodejs-misconceptions-7172b41d7afe

몇 가지 오해

  • Node.js는 싱글 스레드인가요: 맞기도 하고 아니기도 합니다. 이벤트 루프와 V8을 생각하면 맞고, 스레드 풀을 생각하면 아닙니다. 자바스크립트 코드, 즉 실행 컨텍스트는 싱글 스레드입니다. 따라서 일부 자바스크립트 집약적인 작업을 실행하여 블로킹하면 이벤트 루프가 차단될 수 있습니다.

  • Node.js는 모든 IO에 스레드 풀을 사용하나요: Nodejs는 대부분의 작업에서 스레드 풀에 의존하지 않습니다. 비동기식 시스템 콜이 없는 OS에서만 논 블로킹 IO를 위해 스레드 풀을 활용합니다. 스레드 풀은 주로 다음과 같은 용도로 사용됩니다.

    1. DNS 확인자 (대부분의 운영 체제는 이 목적을 위해 동기식 API만 제공하기 때문)
    2. 파일 시스템 API (서로 다른 플랫폼에서 비동기적으로 처리하는 것이 복잡해지기 때문)
    3. Crypto (CPU 사용하기 때문)
    4. Zlib (zip 압축에 사용하기 때문)
  • 연결당 하나의 스레드인가요: libuv가 각 요청에 대해 새로운 스레드를 생성한다고 오해하기 쉽지만 전혀 그렇지 않습니다. Node.js가 여러 연결을 처리할 수 있는 이유는 소켓에서 논블로킹 작업을 수행하기 때문입니다.

  • Node.js는 모든 면에서 빠른가요: 상황에 따라 다릅니다. Node.js는 IO 집약적인 작업을 처리하는 데는 매우 효율적이지만 CPU 집약적인 작업을 관리하는 데는 그다지 효과적이지 않을 수 있습니다. 이를 설명하기 위해 워커 스레드를 식당의 웨이터와 비교할 수 있습니다. 한 테이블에서 주문하는 데 시간이 오래 걸리면 웨이터가 더 오랜 시간 동안 자리를 지키게 되어 전체 효율성이 떨어집니다.

  • 스레드 풀은 네트워크 확장에 사용되나요: Node.js는 메인 스레드에서 네트워크 I/O 작업을 실행합니다. node.js는 4개의 추가 스레드를 생성하지만 데이터베이스 작업과 같은 네트워크 I/O 작업에는 이 중 어느것도 사용되지 않습니다. 노드 I/O가 스레드 풀을 사용한다고 주장하는 유튜브 또는 미디엄 글과 같은 외부 출처보다는 공식 node.js 프로젝트의 정보에만 의존하는 것이 중요합니다. 이러한 출처는 해당 주제에 대한 정확한 지식을 가지고 있지 않을 수 있습니다. 워크로드를 여러 프로세서에 분산하려면 클러스터링을 활용할 수 있습니다. 이는 직접 클러스터링 코드를 작성하거나 pm2 같은 프로세스 관리자의 클러스터링 모드를 활용해 여러 프로세스에 연결을 분산시키는 방식으로 구현할 수 있습니다.

  • 더 많은 확장을 위해 기본 스레드 풀 크기를 늘리기만 하면 되나요: 코어 수보다 많은 스레드를 생성하면 성능이 크게 향상되지 않습니다. 오히려 컨텍스트 전환에 CPU 사용률이 낭비되므로 성능이 저하될 수 있습니다. 그렇기 때문에 스레드 풀을 신중하게 사용해야 합니다.

wow.gif

이러한 내용은 제 생각을 바꿀 만큼 아주 중요했습니다.

🚀 한국어로 된 프런트엔드 아티클을 빠르게 받아보고 싶다면 Korean FE Article을 구독해주세요!

profile
FrontEnd Developer

0개의 댓글