sbyeol3 / articles

Learn.. Run.. 🏃
34 stars 1 forks source link

[번역] Node.js의 기본 개념 #51

Open sbyeol3 opened 2 years ago

sbyeol3 commented 2 years ago

원문: https://dev.to/cassiocappellari/basic-concepts-of-node-js-pch

🔶 개요

한 번에 단 하나의 요청만 처리할 수 있는 서버에 초당 수백개의 요청을 보내는 웹 어플리케이션을 상상해보세요. 아마 굉장히 성능적인 이슈가 있을거고 사용자들에게도 안좋은 경험을 선사할 겁니다. 이러한 맥락에서, 웹 개발자인 Ryan Dahl는 동기 프로그래밍과 멀티스레드 서버 사이드 플랫폼을 사용하여 강력한 입출력 플로우를 가진 기능을 개발하는 데 몇 가지 어려운 문제들에 직면하고 나서 2019년 Node.js를 개발했습니다.

그래서 Node.js는 강력한 비동기 입출력 이벤트를 다룬다는 목적으로 만들어진 기술이라고 할 수 있습니다. 그렇다면 어떤 프로그래밍 언어가 이런 힘을 갖고 있을까요? 바로 정답은 자바스크립트였던 것입니다.

이 아티클에서는 Node.js의 기본 개념을 전달하고 또 모던 서버사이드 세계에서 여러분들이 왜 Node.js가 키플레이어가 되었는지 알려드리고자 제가 알고 있는 지식, 경험, 자료들을 공유하고자 합니다.

🔶 1. Node.js는 무엇인가?

간단하게 말해서, Node.js는 크롬의 V8 자바스크립트 엔진으로 구축된 서버사이드 프로그래밍을 위한 자바스크립트 기반 오픈소스 플랫폼이라고 할 수 있겠습니다. 즉, 브라우저에서 자바스크립트를 컴파일하는 엔진과 동일한 엔진이 Node.js 코어에서 동작한다는 것이며, 특히 웹 어플리케이션의 경우 이 엔진이 매우 빠르게 만들어줍니다.

🔶 2. 왜 Node.js인가?

Node.js는 모던하고 안정적이며 확장 가능한 웹 어플리케이션을 개발할 수 있는 아주 아주 강력한 서버사이드 플랫폼입니다. 글로벌 회사인 넷플릭스, 우버, 링크드인, 페이팔 등이 이를 증명해주고 있습니다.

백그라운드에서 돌아가는 멀티 스레드 플랫폼과 결합된 싱글 스레드 특징 덕분에 Node.js의 이벤트 중심 아키텍처는 많은 입출력을 가지는 어플리케이션에 아주 이상적입니다. 더 적은 하드웨어로 클라이언트에게 더 많이 응답할 수 있다는 것인데 이는 곧 적은 비용으로 더 좋은 성능을 보인다는 뜻이죠.

그 외에도 이 플랫폼은 개발자들에게 다른 놀라운 기능들을 보여줍니다.

image

🔶 2.1 Non Blicking I/O

논블로킹 메소드는 입력을 받아 비동기적으로 출력을 반환합니다. 즉, 서버가 어플리케이션을 블로킹하지 않고 많은 요청을 받을 수 있으며 백그라운드에서 응답을 처리할 수 있다는 의미입니다.

🔶 2.2 싱글 스레드

Node.js는 멀티스레드 플랫폼에 비동기 작업들을 위임하는 싱글 스레드 특성상 동시에 많은 이벤트를 처리할 수 있습니다. 이는 단 하나의 스레드만이 입출력을 처리할 수 있음을 의미합니다. 이러한 기능은 많은 요청들을 처리할 때 더 적은 메모리와 인프라 용량을 소비함으로써 더 가볍고 확장 가능하고 효율적으로 만듭니다.

🔶 2.3 이벤트 중심

Node.js는 이벤트 중심 기술이므로 서버 사이드 플랫폼의 제어 흐름은 이벤트의 발생에 의해 동작합니다. 그래서 Node 어플리케이션이 시작하는 순간 이벤트 루프라고 불리는 이벤트 리스너가 이벤트들을 기다리기 시작하며, 어플리케이션이 종료되기 전까지 멈추지 않습니다. 비유하자면, 식당이 닫기 전까지 주문을 기다리는 아주 효율적인 웨이터라고 할 수 있겠습니다.

image

🔶 2.4 Node Package Manager

Node Package Manager는 제일 큰 무료 오픈소스 라이브러리이며 모든 노드 어플리케이션에서 쉽게 가져와서 사용 가능합니다. 어떤 툴이든 Node Package Manager에서 찾을 수 있습니다.

🔶 2.5 No Buffering

Node.js 어플리케이션은 버퍼 데이터가 전혀 존재하지 않으므로 비디오나 오디오 같은 파일을 업로드하는 데 처리하는 시간을 크게 줄여줍니다. 출력 데이터를 단순하게 청크로 출력하는데 이는 사용자가 중단되지 않고 비디오를 볼 수 있음을 의미합니다.

🔶 2.6 확장성

확장성은 Node의 아주 중요한 특성입니다. 동시에 수 천개의 이벤트를 받을 수 있는 멀티 스레드 플랫폼과 결합된 싱글 스레드를 작동하는 구조적 특성상 작은 인프라로 아주 많은 양의 요청을 비동기로 다루는 대용량 플랫폼입니다.

🔶 3. Node.js 구조

Node.js 아키텍처는 이벤트 처리 공장처럼 함께 작동하는 3가지 주요한 요소로 구성됩니다. 이 요소들이 서로 어떻게 상호작용하는지 쉽게 이해하기 위해 Node.js로 개발된 REST API 예시를 보여드리겠습니다. 이 어플리케이션에 클라이언트가 여러 개의 요청을 보낸다고 가정해보겠습니다.

🔶 3.1 이벤트 큐

1 - 요청들이 도착하자마자, 이 요청들은 이벤트 큐로 직행합니다. 이벤트 큐는 어플리케이션에서 발생하는 모든 이벤트들이 가장 먼저 가는 곳입니다. 그리고 이벤트 루프라고 불리는 메인 스레드에서 처리되려고 보내지기를 기다립니다.

🔶 3.1 이벤트 루프

2 - 이벤트 루프는 자바스크립트를 컴파일하기 위해 코어에서 V8 엔진을 실행하는 싱글 스레드 플랫폼입니다. 요청이 이벤트 루프로 들어가면 백그라운드에서 처리되는 스레드 풀 플랫폼으로 위임됩니다. 이런 구조적 흐름으로 메인 스레드는 다른 이벤트들을 다시 처리할 수 있습니다.

🔶 3.3 스레드 풀

3 - 스레드 풀은 libuv라고 불리는 라이브러리를 실행하고 내부 코어에서 C++를 가지는 멀티 스레드 플랫폼입니다. 이 스레드 풀에서 요청(블로킹 작업)은 완료된 후 리턴되기를 대기할 때까지 백그라운드에서 비동기적으로 처리됩니다.

image

🔶 마무리

이 짧은 글로 Node.js가 어떻게 동작하며, 아주 빠르게 성장하여 많은 회사와 스타트업에서 선택된 이유를 잘 이해하셨기를 바랍니다. 초연결된 현대 세계에서 작은 인프라로 빠르게 확장할 수 있는 기술은 반드시 주목해야 하는 중요한 플레이어입니다.

여기까지 읽으셨다면, 웹 세계에서 아주 필수적인 툴들의 기초를 다루는 저의 다른 아티클들도 읽으시기를 바랍니다.