Node.js란?
Node.js®는 Chrome V8 JavaScript 엔진으로 빌드된 JavaScript 런타임입니다. Node.js는 이벤트 기반, 논 블로킹 I/O 모델을 사용해 가볍고 효율적입니다. Node.js 패키지 생태계인 npm은 세계에서 가장 큰 오픈 소스 라이브러리 생태계이기도 합니다. - Node.js 공식 사이트
- node 공식 사이트(https://nodejs.org/ko/)의 설명에 따르면 노드란 "Node.js®는 Chrome V8 JavaScript 엔진으로 빌드된 JavaScript 런타임입니다."라고 설명하고 있습니다.
- V8엔진은 구글에서 만든 것으로 기존에 Javascript가 브라우저 내에서만 작동이 가능했던 것을 브라우저가 없어도 작동할 수 있도록 만든 것입니다. 다시 위 설명에 따르면 Node.js는 V8엔진으로 빌드되었지만 구글이 만든것은 아니고요 자바스크립트를 실행할 수 있는 환경이라고 보시면 됩니다.
- 쉽게 말해서 Node.js란 Javascript를 브라우저가 아닌 컴퓨터에서 브라우저 없이 실행하게 도와주는 환경을 의미합니다.
Node.js를 사용해야 하는 이유?
- Node.js는 논 블로킹(Non-blocking) I/O, 싱글 스레드(Single Thread), 이벤트 루프(Event Loop)의 특성이 있습니다.
- 기존의 블로킹(Blocking) I/O는 프로그램 내부에서 함수를 호출하면 호출된 함수가 작업을 마칠 때까지 대기하는 방식이었지만, 논 블로킹(Non-blocking) I/O는 함수가 실행되는 중에도 다른 작업을 동시에 진행할 수 있는 장점이 있습니다.
블로킹 I/O에 대해서 간단한 설명
- I/O는 데이터의 입력(Input) / 출력(Output)을 뜻합니다. 어떤 프로세스에서 입력과 출력이 이뤄지는 프로세스는 모두 I/O라고 합니다.
- Blocking - Linear programming, 코드 하기 쉽고 , 제어가 영역이 적습니다. I/O가 끝날 때까지 대기하여 block 되어 다른 작업을 처리할 수 없습니다.
- Non-blocking - Parallel programming, 코드 하기 어렵지만, 제어 영역이 더 많습니다. 시스템의 호출 종료를 기다리지 않고 다음 처리로 넘어갈 수 있어 사용자 프로세스는 다른 일을 처리할 수 있습니다.
- 싱글 스레드(Single Thread)는 스레드 하나를 사용하는 것이며, 동시에 하나의 작업만을 처리할 수 있습니다.
- 여기서 스레드(Thread)란 프로그램이 동작할 때, CPU 또는 프로세서를 사용하는 단위입니다.
- 일반적으로 1개의 프로그램은 1개의 스레드를 사용할 수 있습니다. 하지만 1개의 프로그램에서 여러 개의 스레드를 사용할 수 있다면 연산할 수 있는 시간을 단축시킬 수 있겠죠?
그럼에도 불구하고 Node.js가 싱글 스레드를 고집하는 이유
사실 싱글 스레드는 많은 이점을 제공합니다. 연결 요청마다 스레드를 생성하는 체계에 비해 스레드 생성 부하 및 스레드 유지에 대한 부담이 없어 같은 컴퓨팅 리소스라도 조금 더 효율적으로 사용할 수 있는 특징이 있습니다.
또한 스레드가 하나라는 것은 스레드들이 공유하는 자원에 대한 동시 접근 문제, 즉 Race condition 상황이 발생하지 않는다는 것을 의미합니다. 공유자원이 없으니 여러 스레드가 하나의 오류로 인해 모두 문제를 일으키는 상황도 발생하지 않습니다.
Node.js는 차라리 새로운 프로세스를 생성해 확장을 도모합니다. 프로세스는 여러 개라도 서로에 대해 스레드에 비해 독립적이므로 하나의 프로세스가 문제를 일으키더라도 다른 프로세스까지 모두 종료될 확률은 상대적으로 낮습니다.
이러한 특징 때문에 연결 요청의 부하에 따른 서버 확장이 매우 자유롭습니다. 즉, Node.js는 특히 웹 서버에 특화된 철학이 녹아있는 언어입니다.
아무리 싱글 스레드만의 장점이 있다고 해도 멀티 스레드의 연산 효율에 비춰보면 단점이 드러나는 것은 싱글 스레드 설계 자체가 가지고 있는 문제입니다. 이 때문에 Node.js는 CPU intensive 한 작업에는 효율적이지 않습니다. 물론 이러한 약점을 극복하기 위한 방법들도 제공되고 있으며, 실제로 스레드를 추가로 생성할 수 있는 방법들도 존재합니다만! Node.js의 철학은 싱글 스레드에 기반하고 있다는 사실을 기억해야 합니다.
- 이벤트 루프(Event Loop)는 Javascript가 가지고 있던 싱글 스레드의 약점을 극복하기 위해 효율적으로 작업을 처리할 수 있는 특성입니다.
→ 이벤트 루프에 대해 자세히 알고 싶다면 여기를 클릭하세요!
→ 이벤트 루프의 공식 문서가 궁금하다면 여기를 클릭해주세요!
ES6(ECMAScript 6)란?
- 초기 javascript는 넷스케이프라는 웹브라우저에서 사용하기 위해 만들어진 언어입니다. 옛날 홈페이지들은 html과 css로 움직이지 않는 아주 정적인 홈페이지들만 있었어요. 여기에서 Javascript를 추가해서 홈페이지에서 역동적인 애니메이션이나 움직임 등을 추가할 수 있었어요.
- 이후에 넷스케이프 외에도 저희에게 익숙한 Internet Explorer 같은 다른 브라우저들도 비슷한 언어를 개발하기 시작했어요. 그러다 보니 브라우저마다 개발하는 방식이 달랐고 이게 불편해서 표준화시키는 작업이 필요했습니다. 그렇게 나온 것이 ECMAScript입니다.
- 이 표준은 ECMAScript는 매년 꾸준히 변경되고 새로운 기능이 추가되면서 버전이 새로 나오고 있어요. 2021년 기준으로 12번째 버전이 나왔네요.
- ES6란 ECMAScript의 6번째 버전으로 2015년에 발표되어서 ECMAScript 2015라고도 불립니다. (ES6, ECMAScript 2015 둘 다 같은 말입니다.)
Node.js의 REPL
- 일반적으로 "REPL 환경"이라 함은 아래와 같이 설명할 수 있습니다.
- 입력받은 코드를 읽어(Read) 들여 메모리에 저장하고, 평가(Evaluate)된 값을 출력(Print)합니다. 특정 신호를 입력받기 전까지 위의 과정을 반복(Loop)합니다.
- 쉽게 말하자면? 입력하는 코드의 결과 값을 즉시 확인할 수 있기 때문에 간단한 문법 테스트, 테스트 등으로 아주 적합한 개발 환경으로 볼 수 있습니다.
- Node.js는 REPL 환경을 제공하고 있으며, 우리는 그것을 쉽게 이용할 수 있습니다.
웹 브라우저의 콘솔
웹 브라우저에서 개발자 도구에 보이는 콘솔 창에서 자바스크립트 코드를 바로 작성할 수 있는데요, 이것도 REPL이 맞지만 Node.js에서의 REPL 환경과 다르게 Node.js가 제공하는 API를 사용할 수 없고 브라우저의 API를 사용해 DOM을 제어할 수 있다는 차이가 있습니다. https://developer.chrome.com/docs/devtools/console/#javascript
참고할만한 추가 자료들
- Node.js의 특성
About | Node.js
Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.
nodejs.org
Node.js를 파헤치자 - 작동 원리, 싱글스레드, 논블로킹I/O, 이벤트 기반
Node란? Node.js는 Chrome V8 Javascript 엔진으로 빌드된 Javascript 런타임이다. - by node 공홈 런타임이란 특정 언어로 만든 프로그램을 실행할 수 있는 환경을 의미한다. 이전까지 Javascript는 웹 브라우저에
velog.io
- Node.js의 이벤트 루프(Event Loop)
Node.js 이벤트 루프(Event Loop) 샅샅이 분석하기
글에 들어가기에 앞서 Node.js의 이벤트 루프의 경우 공식 문서에 설명이 부족하고 이에 따라 여러 사람들이 각자 나름대로 분석한 글이 많아 무엇이 이벤트 루프의 정확한 동작인지 알기 힘듭니
www.korecmblog.com
Node.js 이벤트루프 제대로 이해하기
이 글은 Daniel Khan의 What you should know to really understand the Node.js Event Loop 글을 번역 한 글입니다. 모든 저작권과 권리는 Daniel Khan에게 있습니다. 곳곳에 의역이 들어가있는 점 양해부탁 드립니다 :) No
tk-one.github.io
'Language > Node.js' 카테고리의 다른 글
Routin 이해 및 Router 학습 (0) | 2022.12.12 |
---|---|
API Client (1) | 2022.12.12 |
Express.js 란? (0) | 2022.12.12 |
Package Manager (npm) (0) | 2022.12.12 |
Node.js 셋팅하기 (0) | 2022.12.09 |