What is Node.JS? - 개론

2021. 5. 12. 04:53Dev/NodeJs

Hello Node!

 

#Node.JS란?

Node.JS의 공식 홈페이지인 nodejs.org에 들어가보면 이런 문구가 나온다.

뭐라구?

이 짧지만 어려운 말을 쉽게 이해하기 위해서는 JavaScript가 어떤 언어인지 알아야한다.

 

# Node.JS의 개념

JavaScript는 스크립트 언어이다. 현재의 웹의 구성은 HTML, CSS, 그리고 JavaScript로 이루어져 있는데, 그 중 JavaScript는 웹의 동작을 표현하는 언어이다. JavaScript의 코드는 각 브라우저의 JavaScript 인터프리터로 실행 될 수 있는데 그 중 하나가 Chrome V8이다.

즉 Chrome 브라우저는 V8 엔진을 통해 JavaScript를 실행하는데, 이 V8엔진을 이용하여 브라우저가 아닌 OS환경에서 제공할 수 있게 한 것이 Node.JS이다.

비교하자면 Java와 JVM정도의 관계가 JavaScript와 Node.JS가 되겠다.

스크립트 언어인 JavaScript를 Node.JS를 통해 브라우저가 아닌 환경에서 실행할 수 있고, 심지어는 이걸로 백엔드 프로그래밍을 할 수 있게 되자 거의 사장될 뻔한 JavaScript는 엄청난 인기를 얻게 되었다. 즉, Node.JS로 JavaScript는 소위.. 떡상..했다.

 

#Node.JS의 특징

내가 생각하는 Node.JS의 핵심을 적어보자면 다음과 같다.

1. Single Thread

2. 비동기 이벤트 기반, Non - Blocking I/O

 

#Single Thread

Node.JS는 싱글 쓰레드로 동작한다. 

말 그대로 Node.JS는 단 하나의, 단일 쓰레드로 프로세스를 구동한다. 이는 JavaScript의 특징이기도 하다. JavaScript는 기본적으로 싱글 쓰레드 방식을 사용한다. 싱글 쓰레드 방식을 사용하기 때문에, 멀티 쓰레드를 사용하는 것처럼 끊김 없이 코드를 실행하기 위해 비동기적으로 코드를 실행하는 이유이기도 하다.

싱글 쓰레드의 이점으로는 아무리 작업이 많다고 하더라도, 메모리 사용량 및 리소스 사용량에는 변화가 거의 없어 대규모 네트워크에 적합하지만,

단점으로는 쓰레드가 하나이기 때문에 이 쓰레드가 무너진다면 프로그램 전체가 무너질 수 있다는 것이다.

따라서 이 특징을 알아야 어떤 서비스에  Node.JS를 써야 하는지, 말아야 하는지 생각할 수 있다.

Node.JS를 쓰면 좋은 서비스 : 

1) 로직이 간단한 서비스  = 하나의 로직을 처리하는데 오래 걸리지 않는 서비스

2) request가 많은 서비스

3) 빠른 응답 시간 및 빠른 개발 필요

EX) 채팅 서비스, 게시판 커뮤니티 등

Node.JS를 쓰면 위험한 서비스 : 

1) 로직이 복잡한 서비스 = 단일 작업 처리가 오래 걸리는 서비스

2) 설계가 복잡한 서비스 = 한번 에러가 나면 프로그램이 죽기 때문에, 코드의 품질을 높이기 힘든 설계가 복잡한 서비스는 어울리지 않음

 

#비동기(Asynchronous) 이벤트 기반, Non - Blocking I/O

먼저 JavaScript는 비동기적으로 동작한다. Node.JS의 특징이 아닌, JavaScript의 특징이다.

비동기적으로 동작한다는 것은 호출 되는 함수가 작업이 완료되는 것을 호출한 함수는 신경쓰지 않는다는 것이다.

즉, 비동기적으로 동작한다는 것은 어떤 함수의 요청이 완료될 때 까지 기다리지 않고, 이어서 다른 함수들을 실행한다는 것이다.

이를 callback으로 생각해보면, callback을 호출하는 함수는 결과를 기다리지 않고 바로 다음 함수를 실행하고 해당 함수의 결과가 나오면 그 결과값으로 처리하는 것은 callback 함수가 되는 것이다. 이것이 비동기 방식이다.

 

이벤트는 것은 말 그대로 event, 즉 어떤 사건이다. 이벤트 기반이라는 것은 이벤트가 발생했을 때 그 이벤트를 바탕으로 저장한 작업을 처리하는 방식을 의미하는데, 이벤트를 바탕으로 동작을 정의하고 처리하려는 상태를 모두 이벤트 리스너에 등록을 해 둬야 한다.

이렇게 이벤트가 발생했을 때, 이벤트 리스너에 저장해둔 방식으로 이벤트를 처리하는 것 이벤트 드리븐(Event Driven)이라고 하며 발생한 이벤트는 순차적으로 처리되고, 이렇게 순차적으로 처리하는 것을 관리해 주는 것 이벤트 루프이다.

함수가 호출되면 호출 스택(FILO = 선입후출 = 제일 늦게 들어간 것이 제일 먼저 처리됨)으로 쌓여 호출되는데, 이 스택에 쌓인 함수 중 백그라운드 처리가 필요한(ex. setTimeOut 등) 작업태스크 큐(FIFO)로 들어간다. 이후 호출 스택의 모든 함수가 처리가 되면 이벤트 루프에 의해 태스크 큐에 있는 작업들이 진행이 되게 된다.

 

Non - Blocking이란 직접 제어할 수 없는 대상(Ex. I/O)의 작업이 끝나는지 여부에 상관 없이 작업을 진행하는 것을 의미한다.

그런데 Non - Blocking과 비동기 처리가 굉장히 유사해 보인다. 둘 다 기다리지 않고 진행한다.. 같은 의미가 아닐까?

결론부터 말하자면, Non - Blocking과 비동기의 차이는 함수의 호출 이후 제어권에서 나온다.

비동기 : 함수가 호출되면 그 함수의 결과값은 callback 함수가 가지고 처리하고, 호출된 함수 이후의 함수들을 계속 실행, 따라서 제어권이 callback 함수에 존재한다.

Non - Blocking : 함수가 호출되면 그 함수를 바로 리턴하고 제어권을 호출한 함수로 넘겨주는 것. 따라서 호출된 함수가 작업을 처리하는 동안 바로 다음 I/O 작업등을 수행할 수 있다.

 

즉, Node.JS는 비동기 이벤트 기반의 Non - Blocking I/O라는 것은 각 함수의 결과값은 callback을 통해 처리하고(물론 Promise나 async / await을 통해 처리할 수 있다. 추후에 다룸), Non - Blocking I/O이기에 각 함수들은 호출이 된 즉시 제어권을 어플리케이션으로 넘겨 마치 멀티쓰레드의 환경처럼 프로세스를 진행할 수 있게 된다.

 

 

 

 출처 : 

medium.com/day34/node-js-노드는-무엇이고-어떠한-기능들이-있는가-1-98e49e1100ab

 

[Node.JS] 노드는 무엇이고 어떠한 기능들이 있는가? — (1)

안녕하세요. 캡틴체인입니다!

medium.com

seoyeonkk.tistory.com/entry/Nodejs-의-특징-및-장단점

 

[Node.js] 특징 및 장단점

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

seoyeonkk.tistory.com

namjackson.tistory.com/30

 

[NodeJS ]1. Nodejs 동작원리 및 이벤트 루프, 논블로킹I/O (Event Loop , Non-Blocking)

NodeJS란 ? 비동기 이벤트 기반 주도 , JavaScript 런타임으로써, Nodejs는 확장성 있는 네트워크 애플리케을 만들수 있는 언어. Chrome V8엔진 기반의 이벤트 기반( Event-driven ) , 논-블로킹 I/O ( Non-Bloc..

namjackson.tistory.com

velog.io/@codemcd/Sync-VS-Async-Blocking-VS-Non-Blocking-sak6d01fhx

 

Sync VS Async, Blocking VS Non-Blocking

1. Sync VS Async 먼저 Synchronous와 Asynchronous의 어원을 보자. Synchronous의 Syn는 together이란 뜻이고, chrono는 time이다. 따라서 Synchronous는 함께 시간을 맞춘다라는 뜻으로 해석된다. 반면에 A

velog.io

 

'Dev > NodeJs' 카테고리의 다른 글