Blog

Node.js란?

Node.js로 백엔드 구성하기
Table of Content

Node.js란?

Node.js는 Chrome V8 JavaScript 엔진으로 빌드된 JavaScript 런타임입니다. -Node.js는 공식 홈페이지-
자바스크립트(Javascript)의 특징
JavaScript는 HTML을 동적(Dynamic)하게 바꿔주는 기능을 하게 하는 스크립트이다.
자바스크립트는 본래 웹 브라우저에서만 동작하는 프로그래밍 언어
따라서 프론트엔드만 커버할 수 있었지만 Node.js는 JavaScript를 웹 브라우저로부터 독립시켜 서버 구현을 가능하게 함
이처럼 특정 언어가 구동되는 환경을 ‘런타임’이라고 한다.
쉽게 말해 기존 자바스크립트의 런타임은 오직 웹 브라우저뿐이었는데, Node.js로 새로운 런타임(실행환경)이 생긴 것으로 이해
V8 엔진은 원래 구글이 웹 브라우저인 Chrome의 성능을 높이려는 목적으로 개발
이전까지의 JavaScript 엔진들은 코드가 많아질수록 속도가 느려진다는 단점이 있었음
코드 번역 방식을 바꿔 속도를 획기적으로 개선함, 구글이 이를 오픈소스로 공개하면서 전 세계적으로 V8엔진을 활용해 웹을 개발할 수 있게 됨
Node.js는 비동기 이벤트 기반 JavaScript 런타임이다. - MDN
2008년에 구글이 V8 엔진을 사용하여 크롬을 출시했는데, V8 엔진은 엄청 빨랐고, 오픈 소스로 코드도 공개되었. 그 기능을 좀 더 더해서 V8 엔진 기반에 노드 프로젝트를 시작했고, Node.js(V8)이 등장했다.
웹 서버와 같이 확장성 있는 네트워크 프로그램 제작을 위해 고안되었다.
쉽게 말해 JavaScript 기반 런타임 환경으로 브라우저 내에서 말고도 다른 환경에서 자바스크립트를 사용할 수 있게 해주는 실행환경이다.
Node.js가 자바스크립트를 컴퓨터에서 쉽게 실행시켜줬기 때문에 자바스크립트를 프로그래밍 언어처럼 사용하기 시작했다.

Node.js를 서버로 만드는 이유?

그렇다면 왜 새로운 런타임 환경까지 만들면서 JavaScript를 사용하고자 했을까?
JavaScript가 높은 생산성과 편리함을 지녔기 때문
프론트엔드 주요 언어이기 때문에 백엔드까지 영역을 확장하게 되면서 풀스택 개발이 훨씬 수월해짐
Node.js의 핵심은 크게 3가지이다.
1.
Non-blocking I/O(I/O 작업이 다른 작업들에게 영향을 미치지 않고 비동기적으로 처리되도록 하는 기술)
2.
코드가 매우 짧고 쉬워서 빠른 개발 가능
3.
웹서비스 제작에 적합
여기서 특히 Non-blocking I/O 특징을 통해 Node.js로 구현하면, 요청이 많거나 오래 걸리는 요청이 있어도 멈추거나 요청 대기시간이 없다는 것이다. (비동기식 이벤트 기반 아키텍처)
비동기식 이벤트 기반 아키텍처란?
동기식(Synchronous) VS 비동기식(Asynchronous)
Node.js는 비동기 I/O를 지원하며 Single-Thread 기반으로 동작하는 서버이기 때문에 요청을 처리하면서 다음 요청을 받을 수 있다.
병렬처리를 Thread 로 처리하지 않으므로 Multi-Thread가 갖는 근원적인 문제에서 자유로운 특징이 있다.(멀티스레드는 스레드 1개의 오류가 전체 프로세스에 영향을 주는 등)
요청 순서: 코드가 실행되는 순서는 동기적으로 진행
즉, 요청1, 요청2, 요청3, 요청4와 같은 순서로 코드가 작성되면, 이 요청들은 순차적으로 실행
비동기 처리: 하지만 각 요청의 처리 결과는 비동기적으로 처리되기 때문에, 요청이 완료되는 순서는 요청을 보낸 순서와 다를 수 있음. 예를 들어, 요청1이 1초 후에 완료되고, 요청2가 500ms 후에 완료된다면, 요청2의 결과가 먼저 출력될 수 있다.
이벤트 루프: 이벤트 루프는 비동기 작업이 완료되면 해당 작업에 등록된 콜백 함수를 호출합니다. 이때, 비동기 작업의 완료 시점에 따라 콜백의 실행 순서가 결정되므로, 요청의 결과가 도착하는 순서는 요청을 보낸 순서와 다를 수 있습니다.
결론적으로, 요청을 보내는 순서는 동기적으로 진행되지만, 결과가 도착하는 순서는 비동기적으로 처리되기 때문에 다를 수 있음, 이러한 비동기 처리 방식이 Node.js의 주요 특징 중 하나이며, 이를 통해 높은 성능과 효율성을 제공

환경구축

VSCode 설치
Node.js 설치 환경 구축(MacOS기준)
Node.js 설치 환경 구축(Windows)
nvm으로 Node.js 설치(위 해결 후 공통)

NVM vs NPM?

두 용어가 나타나서 혼동될 수 있지만 풀어쓰면 명확해진다.

nvm - Node Version Manager

nvm 은 Node.js 를 설치하는 툴이라 이해하자.
Node.js 의 각 버젼을 유지하면서 시스템을 구성해야 하는 경우를 위해 사용하는 경우에 많이 이용된다. 다시말해 같은 시스템 안에서 여러 Node.js 를 사용하기 위해 버젼별로 Node.js 환경을 격리시키는 역할

npm - Node Package Manager

node에서 다양한 라이브러리를 다운로드하는 패키지 매니저로 보면 된다.
노드 패키지 매니저. 간단하게 얘기하면 npm 서비스를 통하여 Node.js 로 개발된 프로그램을(npm 패키지) 편리하게 설치, 업데이트 및 삭제를 해 주는 프로그램이다.
Node.js 를 설치하면 npm 도 같이 설치된다.
Java를 기준으로 생각하면 maven과 같이 다양한 패키지들을 다운로드 할 수 있는 경로로도 알고 있으면 된다. Java의 MavenCentral처럼 npm에서도 다양한 라이브러리 의존성(node진영에선 주로 모듈이라고 부르는것 같다.)들을 검색하고 다운로드 할 수 있다.
모듈과 패키지, 라이브러리 모두 결국 함수의 집합이다. 물론 정확한 개념은 차이가 있지만 메인언어의 진영마다 통상적으로 부르는 용어의 차이가 존재하는것으로 보인다. 자바진영에서는 코드상의 동작과 관련된 개념은 대부분 메서드라는 명칭을 쓰지만 JS진영에서는 대부분 함수(function)이라고 부르는 것처럼 라이브러리나, 모듈이나 결국 특별한 기능을 하는 함수의 집합이라고 보는게 편하다.