NodeJS

[Node.js] Node.js의 정의

갓태희 2021. 5. 28. 17:05

NodeJS란 ?

크롬 V8 자바스크립트 엔진으로 빌드된 자바스크립트 런타임입니다. 라고 정의가 공식 홈페이지에 나와있다.

위의 정의를 가지고 하나하나 따져보면 흔히들 노드를 서버라고 많이 말을해서 노드를 서버로 알고있는 사람이 많은데 위의 Node의 정의를 보면 서버라는 말이 하나도 안나와 있는것을 확인할수 있다. 즉, 노드는 서버가 아니다

그럼 노드는 자바스크립트 엔진일까 ? 노드는 자바스크립트 엔진도 아니다. 자바스크립트 엔진은 여러가지 가 있겠지만 적어도 크롬에서의 자바스크립트 엔진은 V8을 사용하며 이것은 노드가 아닌 엔진이다.

그럼 도대체 Node는 무엇인가 ?

노드는 V8이라는 자바스크립트 엔진위에서 돌아가는 런타임이다. 즉 노드는 자바스크립트를 실행시켜주는 역할을 한다.
앞으로 배우겠지만 node (자바스크립트 파일명)을 통해서 node는 자바스크립트를 실행시켜준다.

Node 이전에는 어떤 방식으로 자바스크립트를 실행시켰나 ?

브라우저가 아니여도 HTML이 아니여도 JS를 실행시킬수 있는 Node같은 런타임이 있었지만 속도문제를 해결하지 못하는등의 여러가지 측면에서 성과가 부족했다. 그래서 이러한 속도문제를 크롬의 V8엔진 위에서 동작하는 런타임인 노드가 주목을 받게되었다.

자바스크립트를 실행시킬수 있는 방식

나는 HTML -> CSS -> JavaScript 순으로 공부를 하면서 자바스크립트를 알게됬는데 항상 HTML 소스코드의 script태그안에 자바스크립트 코드를 적게되거나 아니면 .js파일을 아예 하나만들어서 body태그 끝나는 지점에 link하는 식으로 자바스크립트를 실행하였다. 그러나 이러한 방식은 자바스크립트가 HTML에 종속될수 밖에 없는 구조인데 노드를 설치하게 되면 바로 위에서 잠깐 보였듯이 node (자바스크립트 파일명)을 통해 크롬의 V8엔진이 자바스크립트를 HTML의 종속없이 해석해주는 방식으로 실행시킬수 있게된다.

브라우저와 HTML에서 해방된 자바스크립트

자바스크립트는 브라우저와 HTML에 종속되어있기 때문에 DOM객체들을 조작함으로써 정적인 HTML문서를 동적으로 조작할수 있게 되었다. 아주 훌륭한 역할을 HTML에서 하고 있지만 자바스크립트를 사용하는 개발자들은 단순히 웹문서를 조작하는것 뿐만 아니라 자신의 게임, 앱, 데스크탑 프로그램등을 자바스크립트로 만들면 좋을것 같다는 생각을 하게됬는데 Node를 통해서 브라우저와 HTML의 종속성에서 벗어난 자바스크립트는 이를 실현시킬수 있었다. 이것이 자바스크립트가 브라우저와 HTML에서 벗어나는게 왜 중요한지에 대한 이유가 될수 있겠다.

노드는 서버인가 ?

분명 앞에서 나는 노드가 서버가 아니라고 강조를 했는데 왜 다시 주제를 삼아 얘기하고있을까? 노드는 서버이다.라는 말이 엄밀히 말하면 틀렸고 좋게좋게 보면 맞는말이기도 하기 때문이다. 왜냐하면 노드는 서버역할을 수행할수 있기때문인데, 이는 노드자체가 서버라는 말은 아니며 자바스크립트코드중에 서버역할을 수행하는 코드를 노드가 실행하면 그때 노드는 서버역할을 수행하고 있다라고 말할수 있기 때문에 좋게좋게 생각하면 "노드는 서버이다" 라고 할수 있다.

자바스크립트의 내부 구조

자바스크립트의 내부 구조는 C, C++로 되어있는데 이는 대부분의 다른언어도 마찬가지이다. 대표적인 예로 자바가 있는데 자바는 C언어를 기반으로 만들어진 언어이다. 그렇다면 내부 구조를 왜 C,C++로 만들었을까? C,C++은 기계끼리의 대화에 있어서는 좋기때문이다. 이말은 기계적인 처리에 있어서 다른언어보다 빠르니 내부에서 사용하기에 적합하다. 그럼 C,C++을 쓰면 될걸 왜 이러한 기반을 가지고 자바스크립트라는 언어가 굳이 탄생했을까 ? C,C++은 기계적인 측면에서는 빠르지만 우리와 같은 사람, 즉 프로그래머가 다루기에는 잘 와닿지 않은 코드들이 많고 메모리관리와 같은 일을 사용자가 직접해줘야한다. 이러한 단점이 있기때문에 내부적인 역할은 C,C++을 기반으롤 하되 사용자에게 좀더 친숙하고 다루기쉽게 만들기 위해 자바스크립트가 탄생하였다.

위의 사진은 자바스크립트의 내부 구조이며 실제로 V8은 C++을 기반으로 만들어 졌으며 여기서 더 눈여겨 볼것은 바로 libuv이다. libuv는 자바스크립트와 노드에서 비동기를 구현해준다는 측면에서 매우 중요하기 때문이다. 또한 노드가 뜬 이유중에 하나는 싱글 스레드이면서 비동기인 모델이기 때문인데 이게 엄청난 장점이다. 자바와 같은 언어에서는 멀티스레딩을 하곤했지만 그 멀티스레딩을 구현하는 작업자체가 쉬운일이 아니다. 따라서 멀티스레딩을 가지고 충분한 성능을 내지못하는사람이 많고 실제로 원하는 성능을 내지 못한다. 그래서 멀티 스레딩을 잘활용하지 못하는 초보 개발자는 많이 해메게 되는데 노드는 이러한 작업을 싱글스레드와 비동기 방식으로 조금더 쉽게 해주어 빠른 성능을 이끌어낼수 있다.