[용어사전] Node.js란?
Node.js
Node.js는 자바스크립트 런타임 환경이다.
크롬의 v8엔진으로 구동되며, 네트워크 애플리케이션과 서버사이드 개발에 주로 사용된다.
Node.js가 탄생한 배경
웹사이트의 모습을 기술하기 위한 언어인 HTML은 그 자체로는 동적인 면이 없다.
그래서 동적인 웹사이트를 개발하기 위해 JavaScript를 사용한다.
브라우저가 JavaScript를 읽으면 그에 맞게 웹이 반응한다.
그러다가 크롬 브라우저 개발자들이 JavaScript를 해석하는 엔진인 v8엔진을 개발하였는데, 이 v8엔진이 성능이 매우 좋았다.
JS엔진의 성능이 좋아지자 JavaScript를 브라우저가 아닌 다른곳에서 사용하려는 움직임이 나타났고, 이러한 흐름속에서 Ryan Dahl이 CommonJS와 V8엔진을 이용해 만든 것이 Node.js이다.
Node.js의 특징
1. 논블로킹 I/O
블로킹(Blocking)은 막다라는 뜻이다.
여기서의 블로킹은 어떤 작업이 실행되는 동안 다음 작업이 실행되지 못하게 막아버린다는 의미이다.
I/O는 Input/Output의 의미로, 입출력을 의미한다.
즉, 파일의 입출력, 서버로의 어떠한 요청과 응답, 사용자의 입력(키보드, 마우스 등)등이 이러한 입출력에 해당한다.
블로킹 I/O는 입출력이 이루어지는 동안에 다음 작업이 실행되지 않는 것을 말한다.
예를 들어 파일을 읽는 명령어가 처리중이라면, 해당 파일을 다 읽을 때까지 프로그램이 멈추게 된다.
블로킹을 하지 않는다는 의미의 논블로킹 I/O은 그럼 어떻게 블로킹이 발생하지 않는 것일까?
이것이 가능한 이유는 I/O부분을 백그라운드(OS)에 맡겨버리기 때문이다.
I/O 부분에 대한 작업을 OS에게 맡기고, 이벤트 루프(Event Loop)가 OS에 맡긴 작업이 완료되었는지 지속적으로 검사한다.
이를통해 I/O작업을 기다릴 필요 없이 다른 작업들이 멈추지 않고 이루어질 수 있는 것이다.
이는 많은 요청을 처리해야하는 웹 서버에서 유용하다.
웹 서버가 여러 요청들을 받았을 때, 받은 요청을 순서대로 처리하면서 I/O작업을 매번 기다린다면 다른 클라이언트들은 이를 일일이 기다려야 한다.
하지만 논블로킹 I/O라면 I/O작업을 기다릴 필요 없이 다음 클라이언트에 대한 작업을 진행할 수 있다.
2. 싱글스레드(Single Thread)
스레드(Thread)는 프로세스 내에서 실행되는 작은 실행 단위이다.
프로그램이 실행되면 해당 프로그램이 프로세스에 올라가고, CPU가 프로세스 속 스레드들을 처리한다.
더 쉬운 이해를 위해 ChatGPT에게 물어보니 괜찮은 비유를 내놓았다.
📌 프로세스 = 회사
📌 스레드 = 회사의 직원
회사(프로세스)에는 여러 직원(스레드)이 있음.
직원들은 같은 사무실(메모리 공간)을 공유하면서 서로 다른 일을 수행할 수 있음.
직원들은 서로 정보를 공유할 수 있지만, 한 명이 잘못하면(예: 충돌 발생) 전체 회사가 멈출 수도 있음.
Node.js는 기본적으로 싱글스레드이다. (내부적으로는 멀티스레드를 이용하는 경우가 많지만 그건 다음에...)
싱글스레드란 이름 그대로 한개의 스레드만 실행하는 방식으로, 한 번에 하나의 작업만 수행하는 것을 의미한다.
따라서 한 작업이 끝날때까지 다른 작업을 하지 못한다.
이것이 '논블로킹 I/O'에서 말한 블로킹(Blocking)이다.
하지만 이러한 점은 이미 '논블로킹 I/O'에서 말했듯이 OS에게 I/O를 위임함으로써 블로킹을 해결하였다.
3. 크로스 플랫폼 지원
크로스 플랫폼이란 동일한 코드로 여러 OS에서 실행하는 것을 말한다.
Node.js에 사용한 V8엔진은 Windows, MacOS, Linux 등의 다양한 운영체제에서 사용할 수 있도록 만들어졌기 때문에 Node.js도 다양한 운영체제에서 사용이 가능하다.
4. npm(Node Packaged Manager)
npm(Node Packaged Manager)이란 자바스크립트를 위한 패키지 관리이다.
자바스크립트로 만들어진 모듈들을 패키징한 것이 Node.js의 패키지이며, 웹에서 설치하고 관리하는 것이 npm이다.
npm은 라이브러리랑 비슷한 개념인 것인데, 이러한 npm의 패키지들에는 여러 번들러, 웹 개발 프레임워크 등 매우 유용한 자바스크립트 모듈들이 존재한다. (이 중에는 React도 포함되어있다.)
인기있는 npm들을 둘러보고 싶다면 여기를 참고해도 좋을 것 같다.
npm의 장점으로는 다른 개발자들이 만들어놓은 npm을 편리하게 install하여 이용할 수 있다는 점이다.
또한 원하는 버전의 패키지들을 install하거나 패키지들을 업그레이드하는 것이 잘 되어있기 때문에 이러한 부분에서도 큰 유용성을 지닌다.
사용하는 패키지들을 명시해놓은 파일도 생성되기 때문에 다른 컴퓨터에서 프로젝트를 다운받거나, 다른 사람과 협업을 할 때에도 매우 편리하다. 그저 프로젝트를 받고, 필요한 패키지들을 간단한 명령어를 통해 일괄적으로 install하면 된다.
이러한 장점들로 인해 많은 회사들도 비공개 패키지들을 만들어 이용한다.
※ NVM은 Node Version Manager로 Node.js의 버전을 관리해주는 녀석이다. NPM과는 다르다.
마무리
조사 과정에서 스레드에 대한 부분이 더 깊이 공부할 여지가 많다는 것을 알게되었다.
조만간 스레드에 대한 부분도 공부해서 해당 주제로 훨씬 더 자세히 정리해보아야 겠다는 생각이 들었다.
스레드에 대해 더 공부함으로써 컴퓨터의 원리와 논블로킹 I/O에 대해 더 자세히 알 수 있을 것 같다는 느낌이 든다.
이와 더불어 Node.js와 관련된 이벤트 루프도 조사가 더 필요할 것 같다.
조사를 마치는 데로 해당 글에 추가해야 할 것 같다.
* 잘못된 부분, 오개념 지적은 저에게 큰 도움이 됩니다.
자료 조사 출처
Node.js - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. Node.js는 크로스플랫폼 오픈소스 자바스크립트 런타임 환경으로 윈도우, 리눅스, macOS 등을 지원한다. Node.js는 V8 자바스크립트 엔진으로 구동되며, 웹 브라우저
ko.wikipedia.org
Node.js의 정체를 알아보자 - 코딩애플 온라인 강좌
태초에 HTML이라는 언어가 있었습니다. HTML은 별거 아니고 그저 웹페이지를 만들 때 사용하는 언어입니다. 안녕하세요 이렇게 생겼고 웹페이지에 글, 그림, 버튼 이런걸 넣을 때 사용합니다.
codingapple.com
Node.js의 역사 간단하게 살펴보기 - Node.js는 왜 탄생하게 되었을까?
오늘은 Node.js의 역사에 대해 살펴보려고 합니다.
velog.io
프로세스와 스레드의 차이
프로세스와 스레드의 차이는 프로세스와 스레드, 그리고 프로그램이 작동하는 방식에 대해서 잘 이해하고 있는지 확인하기 위해 기술면접에서 단골 질문 사항으로 나온다.
velog.io
크로스 플랫폼 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 이 문서는 소프트웨어에 관한 것입니다. 비디오 게임 용어에 대해서는 크로스 플랫폼 플레이 문서를 참고하십시오. 크로스 플랫폼(영어: cross-platform) 또는 멀티
ko.wikipedia.org
크로스 플랫폼이란? : 장단점과 개념 총정리
크로스 플랫폼이란, 한 번의 개발로 다양한 환경에서 구현을 할 수 있는 개발 도구를 말합니다. Flutter, React native, Xamarin, MAUI 중 어떤 것이 제일...
spartacodingclub.kr
[JavaScript] npm이란?
npm이란 무엇일까?npm은 Node Packaged Manager의 약자입니다. 무슨 의미인지 한 번 추측을 해볼까요?&n...
blog.naver.com