본문 바로가기

Javascript/Basic

Node.js란?

* 목차

 - Intro

 - Runtime이란?

 - Javascript란?

 - Node.js란?

 


Intro

필자는 지금까지 C/C++, Java, Python으로 주로 개발을 진행해 왔습니다. 그러다 어느날 Web 개발에 몸을 담기 시작했고, Node.js를 마주하게 되었습니다. 도대체 Node.js란 무엇일까요?

 

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

 

감사합니다.

 

 

 

* reference

https://nodejs.org/ko

 

 

 

 

 

 

 

 

 

라고 끝낼 순 없죠ㅎㅎㅎ 이 글은 Node.js가 무엇인지 정확하게 이해하기 위한 것이 목적입니다. Node.js를 제대로 알고 개발하는 것과 Javascript 문법만 대충 알고 개발하는 것은 많은 차이가 있다 생각합니다."Chrome V8 Javascript Engine으로 build된 Javscript runtime" 문장을 이해한 사람은 Node.js가 무엇인지 이해했을 것이고 저 문장을 이해하지 못한 사람은  Node.js란 "javascript 기반 backend server"라는 이상한 말을 하기 쉽습니다.

 

이 글에서는 Node.js에 대해서 정확한 이해를 할 수 있도록 배경을 설명하는 시간을 가져보도록 하겠습니다.

 

 


Runtime이란?

Javascript와 runtime을 이해해야 하는데 runtime을 이해하려면 우선 Compile을 이해해야 하고 Compile을 이해하려면 3가지를 이해해야 합니다.

 

 1. 사람이 이해하는 문자로 된 code

 2. 기계가 이해하는 binary로 된 code

 3. 사람이 이해하는 문자를 기계가 이해하는 binary로 바꿔주는 Compiler

 

이 3가지를 이해한다면 Compile을 이해할 수 있습니다. 간단한 동작예시를 그림으로 그려보았습니다. 먼저 사람이 이해 할 수 있는 C++언어로 Fibonacci를 구하는 함수 코드를 작성합니다. 그 다음에는 g++ compiler가 동작하여 C++ Source Code를 기계가 이해하는 binary로 바꿔주는 모습입니다.

 

이 작업을 Compile이라고 합니다. 그리고 이 작업이 일어나는 시간과 환경Compile Time이라고 합니다. 그리고 C++ Source Code가 제대로 작성이 안되어 있는 경우 Compile을 제대로 수행하지 못해 문제가 생겼을 경우, 이때 생기는 Error를 Compile Error, 혹은 Compile Time Error라고 합니다.

 

왜 갑자기 Compile Time을 이야기 하는 걸까요? 바로 Runtime을 이야기 하기 위해서입니다.

 

Runtime이란 프로그램이 실행되고 있는 상태와 환경을 의미합니다.

 

1. Compile Time : Compile하는 동안의 상태와 환경

2. Runtime : 프로그램이 동작하는 동안의 상태와 환경

 

아래 그림을 보시면 Compile Time 이후에 프로그램이 실행(execute)되고 running이 되는 영역에 Runtime으로 표시를 한 것을 알 수 있습니다.

 

C++에서 Runtime은 Binary Code를 구동하기 위한 모든 요소를 포함합니다. Hardware 요소로는 CPU, Memory, Storage등이 있고 Software 요소로는 C++ std library 등이 있습니다. 만약에 runtime단계에서 Program이 제대로 동작하지 않는 것을 감지해 문제가 생겼을 경우, 이때 생기는 Error를 Runtime Error라고 합니다.

 

Runtime Error는 프로그램 실행중에 생긴 Error라는 것을 의미한다.

 

Python같은 경우는 어떨까요?  Python은 Interpreter언어로 Compile 언어인 C++과는 다릅니다. Code 전체를 기계(예 : CPU)가 이해할 수 있는 Binary code로 Compile하지 않고 줄 단위로 Compile하여 실행합니다. 

번호 순서에 따라서 어떻게 동작하는지 잘 확인해 봅시다.

 

C기반으로 만들어진 Python interpreter인 CPython은 가장 대중적인 interpreter입니다. 그리고 CPython은 Python Source Code의 실행환경이라 할 수 있습니다. CPython은 코드의 실행, 메모리 관리, 예외처리, 모듈 및 패키지 로딩, 표준 라이브러리, 데이터 구조 등 Python 프로그램이 실행 중일 때 필요한 모든 환경을 제공합니다. 즉 CPython Interpreter는 Python의 Runtime인 셈이죠.

 

그렇다면 Javascript의 runtime환경이란 어떤 것을 의미할까요? 네 바로 Javascript를 실행할 수 있는 환경을 의미합니다.

그런데 궁금한 점이 있습니다. JavaScript Interpreter는 어디에 있는 것일까요? Node.js는 JavaScript Interpreter라 해도 되는 것일까요? 이 점을 알려면 JavaScript에 대해서 좀 더 알아봐야 합니다.

 

 


JavaScript란?

JavaScript란 무엇일까요? Javascript의 탄생배경부터 알아보겠습니다.

 

1990년대에는 Web service를 하기 위해서 index.html 파일을 만들어 사용자 PC에 전송하는 방식을 사용했습니다. 하지만 html 형식은 글자, 이미지, 기타 Contents 전송면에서는 편리할 수 있어도 동적인 Page(사용자 입력에 따라 page가 변하는 방식. html만으로는 한계가 명확하다) 를 만들기는 어렵습니다.

javascript와 동적인 Page가 무엇인지 모르시는 분들은 https://html-css-js.com/ 에 접속하셔서 한번 체험해 봅시다.

 

이러한 점을 채워줄 수 있도록 만들어진 Script 언어가 바로 1995년에 나온 JavaScript입니다. 이 JavaScript는 Netscape사의 Browser인 Netscape Navigator에 LiveScript란 이름으로 처음으로 도입되었습니다. 즉 Netscape Navigator Browser에는 JavaScript를 실행할 수 있는 interpreter가 최초로 포함되었다는 것이죠.

 

JavaScript는 기존의 프로그래밍과는 좀 다른 부분이 있습니다. 기존의 프로그래밍은 개발자들이 자신의 개발환경에서 Code를 테스트 한 후 Compile된 Binary file을 배포하는 형태였다면, JavaScript는 Web service에서 구동되어야 하기 때문에 Javascript Code를 사용자의 Browser에 전송해 구동해야 합니다.(Python도 binary가 아닌 code 자체를 배포하죠. Interpreter 언어의 숙명...) 그리고 사용자들은 각자 원하는 Browser(Internet Explorer, Chrome, Firefox, Safari, Opera, ...)를 설치해서 Web service를 경험합니다.

너무나도 다양한 Broswer들

 

이 말은 즉 Browser마다 고유의 웹 표준과 JavaScript Interpreter가 존재했다는 의미입니다. 이런 다양한 Browser들에서 동일한 사용자 경험을 제공하도록 해야하는 Web 개발자들에게 이런 환경은 최악이었습니다.

 

꽤 많은 시간이 흐르고, 현재는 다행히도 ECMA기관에서 JavaScript를 표준화(ECMAScript)를 추진하여 대부분 해당 표준을 따르고 있습니다. 그리고 이 표준을 따르는 Browser 중에서 Chrome Browser가 현재(2023-09-28) 점유율 1위를 차지하고 있습니다. 

https://gs.statcounter.com/

 

그래서 지금은 Chrome Browser에서 사용하고 있는 JavaScript Interpreter가 사실상 국제 표준이 되었고 대다수의 Browser가 이 Interpreter를 채용하고 있습니다. 이 Interpreter를 Chrome V8 JavaScript Engine 이라고 합니다. 그리고 Node.js는 JavaScript를 실행하기 위해 Chrome V8 JavaScript Engine을 interpreter로 사용하고 있습니다.

Chrome V8 JavaScript Engine

 

이제는 Node.js를 설명하는 "Chrome V8 JavaScript 엔진으로 Build된 JavaScript Runtime" 문장이 어느정도 이해 되셨으리라 생각합니다. 그럼 이제 마지막 질문입니다. Node.js와 Chrome V8 Javascript Engine은 동일한가요?

 

 


Node.js란?

Node.js의 목적은 확장성 있는 Network Application을 만드는 것입니다.

공식문서의 설명입니다.

 

Node.js가 Network Application을 구현하려면 JavaScript의 기본 기능(V8)만으로는 부족합니다. 그래서 C++기반 API를 더해서 Network Application을 구현하게 됩니다. 

Node.js의 API 설명. JavaScript에는 없는 기능들이 대다수이다.

 

 

 

Chrome browser도 사실 Node.js와 마찬가지로 JavaScript의 기본 기능만으로는 Browser를 구현할 수 없습니다. 그래서 Web API를 더해서 Browser를 구현합니다. 비교를 위해 setTimeout() 함수를 예로 들어보겠습니다. Node.js는 C++ API에서 setTimeout 함수를 제공하고, Browser에서는 Web API에서 제공합니다. 하지만 v8 engine에서는 setTimeout 함수를 제공하지 않습니다.

 

Web API에서 setTimeout를 지원한다.

 

Node.js에서도 setTimeout을 지원한다.

 

하지만 v8에서는 setTimeout을 지원하지 않는다.

 

 

이러한 이유로 Node.js는 Chrome broswer와 API 차이가 존재합니다. Node.js는 browsing관련 api들을 사용할 수 없습니다.

browser에서는 alert 함수를 사용할 수 있다.

 

nodejs에서는 alert 함수를 사용할 수 없다.

 

 

반대로 Chrome에서 할 수 없는 파일 시스템에 직접 엑세스와 같은 기능들을 Node.js는 할 수 있습니다.

Node.js는 file을 읽을 수 있다.

 

목적이 다른 node.js와 Chrome Browser는 다음과 같은 차이를 보이게 됩니다.

  Node.js Chrome Browser
목적 비동기 주도 Network Application 설계, 개발을 목적으로 하는 Runtime 사용자 interface를 제공하는 Web Brower
공통점 JavaScript Interpreter로 Chrome V8 JavaScript Engine을 사용
차이점 Network Application 목적 C++ API 사용 Browser 목적 Web API 사용
특징 Backend Server에 주로 설치
Network Application 관련 API 제공
CommonJS 모듈 시스템 사용
전역객체 : global
사용자 환경에 주로 설치
Browser 관련 API 제공
import, export 모듈 시스템 사용
전역객체 : window
예시 코드 const fs = require('fs'); alert("this is browser")

 

이러한 점들을 종합해 보면 Node.js는 Network Application API를 지원하는 JavaScript runtime 이며, 이는 Chrome Browser와 어떤 차이점이 있는지를 확실하게 알 수 있습니다.

 

 


마치며...

Node.js는 JavaScript 언어로 개발할 수 있는 Backend Server입니다...라고 해도 많은 사람들이 별말 없이 넘어갈 수 도 있습니다. 하지만 이것은 마치 "Python은 Python 언어로 개발할 수 있는 Backend Server"라고 하는 것과 같습니다. 문장이 말이 안되죠? 제대로 된 문장을 쉽게 이해할 수 있도록 다른 개발 언어도 포함해서 예시를 들어보겠습니다.

 

예1) Java 언어로는 Spring 기반으로 Backend Server를 구성 할 수 있고 그 환경은 JRE가 될 것입니다.

예2) Python 언어로는 Django 기반으로 Backend Server를 구성할 수 있고, 그 환경은 CPython이 될 것입니다.

 → JavaScript 언어로는 Express 기반으로 Backend Server를 구성할 수 있고, 그 환경(Runtime)은 Node.js입니다.

 

이제 우리는 다음과 같이 제대로 말할 수 있습니다.

 

Node.js란 : JavaScript로 Backend Server를 구성하기 위해 주로 사용되는 JavaScript Runtime입니다.

 

이제는 Node.js에 대한 명확한 이해와 함께 JavaScript(+Express)로 Backend Server를 구성해 보시기 바랍니다. 감사합니다.

 

 


* reference

https://developer.mozilla.org/en-US/docs/Web/API

https://nodejs.org/dist/latest-v20.x/docs/api/

https://v8.github.io/api/head/index.html

https://v8.dev/

https://html-css-js.com/

https://gs.statcounter.com/

https://web.archive.org/web/20070916144913/https://wp.netscape.com/newsref/pr/newsrelease67.html

https://nodejs.org/ko

https://en.wikipedia.org/wiki/Runtime_(program_lifecycle_phase) 

'Javascript > Basic' 카테고리의 다른 글

JavaScript 비동기 완벽하게 이해하기  (0) 2023.09.30