Node.js는 웹 브라우저 외부에서 자바스크립트 코드를 실행하는 강력한 런타임 환경입니다. 자바스크립트 언어를 서버 사이드로 가져와 개발자들이 확장 가능하고 고성능, 이벤트 주도 애플리케이션을 구축할 수 있게 해줍니다.

Node.js 코드가 어떻게 작동하는지, 그리고 그 코드를 자바스크립트 내에서 어떻게 통합하여 실행할 수 있는지 알아봅시다.

Node.js를 사용함으로써 개발자는 클라이언트 사이드와 서버 사이드 모두에서 자바스크립트를 사용할 수 있게 되면서 단일 언어와 생태계를 제공합니다. 이는 문맥 전환의 필요성을 없애고 프론트엔드와 백엔드 간의 코드 재사용을 가능하게 해줍니다. 결과적으로 생산성이 향상되고 개발 시간이 단축됩니다.

Node.js는 Node 패키지 매니저(npm)를 통한 방대하고 활발한 모듈 및 라이브러리 생태계를 가지고 있습니다. 이 풍부한 생태계는 웹 프레임워크, 데이터베이스 커넥터, 인증, 테스팅 프레임워크와 같은 다양한 기능에 대해 사용 가능한 도구와 패키지를 제공합니다.

개발자들은 이러한 모듈들을 활용하여 개발을 가속화하고 애플리케이션 기능을 향상시킬 수 있습니다.

이 모든 것을 감안할 때, Node.js는 특히 다음을 위한 구축에 적합합니다:

  • 웹 애플리케이션
  • 확장 가능한 API
  • 채팅 애플리케이션과 멀티플레이어 게임과 같이 즉각적인 데이터 업데이트와 양방향 통신이 필요한 실시간 애플리케이션
  • 오디오나 비디오 처리, 실시간 분석과 같은 스트리밍 애플리케이션
  • 싱글 페이지 애플리케이션
  • 사물인터넷(IoT) 배포

이 모든 것이 유용한 웹 애플리케이션용으로 좋은 조합처럼 들린다고 생각하시나요? 그렇게 생각한답니다. 그럼 이 모든 것이 어떻게 작동하는지 살펴봅시다.

Node.js 서버 환경 구축하는 방법

첫 번째로, Apache HTTPD나 NGINX와 같은 타사 웹 서버를 설정하고 실행하거나 /var/www/html 디렉토리 계층 구조 내에 콘텐츠를 위치시킬 필요가 없습니다. 그 이유는 Node.js가 웹 서버 프레임워크를 비롯한 여러 기능을 하기 때문입니다.

이것이 무엇을 의미하는지 보여드리겠습니다. 필요한 Node.js와 종속성들을 설치했는지 확인해야 합니다. 대부분 NPM 패키지 매니저를 사용해 설치를 진행합니다. 공식 웹사이트에서는 운영 체제에 Node를 설치하는 방법에 대한 탁월한 문서를 제공합니다.

다음 명령을 실행해 Node와 NPM이 사용할 준비가 되어 있는지 확인할 수 있습니다:

$ node -v
v18.16.0
$ npm -v
9.5.1

작업을 위한 HTML을 가지고 있다면, 기본 index.html 파일을 찾거나 만들어서 로컬 디렉토리에 저장하세요. 빠르고 간단한 것이 필요하다면, 내 웹사이트에서 LPI 페이지의 html을 다운로드 하는 이 명령을 사용할 수 있습니다:

wget https://bootstrap-it.com/lpi/

저희가 사용한 Node 서버의 server.js 코드를 살펴봅시다.

const http = require('http');
const fs = require('fs');

const server = http.createServer((req, res) => {
  // HTML 파일 읽기
  fs.readFile('index.html', 'utf8', (err, data) => {
    if (err) {
      res.writeHead(500, { 'Content-Type': 'text/plain' });
      res.end('Error loading HTML file');
      return;
    }

    res.writeHead(200, { 'Content-Type': 'text/html' });
    res.end(data);
  });
});

const port = 3000;
server.listen(port, () => {
  console.log(`서버가 http://localhost:${port}에서 실행 중입니다.`);
});

그 코드를 한 섹션씩 짚어가면서 살펴봅시다. 우리는 웹 호스팅을 관리하는 http와 HTML 파일을 읽는 데 필요한 fs라는 두 가지 필수 모듈을 로드합니다.

const http = require('http');
const fs = require('fs');

그 다음 server라고 불리는 서버 함수를 생성합니다. 호출할 때 index.html 파일을 읽고 서비스하거나(200 성공 코드 생성) 파일 읽기에 문제가 생길 경우 500 에러 메시지를 생성합니다.

fs.readFile('index.html', 'utf8', (err, data) => {
  if (err) {
    res.writeHead(500, { 'Content-Type': 'text/plain' });
    res.end('Error loading HTML file');
    return;
  }

코드는 계속해서 3000을 애플리케이션을 위한 수신 포트로 설정합니다 — 물론 기술적으로 1에서 65535 사이의 값을 원한다면 변경할 수 있습니다.

const port = 3000;

마지막으로, listen 메서드를 사용하여 서버 함수를 호출하고 포트 번호를 지정하여 console.log에 항목을 작성합니다.

server.listen(port, () => {
  console.log(`서버가 http://localhost:${port}에서 실행 중입니다.`);

Node.js 서버 실행하기

프로그램 파일들이 있는 동일한 디렉토리에서 npm init 명령을 실행하면 새로운 Node.js 프로젝트를 초기화하고 package.json 파일을 생성하는 데 사용됩니다.

package.json 파일은 프로젝트의 메타데이터 및 프로젝트의 구성 정보, 종속성, 스크립트 등에 대한 매니페스트로 사용됩니다.

파일에 수동으로 종속성을 추가하거나 다음을 사용할 수 있습니다:

npm install <package-name>

…이는 패키지와 해당 버전을 package.json의 종속성 섹션에 추가하게 됩니다.

실제로 새 프로젝트를 위한 디렉토리를 초기화하기 위해 npm init을 실행할 때, 스크립트는 몇 가지 질문을 할 것입니다. npm이 제안하는 기본값은 버전 번호로 1.0.0을 사용하고, 진입점으로 index.js를 사용하는 것입니다.

또한 git repo, 키워드, 사용자 라이선스 모델 선택 등의 옵션을 설정할 수 있습니다. 모든 기본값이 문제없이 작동해야 합니다.

그 작업이 끝나면, 스크립트는 설정에 대한 제안된 JSON 형식의 버전을 보여주고 승인을 요청합니다. 생성된 package.json 파일은 그 설정을 반영할 것입니다.

저희 프로젝트의 경우, MySQL 데이터베이스 커넥터 모듈과 express.js를 설치하세요:

$ npm install mysql
$ npm install express.js

이 작업은 몇 초 밖에 걸리지 않습니다. 이 모든 작업이 끝나면 동네에 새로운 파일이 생겼다는 것을 알게 됩니다: package-lock.json.

그 파일 내부를 들여다보면 많은 JSON 내용을 볼 수 있습니다. 그게 무엇을 위한 것일까요? package-lock.json 파일은 프로젝트에 대한 종속성을 설치할 때 npm에 의해 자동으로 생성됩니다. 이는 프로젝트의 확실한, 재현 가능한 빌드를 보장하는 잠금 파일로서의 역할을 합니다.

다른 개발자들이나 배포 환경이 프로젝트에서 사용된 정확한 종속성 트리와 버전을 재현할 수 있도록 하기 위해 package-lock.json 파일을 버전 제어 시스템(예: Git)에 포함시키는 것이 중요합니다. 이를 통해 일관성을 유지하고 종속성을 작업할 때 발생할 수 있는 잠재적인 충돌이나 놀라움을 피할 수 있습니다.

또한 init 작업에 의해 자동 생성되고 채워진 새 node_modules 디렉토리도 있습니다. 이 디렉토리는 프로젝트가 의존하는 모든 패키지와 모듈을 저장하는 위치입니다. npm install을 사용하여 패키지를 설치하면 다운로드된 패키지가 여기에 배치됩니다.

npm은 각 패키지의 필요한 종속성을 자동으로 해결하고 설치합니다. node_modules 디렉토리 내에 프로젝트의 종속성 트리를 반영하는 계층 구조를 생성합니다.

서버를 시작하는 것은 간단합니다:

$ node server.js

서비스를 보려면 브라우저를 열고 3000번 포트를 사용하여 애플리케이션 URL로 이동합니다. 브라우저가 Node 서버와 같은 기계에 있을 경우, 이것이 어떻게 보일지는 다음과 같습니다:

localhost:3000

물론 실제로 단지 그것만으로 Node.js가 필요한 것은 아닙니다. Node.js의 가치는 백엔드 데이터베이스와 통합하여 사용자 상호작용을 구축하는 데서 옵니다. 그것은 Express.js를 사용하여 가능할 수 있지만, 그것은 다음 기회에 다루어야 할 것입니다.

마무리

여기서 보신 것은 Node.js 환경을 구축하는 마법이 어떻게 상호작용적이고 동적인 서버를 출시하고 유지하기 위한 모든 인프라와 백엔드 기능을 제공하는지에 대한 것입니다.