본문 바로가기
Back-end/node js

nodejs에 대한 정리

by kkkdh 2022. 9. 2.
728x90

0. nodejs란???

nodejs 공식 홈페이지에 들어가면 다음과 같이 Node.js를 설명하고 있습니다.

node.js는 Chrome v8 JavaScript 엔진으로 빌드된 JavaScript 런타임이라고 합니다. 이 말이 정확하게 무슨 말인지 모르겠어서 모르는 용어를 하나씩 정리해 봤습니다.

 

1. Chrome v8 JavaScript 엔진

 

V8은 웹 브라우저를 만들 수 있는 기반을 제공하는 오픈소스 JavaScript 엔진으로 구글 크롬 브라우저와 안드로이드 브라우저에 탑재되어있는 엔진입니다.

 

V8 engine은 C++로 작성되었으며, V8 engine을 이용하여 인터프리터 언어인 JavaScript code를 바이트코드(byte code)로 컴파일한 후 실행하는 방식으로 JavaScript code를 실행할 수 있다고 합니다.

 

간단히 요약하면 기존에는 브라우저에 탑재되어 실행할 수 있었던 JavaScript 코드를 V8 엔진의 등장 이후에는 독립적으로 실행시킬 수 있게 되었다고 합니다.

 

2. 런타임

 

런타임이라는 말은 컴퓨터 프로그램이 실행되고 있는 동안의 동작을 의미하며, 컴파일 타임(compile time)을 마친 후 응용 프로그램이 동작되는 때를 지칭하기 위한 용어라고 합니다. 

 

JavaScript 사용 상황을 예로 들면, 브라우저에서 실행하는 경우 런타임 환경이 브라우저이고 nodejs를 이용해 실행하는 경우 런타임 환경을 nodejs라고 말할 수 있게 되는 것이죠

 

이제 다시 Nodejs의 소개말(?)을 해석하면 "nodejs는 V8 engine을 이용해 만들어진 JavaScript를 실행할 수 있는 프로그램이다."라고 정리할 수 있을 것 같습니다.

 


1. nodejs는 왜 사용할까??

저의 경우에도 nodejs에 대해서 이야기는 많이 들어봤지만, 처음에는 아 그냥 웹서버를 구동시킬 때 필요한 JavaScript 프레임워크? 아니면 라이브러리?인가 라고 생각했습니다.

 

하지만, 공부를 시작하고 알게된 결과 이 nodejs는 앞서 정리한 바와 같이 "nodejs는 기존에는 브라우저에 내장되어 있던 JavaScript를 독립적으로 수행할 수 있도록 하는 플랫폼이다."라는 결론을 얻을 수 있었습니다.

 

그래서 이 nodejs의 등장으로 인해 웹 페이지에 동적 요소를 추가하기 위한 목적으로만 사용되었던 JavaScript라는 프로그래밍 언어를 브라우저에서 벗어나 다양한 것을 만들기 위해 사용할 수 있게 된 것입니다.


2. nodejs의 특징

nodejs는 이벤트 기반, non-blocking I/O 모델을 사용해 가볍고 효율적이다.

이것도 한 번에 무슨 말인지 잘 이해가 되지 않기 때문에, 풀어서 정리해 보겠습니다.

 

우선 non-blocking I/O와 이벤트 기반이라는 특징을 정리하기에 앞서 프로세스와 스레드라는 용어를 알아야 합니다.

 

Process에 할당된 자원

프로세스(process):

운영체제로부터 시스템 자원을 할당받는 작업의 단위

메모리에 올라와 실행되고 있는 프로그램의 인스턴스 (실행된 프로그램의 개념)

 

프로세스는 운영체제로부터 각각의 독립된 메모리 영역 (code, data, heap, stack)을 할당받으며, 최소 1개의 스레드를 갖고 있습니다.

 

스레드(thread): 

프로세스 내에서 실행되는 여러 가지 흐름의 단위

프로세스가 할당받은 자원을 이용하는 실행의 기본 단위

 

스레드는 stack 영역만을 새로 할당받고 code, data, heap 영역은 process 내의 모든 thread가 공유해서 사용합니다.

 

Non-blocking I/O

일단 non-blocking I/O는 blocking I/O와 반대되는 개념으로 이전에 수행되고 있는 I/O 작업의 완료를 기다리지 않고 현재 프로세스에서 자원을 바로 사용하는 것을 의미합니다. (그렇다면 blocking I/O는 다른 프로세스에 의해 자원이 사용되고 있다면 자원 사용 완료 시까지 대기(blocked)하는 방식임을 알 수 있습니다!!)

 

위 개념들을 정리한 이유는 nodejs가 single thread non-blocking I/O 방식으로 동작하기 때문입니다.

 

앞서 설명한 바와 같이 blocking I/O 방식의 동작은 자원을 다른 프로세스가 점유하는 경우 사용 가능시까지 대기하는 과정으로 동작하기 때문에, 대기 시간이 발생하기 때문에 non-blocking I/O 방식의 동작보다 느린 수행 시간을 가집니다.

 

또한 multi thread로 동작하는 경우 병렬적으로 작업들을 처리하기 때문에 작업의 속도가 빠를 수 있지만, (single thread 방식이 혼자서 일을 처리한다면, multi thread 방식은 여러 명이서 일을 같이하는 것과 같은 개념이라고 생각하면 됩니다!) 이런 경우 자원 또한 많이 요구하게 되어 결국 여러 개의 thread가 제한된 자원으로 인해 대기하게 되는 문제가 발생한다고 합니다.

 

또한 multi thread 방식은 context switch(문맥 전환) cost 가 발생하는데, (이는 다른 작업으로 넘어가는 경우 필요한 환경을 바꾸는데 드는 비용이라고 생각하면 됩니다.) 이 cost 또한 증가하여 single thread non-blocking I/O 방식이 상대적으로 더 좋은 성능을 발휘한다고 설명할 수 있는 것입니다.

 

사실 nodejs의 장점으로 인한 비교일 뿐 각각의 방식에 따른 장단점이 있기 때문에, 각 방식의 절대적인 비교는 불가능합니다. 😓

 

Event-driven (이벤트 기반)

 

Node.js는 V8 engine + 비동기 작업을 처리하는 libuv 라이브러리로 구성되어 있습니다.

 

본래 JavaScript 자체는 비동기 처리를 할 수 없기 때문에, 비동기로 처리되는 코드의 경우에는 libuv 라이브러리를 이용해 처리하게 되는데, 이 작업을 event listener에 call-back 함수를 등록한다고 표현합니다.

 

(비동기 이벤트 기반은 특정 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식을 의미합니다.)

 

이벤트 기반 모델에서는 이벤트 루프(event loop)라는 개념이 등장하고, 이벤트 루프는 여러 이벤트가 동시에 발생하는 상황에서 call-back 함수의 호출 순서를 판단합니다.

 

앞으로 nodejs를 공부하며 정리한 내용을 기록해서 포스팅하려고 합니다!

 

잘못된 정보가 있다면, 댓글로 지적해주시면 감사하겠습니다!! 🙏🏻🙏🏻


3. 개념 정리를 위해 참고한 자료들..

nodejs 공부 방법 및 소개

▶ nodejs의 특징 개념 참고

nodejs 공식 홈페이지

728x90

댓글