Node.js

백승찬·2023년 8월 13일

Node 개발

목록 보기
1/7

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

일반적으로 런타임이라 하면 특정 언어로 개발된 프로그램을 해석하고 실행할 수 있는 환경, 즉 프로그래밍 언어가 구동되는 환경을 의미합니다. 그래서 'JavaScript 런타임'은 자바스크립트로 구현된 프로그램을 해석하고 실행할 수 있는 환경을 뜻합니다.

Node.js가 등장하기 전의 자바스크립트는 브라우저 안에서만 동작을 할 수 있었습니다. 왜냐하면 브라우저만이 유일하게 자바스크립트로 구현된 프로그램을 해석하고 실행할 수 있는 자바스크립트로 구현된 프로그램을 해석하고 실행할 수 있는 자바스크립트 런타임을 내장하고 있었기 때문입니다.

Node.js는 구글 크롬 브라우저에 사용된 V8엔진을 이용해서 브라우저 밖에서도 자바스크립트를 실행할 수 있도록 개발된 것입니다. 그래서 Node.js 는 Chrome V8 JavaScript엔진으로 빌드된 JavaScript 런타임'이라고 정의할 수 있습니다.

Node.js는 적은 자원으로도 최대한의 효율을 올릴 수 있다는 특징을 가지고 있습니다. Node.js는 가볍고, 빠르고, 좋은 성능을 제공합니다.

Node.js는 논블로킹(Non-blocking) I/O와 싱글 스레드(single Thread), 이벤트 루프(Event Loop)를 통한 높은 처리 성능을 가지고 있습니다.

논블로킹(Non-blocking)I/O

프로그래밍 언어별로 여러 개의 작업을 동시에 처리할 수 있는 언어가 있고, 한 번에 하나의 작업만 처리할 수 있는 언어가 있습니다. 기본적으로 자바스크립트는 한 번에 하나의 작업을 처리하는 후자에 속합니다. 하지만 I/O 작업의 경우는 자바스크립트도 동시에 처리할 수 있습니다. 이런 작업을 할 때 Node.js는 논블로킹 방법을 사용할 수 있습니다.

블로킹(동기식)

  • 함수를 호출하면 호출된 함수가 작업을 마칠 때까지 제어권을 돌려주지 않고 하함수가 종료될 떄까지 대기하는 방식을 말합니다.
  • 블로킹 I/O 방식은 파일 쓰기가 완료될 때까지 프로그램이 다음 코드를 실행하지 않고 대기하기 때문에 파일을 쓰는 동안 CPU가 사용되지 않아서 비효율적입니다.

논블로킹(비동기식)

  • 함수를 호출하면 호출된 함수에게 바로 제어권을 넘겨줘서 다른 작업을 바로 진행할 수 있도록 하는 방식입니다.
  • 파일 쓰기를 요청한 후 바로 다은 작업을 할 수 있기 때문에 좀 더 효율적입니다.

싱글스레드(Single Thread)

Node.js는 싱글 스레드를 사용합니다. 여기서 싱글 스레드라는 것은 하나를 사용한다는 의미입니다. 스레드가 하나라는 말은 곧, 동시에 하나의 작업만 처리할 수 있다는 뜻입니다. 기본적으로 자바스크립트 같은 싱글 스레드 방식의 언어는 작성된 프로그램을 순차적으로 실행하고, 여러 작업을 동시에 처리할 수 없도록 되어 있습니다.

멀티 스레드(Multi Thread)는 여러 개의 스레드를 이용해서 동시에 여러 작업을 진행할 수 있는 프로그래밍 방식이다.

컴퓨터는 작업을 처리하기 위해서 '프로세스'라는 작업 단위를 두고 프로세스를 통해서 작업을 처리합니다. 컴퓨터에서 동작하는 Node.js를 포함한 여러 가지 프로그램은 개별적인 프로세스로 리소스(CPU, 메모리, 저장 공간 등)를 할당받고 실행됩니다. 스레드는 프로세스 안에서 작업을 처리하기 위해 실행되는 흐름의 단위인데, 하나의 프로세스는 여러 개의 스레드를 생성해서 작업을 동시에 처리할 수 있습니다.

자바는 멀티 스레드를 사용하고, Node.js는 싱글 스레드를 사용합니다. Node.js를 실행하면 컴퓨터는 프로세스를 생성하고 프로세스 안에서 여러 개의 스레드가 생성되지만, 프로그램을 통해 직접 제어할 수 있는 스레드는 하나밖에 없기 때문에 Node.js를 싱글 스레드 방식이라고 한다.

정리하자면 Node.js는 자바스크립트를 실행하는 부분에 대해서만 싱글 스레드로 구성되고, 논블로킹 I/O와 이벤트 루프를 통해서 동시에 여러 작업을 할 수 있도록 해 줍니다.

이벤트 루프(Event Loop)

Node.js는 크롬 V8자바스크립트 엔진과 libuv, llhttp, c-ares, OpenSSL, zlib라는 라이브러리로 구성되어 있습니다. 이 중 libuv 라이브러리는 이벤트 루프를 통해서 자바스크트가 가지고 있던 싱글 스레드의 약점을 극복하고 효율적으로 작업을 처리할 수 있도록 고안되었습니다.

이벤트 루프(Event Loop)는 콜 스택과 콜백 큐의 상태를 체크하고, 콜 스택이 빈 상태가 되면 콜백 큐의 첫 번째 콜백을 콜 스택으로 이동시킵니다. 이러한 작업이 반복적으로 일어나고, 이런 반복적인 행동을 틱(tick)이라고 합니다. 그래서 자바스크립트만 보면 싱글 스레드 언어이고 한 번에 하나의 작업만 실행할 수 있지만, 브라우저 내에서 비동기 함수인 Web APIs와 콜백 큐, 이벤트 루프 때문에 멀티 스레드처럼 동시에 다중 작업을 처리하는 효과를 볼 수있습니다.

멀티스레드와 동일한 효과

싱글 스레드인 Node.js가 CPU의 코어를 추가적으로 사용해서 작업을 병렬적으로 처리하는 것이 가능합니다. 즉, CPU 코어 하나당 프로세스 하나가 실행이 되는데, 여러 개의 코어를 사용해서 여러 개의 프로세스로 Node.js를 실행시키는 것입니다. 이것을 클러스터링(Clustering)이라고 합니다. 이렇게 되면 요청을 분산시키고 병렬로 처리 할 수 있기 때문에 멀티 스레드 언어와 동일한 효과를 볼 수 있습니다.

npm(Node Package Manager)

npm은 Node Package Manager로 Node.js 기반으로 개발된 수많은 자바스크립트 패키지(라이브러리)가 등록되어 있어서 개발자들이 쉽게 설치하고, 사용하고, 운영할 수 있도록 해 주는 Node.js 패키지 관리자입니다.

profile
신은 인간에게 선물을 줄 때 시련이라는 포장지에 싸서 준다. 선물이 클수록 더 큰 포장지에 싸여있다. - 브라이언 트레이시 -

0개의 댓글