처음부터 차근차근

[Node.js] Node.js란? 본문

FrameWork/Node.js

[Node.js] Node.js란?

HangJu_95 2023. 12. 9. 01:05
728x90

Node.js를 통해 서버를 많이 구축하고 다양한 프레임워크를 사용했지만,

정작 Node.js의 특징의 장점, 단점에 대해 정확히 모르는 것 같아 한번 정리해야겠다는 생각이 들었습니다.

Express, Nest.js는 Node.js를 기반으로 사용하고 있으니, 이를 한번 간단하게 정리해보겠습니다.

Node.js란?

노드 공식 사이트에는 노드를 다음과 같이 설명하고 있습니다.

Node.js® is an open-source, cross-platform JavaScript runtime environment. Node.js runs the V8 JavaScript engine, the core of Google Chrome, outside of the browser.

 

Node.js는 오픈 소스이며, Cross-platform Javascript 런타임 환경입니다.

이것을 이해하기 위해선 Javascript를 이해해야 합니다.

Javascript란?

HTML과 Javascript의 관계

자바스크립트는 원래 HTML에 종속되어 있는 언어입니다. HTML 조작과 변경을 위해 사용합니다.

즉, 정적 언어인 HTML을 조작해서 동적으로 바꿔주는 기능을 하는게 자바스크립트입니다.

자바스크립트의 해석은 누가 할까?

바로 우리가 항상 사용하는 브라우저(Chrome, Edge 등)입니다.

브라우저에는 자바스크립트 해석 엔진이 있으며, 따라서 기존에는 자바스크립트를 인터넷 브라우저 위에서만 실행할 수 있습니다.

그리고 2008년 구글이 V8 엔진을 사용해서 크롬을 내놓았는데, 이것이 성능이 엄청 좋았으며, 오픈 소스였습니다.

그래서 V8 엔진에 기능을 좀 더 추가하여 V8 엔진 기반의 노드 프로젝트를 시작했고, Node.js(V8)이 등장했습니다.

Node.js는 브라우저 내에서 말고도 다른 환경에서 자바스크립트를 사용할 수 있게 해줍니다.

 

따라서 Node.js는 Javascript 실행 환경(=런타임)입니다.

Node.js는 왜 만들어졌을까??

Node.js는 V8 엔진을 통해 만들어진 Javascript Runtime입니다.

사실 Javascript는 HTML에 종속되어 있는 언어입니다. (이름 자체에도 나와 있듯이 스크립트 언어입니다.)

스크립트 언어는 특정한 프로그램 안에서 동작하는 프로그램이기 때문에 웹 브라우저(Chrome, safari, Edge 등)에서만 동작할 수 있었습니다.

크롬에서 Javascript 실행시키기

 

그러나 Node.js가 있다면 Javascript를 웹 브라우저에서 독립시켜 터미널 프로그램에서 Node.js를 입력하여 브라우저 없이 바로 실행시킬 수 있습니다.

 

즉, Node.js를 이용하면 Javascript를 통해 웹 브라우저와 무관한 프로그램을 만들 수 있게 되었습니다.

이 특징에서 중요한 점은, Node.js에서 Server를 만들 수 있다는 것입니다.

Node.js 등장 이전까지 Server-Client 웹사이트를 만들 때 웹에 표시되는 부분은 Javascript로, 서버는 Java, Ruby 등 다른 언어를 써서 만들었어야 했는데, Node.js가 나오고 나서 한 가지 언어로 전체 웹페이지를 만들 수 있다는 장점이 생기게 되었습니다.

 

다시 한번 Node.js를 알아보자.

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

 

즉, 노드를 통해 다양한 Javascript applicaton을 실행할 수 있으며, 서버를 실행하는 데 가장 많이 사용됩니다.

  • Node.js는 JavaScript를 서버에서도 사용할 수 있도록 만든 프로그램이다.
  • Node.js는 V8이라는 JavaScript 엔진 위에서 동작하는 자바스크립트 런타임(환경)이다.
  • Node.js는 서버사이트 스크립트 언어가 아니다. 프로그램(환경)이다.
  • Node.js는 웹서버와 같이 확장성 있는 네트워크 프로그램을 제작하기 위해 만들어졌다.

Node.js는 확장성이 있는 Network Application 개발에 사용되는 소프트웨어 플랫폼입니다. 특히 Express, Nest.js를 통해 서버 사이드에서 많이 활용되고 있죠.

Javascript Runtime이란?

  • 런타임이란 특정 언어로 만든 프로그램을 실행할 수 있는 환경을 뜻합니다.
  • 따라서 노드는 자바스크립트 프로그램을 컴퓨터에서 실행할 수 있게 하는 자바스크립트 실행기입니다.
  • 특히 2008년 구글이 V8 엔진을 사용하여 크롬을 출시했고 V8 엔진은 다른 자바스크립트 엔진과 달리 매우 빨라 라이언 달(Ryan Dahl)은 2009년 V8 엔진 기반의 노드 프로젝트를 시작하며 세상에 나왔습니다.

Node.js의 특징

Node.js는 이벤트 기반, Non-blocking I/O단일 스레드 이벤트 루프를 통해 높은 처리 성능을 가지고 있는 것이 특징입니다.

또한, 내장 HTTP 서버 라이브러리를 포함하고 있어 웹 서버에서 아파치 등의 별도 소프트웨어 없이 동작하는 것이 가능하며, 이를 통한 웹 서버의 동작에 있어 더 많은 통제에서 벗어나 여러 가지 기능을 할 수 있습니다.

// Node.js를 통한 간단한 웹 서버 만들기
const http = require('node:http');

const hostname = '127.0.0.1';
const port = 3000;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello, World!\n');
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

이벤트 기반(Event-Driven)

Event-Driven이란 어떤 특정 이벤트(일어나는 일, Ex: 사용자의 입력, 센서로부터의 입력 등)가 발생할 때 미리 지정해둔 작업을 수행하는 방식을 의미합니다.

즉, Event-driven system에서는 특정 이벤트가 발생할 떄 무엇을 할 지 미리 등록해두고, 이를 이벤트 리스너에 콜백함수를 등록합니다. 이후 이벤트가 발생하면 리스너에 등록해둔 콜백함수를 호출하며, 이벤트가 끝난 후, 노드는 다음 이벤트가 발생할 떄 까지 대기합니다.

Event Loop

Event Loop

이벤트 루프는 여러 이벤트가 동시에 발생했을 때 어떤 순서로 콜백함수를 호출 할지를 이벤트 루프가 판단합니다.

노드는 이벤트가 종료될 때까지 이벤트 처리를 위한 작업을 반복하므로 Loop라고 합니다.

Non Blocking I/O

이벤트 루프를 잘 활용하면 오래 걸리는 작업을 효율적으로 처리할 수 있습니다. 이때 작업은 동시에 실행될 수 있는 작업과 동시에 실행될 수 없는 작업 두 가지로 나뉩니다.

이때, 파일 시스템 접근, 네트워크를 통한 요청 작업은 Input/Output의 일종이며, 이러한 작업을 할 때 노드는 비동기 방식으로 블로킹을 만들지 않게 끔(Non blocking) 처리합니다.

즉, 비동기적으로 작업합니다. 동시에 작업을 수행한다고 보면 쉽습니다.

Single Thread

자바스크립트 코드는 동시에 실행될 수 없는데, 그 이유는 Node.js가 싱글 스레드 기반이기 때문입니다.

Node.js는 Single Thread Non-Blocking으로 싱글 스레드가 혼자서 일을 처리하지만 들어오는 요청 순서가 아닌 논 블로킹 방식으로, 이전 작업이 완료될 때까지 대기하지 않고 다음 작업을 수행합니다.

왜 Node.js를 통해 서버를 만들까?

Node.js를 통해 서버를 만드는 이유는 여러 가지가 있습니다.

 

1. Javascript 기반입니다.

이는 프론트엔드 개발자가 서버 개발을 위해 다른 언어를 배우지 않고도 서버를 개발할 수 있다는 큰 장점을 가지고 있습니다.

Node.js의 웹서버 프레임워크인 Express, Nest.js를 배우기만 하면 끝입니다.

 

2. Single Thread Non-blocking I/O이기 떄문에 I/O 요청이 많은 서버에 효과적이다.

Node.js는 모든 API를 비동기 방식으로 동작하여 Non-Blocking I/O가 가능합니다. 또한 단일 스레드 이벤트 루프 모델을 사용하기 때문에 가벼운 환경에서도 높은 Request 처리 성능을 가지고 있습니다.

이는 SNS나 채팅서비스에 많이 사용됩니다. 요청이 매우 많은 서비스에 가장 효과적이죠.

또한 데이터를 실시간으로 처리하기 때문에 SPA(Single Page Application)에 적합합니다.

단, 높은 CPU 처리량을 요구하는 Application에는 단일 스레드이기 때문에 적합하지 않습니다.

(Node.js 14버전 이후부터는 멀티 쓰레드가 가능하다는건 비밀..)

 

3. 코드가 매우 짧고 쉬워 빠른 개발이 가능합니다.

위에서 예시 코드를 보여드렸지만, 코드가 짧고 쉬워 빠른 개발이 가능합니다.

Node.js가 어울리지 않는 웹서비스는??

먼저 높은 CPU 처리량을 요구하는 Application에는 적합하지 않습니다.

그리고 서버 체크로직이 많은 경우 비동기 방식이기 때문에 Callback Hell에 빠질 수 있습니다.

참고

 

Node.js 노드 개념 이해하기 자바스크립트 JavaScript 런타임 이벤트

Node.js 노드 개념 이해하기 JavaScript 런타임 - 노드는 다양한 자바스크립트 애플리케이션을 실행할 수 있으며, 서버를 실행하는데 제일 많이 사용된다. 이벤트 기반 이벤트 루프 논블로킹 I/O 싱글

hanamon.kr

 

[개발 기본 지식] Node.js란?

"Node.js는 Chrome V8 JavaScript 엔진으로 빌드된 JavaScript 런타임입니다" ?? 🤔그래서 뭔데요?

velog.io

 

[Node.js] 특징 및 장단점

Node.js 특징 Node.js는 Single-Thread의 non-blocking I/O 이벤트 기반 비동식 방식으로 작동한다. JavsScript 엔진(V8 Engine)으로 빌드 된 JavaScript 런타임이다. 따라서, 사용자의 요청은 한 곳에서 받지만 작업은

seoyeonkk.tistory.com

 

이벤트 기반 프로그래밍 - Event driven programming

이벤트 기반 프로그래밍 혹은 EDP라고도 하는 프로그래밍 패러다임에 대해 간단히 세미나를 진행하였습니다! 이벤트기반프로그래밍은 일어나는 일을 뜻하는 이벤트와 특정 방향으로 몰고가다

heeonii.tistory.com

 

[NODE] 📚 노드 듀토리얼

Introduction Node.js는 Chrome V8 자바스크립트 엔진으로 빌드된 자바스크립트 런타임 환경(Runtime Environment)으로 주로 서버 사이드 애플리케이션 개발에 사용되는 소프트웨어 플랫폼이다. Node.js는 브라

inpa.tistory.com

 

'FrameWork > Node.js' 카테고리의 다른 글

Node.js 입출력 보안 맛보기  (0) 2023.05.31
Nodejs 객체와 모듈 이용해 정리정돈하기  (0) 2023.05.31
Node.js Delete 구현  (0) 2023.05.31
Node.js Update 진행해보기  (0) 2023.05.31
Node.js App에서 Create 진행해보기  (0) 2023.05.31