Node.js

[ Node.js ] 01. 노드(node.js)의 정의

변쌤(이젠강남) 2024. 4. 28. 15:43
반응형

Node.js의 정의

 

Node.js는 Chrome V8 JavaScript 엔진으로 빌드된 JavaScript 런타임 환경입니다. 이것은 JavaScript를 서버 측 애플리케이션 개발에 사용할 수 있도록 해주는 오픈 소스, 이벤트 기반, 비동기식 JavaScript 런타임입니다.

 

기존에는 JavaScript가 주로 클라이언트 측 웹 개발을 위해 사용되었지만, Node.js의 등장으로 JavaScript를 사용하여 서버 측 애플리케이션을 개발할 수 있게 되었습니다. Node.js는 단일 스레드 이벤트 루프를 기반으로 하고 있으며, 이러한 아키텍처는 비동기식 및 이벤트 기반 프로그래밍을 가능하게 합니다. 이는 대규모 네트워크 애플리케이션의 확장성과 성능에 이점을 제공합니다.

 

Node.js의 특징 

  1. 비동기식 I/O: Node.js는 비동기식 I/O를 지원하여 입출력 작업이 완료될 때까지 대기하지 않고 다음 작업을 계속할 수 있습니다. 이는 서버의 성능과 확장성을 향상하는 데 도움이 됩니다.
  2. 이벤트 기반: Node.js는 이벤트 기반 아키텍처를 기반으로 하며, 이벤트가 발생할 때마다 이벤트 리스너가 호출됩니다. 이는 비동기식 프로그래밍을 지원하고 효율적인 처리를 가능하게 합니다.
  3. 단일 스레드: Node.js는 단일 스레드 모델을 사용하며, 각 요청에 대해 비동기식 방식으로 작업을 처리합니다. 이는 멀티 스레드 환경에서 발생하는 오버헤드를 줄이고 더 많은 연결을 처리할 수 있도록 합니다.
  4. 모듈 시스템: Node.js는 CommonJS와 함께 모듈 시스템을 제공하여 코드를 모듈화 하고 재사용할 수 있게 합니다. 이는 코드의 구조화와 유지보수를 용이하게 합니다.

 

Node.js의 주요 장점

  1. 높은 성능: Node.js는 비동기식 이벤트 기반 아키텍처를 통해 입출력 작업을 효율적으로 처리합니다. 이를 통해 대용량 데이터를 다루거나 대규모 트래픽을 처리할 때 뛰어난 성능을 발휘합니다.
  2. 확장성: Node.js는 단일 스레드 이벤트 루프 모델을 기반으로 하며, 이를 통해 쉽게 확장할 수 있습니다. 클러스터링 및 로드 밸런싱을 통해 다중 프로세스를 활용하여 서버의 성능을 향상할 수 있습니다.
  3. 빠른 개발: JavaScript를 사용하여 프론트엔드와 백엔드를 모두 개발할 수 있으므로 풀스택 개발이 가능합니다. 또한 npm을 통해 수많은 모듈과 패키지를 제공받아 빠르게 개발을 진행할 수 있습니다.
  4. 단순한 구조: Node.js는 자바스크립트를 기반으로 하며, 이로 인해 프런트엔드와 백엔드에서 동일한 언어를 사용할 수 있어 개발자들에게 일관된 경험을 제공합니다.
  5. 커뮤니티 및 생태계: Node.js는 큰 커뮤니티와 활발한 생태계를 가지고 있습니다. 수많은 오픈 소스 라이브러리와 패키지가 npm을 통해 제공되며, 이를 통해 개발 생산성을 높일 수 있습니다.
  6. 실시간 애플리케이션: Node.js는 이벤트 기반 아키텍처와 WebSocket을 지원하여 실시간 통신 애플리케이션을 개발하는 데 적합합니다. 실시간 채팅, 온라인 게임 등과 같은 애플리케이션을 쉽게 구현할 수 있습니다.
  7. 멀티 플랫폼 지원: Node.js는 다양한 플랫폼에서 실행할 수 있으며, Windows, macOS, Linux 등 다양한 운영 체제에서 사용할 수 있습니다.

 

# Node.js 설치

 

Windows:

  1. 공식 Node.js 웹사이트에서 설치 프로그램 다운로드:
    • Node.js 공식 웹사이트에서 Windows용 설치 프로그램을 다운로드하여 실행합니다.
    • 설치 프로그램을 실행하고 설치 지침을 따릅니다.

node

 

 

macOS 및 Linux:

홈브루(Homebrew)를 사용한 설치 (macOS):

brew install node
 

NVM(Node Version Manager)을 사용한 설치 (macOS 및 Linux):

먼저 NVM을 설치합니다. 다음 명령어를 터미널에 입력합니다:

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash

 

설치가 완료되면 새로운 터미널 창을 열거나 source ~/.bashrc (또는 source ~/.bash_profile, source ~/.zshrc 등)를 실행하여 NVM을 활성화합니다.

이제 Node.js를 설치할 수 있습니다:

nvm install node

 

 

설치가 완료되면 터미널 또는 명령 프롬프트에서 node -v 명령어를 사용하여 Node.js 버전을 확인할 수 있습니다. 이제 Node.js와 함께 npm(Node Package Manager)도 설치되었으므로 JavaScript 프로젝트를 개발할 준비가 되었습니다.

 

 

 

파일 관리하기 

  1. 파일 생성 및 편집:
    • 파일 생성: touch filename.js (Linux 및 macOS)
    • 파일 생성: echo "" > filename.js (Windows)
    • 편집기로 파일 열기: code filename.js (Visual Studio Code 사용 시)
  2. 파일 실행:
    • Node.js로 JavaScript 파일 실행: node filename.js
  3. 파일 이동 또는 이름 변경:
    • 파일 이동: mv oldfilename.js newfilename.js
    • 파일 이름 변경: mv oldfilename.js newfilename.js
  4. 파일 복사:
    • 파일 복사: cp sourcefile.js destinationfile.js
  5. 파일 삭제:
    • 파일 삭제: rm filename.js
  6. 디렉토리 생성 및 삭제:
    • 디렉토리 생성: mkdir dirname
    • 디렉토리 삭제: rm -r dirname (주의: 이 명령은 디렉토리와 그 안의 모든 파일 및 하위 디렉토리를 삭제합니다. 신중하게 사용하세요.)
  7. 파일 및 디렉토리 리스트 보기:
    • 현재 디렉토리의 파일 및 디렉토리 리스트 보기: ls
    • 자세한 파일 및 디렉토리 정보 보기: ls -l
  8. 현재 작업 디렉토리 확인:
    • 현재 작업 디렉토리 확인: pwd
  9. 파일 내용 보기:
    • 파일 내용 보기: cat filename.js
  10. 파일 수정 및 편집:
    • Vim 편집기를 사용하여 파일 편집: vim filename.js
    • Nano 편집기를 사용하여 파일 편집: nano filename.js

 

 

NPM(Node Package Manager)은 Node.js의 기본 패키지 관리자입니다. NPM을 사용하면 JavaScript 애플리케이션 개발 시 필요한 다양한 패키지와 모듈을 쉽게 관리하고 설치할 수 있습니다.

 

npm  npm 사이트
예) 사이트

 

 

NPM은 세 가지 주요 구성 요소로 구성됩니다

 

  • 온라인 레지스트리(Registry):
    • NPM 레지스트리는 패키지 저장소로, 전 세계 개발자들이 만든 수많은 공개 및 비공개 패키지가 저장되어 있습니다. 이 레지스트리에서 패키지를 검색하고 설치할 수 있습니다.
  • CLI(Command Line Interface):
    • NPM CLI는 명령 줄 도구로, 이를 통해 패키지를 설치, 업데이트, 삭제할 수 있습니다. 예를 들어, npm install <패키지 이름> 명령을 사용하여 패키지를 설치할 수 있습니다.
  • 패키지 관리 기능:
    • NPM은 프로젝트의 종속성을 관리할 수 있는 기능을 제공합니다. package.json 파일을 통해 프로젝트에 필요한 모든 패키지를 정의하고, 이러한 패키지를 자동으로 설치 및 관리할 수 있습니다.

 

 

 

 

- 패키지 설치

npm install <package-name>

 

패키지를 설치하고 node_modules 폴더에 저장합니다. package.json 파일에 종속성으로 추가하려면 --save 또는 --save-dev 플래그를 사용할 수 있습니다.

 

- 전역 패키지 설치

npm install -g <package-name>

 

패키지를 전역적으로 설치하여 시스템의 모든 프로젝트에서 사용할 수 있도록 합니다.

 

- 패키지 제거

npm uninstall <package-name>

 

- 종속성 목록 확인

npm list

 

- 프로젝트 초기화

npm init

 

새로운 package.json 파일을 생성하고 프로젝트의 기본 정보를 설정합니다.

 

 

- 패키지 업데이트

npm update <package-name>

 

스크립트 실행

package.json 파일에서 정의된 스크립트를 실행합니다.

npm run <script-name>

 

 

 

package.json

 

package.json

 

 

name : 

  • 프로젝트의 이름을 나타냅니다. 이 이름은 고유해야 하며, 패키지를 NPM 레지스트리에 게시할 때 사용됩니다.
  • 예: "name": "my-awesome-project"

version :

  • 프로젝트의 버전을 지정합니다. 일반적으로 Semantic Versioning 규칙을 따릅니다.
  • 예: "version": "1.0.0"

 

description :

  • 프로젝트에 대한 간단한 설명을 작성합니다. 이는 프로젝트가 무엇인지 다른 사람들에게 알려줍니다.
  • 예: "description": "This is a sample project for demonstrating package.json"

 

main :

  • 애플리케이션의 진입점을 정의합니다. Node.js가 이 파일을 시작 파일로 사용합니다.
  • 예: "main": "index.js"

 

scripts :

프로젝트에서 자주 사용하는 명령어들을 정의합니다. 예를 들어, npm run test 명령어를 실행하면 scripts 항목에 정의된 test 스크립트가 실행됩니다.

"scripts": {
  "test": "echo \"Error: no test specified\" && exit 1"
}

 

keywords :

  • 프로젝트와 관련된 키워드 배열을 작성합니다. 이는 NPM 레지스트리에서 검색 가능성을 높여줍니다.
  • 예: "keywords": ["nodejs", "npm", "example"]

author :

  • 프로젝트 작성자의 이름을 기재합니다.
  • 예: "author": "Your Name"

license : 

  • 프로젝트의 라이선스를 지정합니다. 예를 들어, "MIT", "ISC" 등입니다.
  • 예: "license": "ISC"

 

dependencies : 

프로젝트의 의존성을 정의합니다. 이 항목에는 프로젝트가 실행되는 데 필요한 패키지들이 포함됩니다.

npm install <패키지> 명령어를 사용하여 추가됩니다.

"dependencies": {
  "express": "^4.17.1"
}

 

 

devDependencies : 

개발 단계에서만 필요한 의존성을 정의합니다.

npm install <패키지> --save-dev 명령어를 사용하여 추가됩니다.

"devDependencies": {
  "mocha": "^8.2.1"
}

 

 

 

 


 

 

 

CommonJS(CJS) 와 ECMAScript 모듈(ESM)

 

  1. 문법:
    • CommonJS: module.exports와 require() 함수를 사용하여 모듈을 정의하고 로드합니다.
    • ES 모듈(ESM): export 및 import 키워드를 사용하여 모듈을 정의하고 로드합니다.
  2. 로딩 방식:
    • CommonJS: 모듈 로딩이 동기식입니다. require() 함수가 호출되면 해당 모듈이 즉시 로드되고 실행됩니다.
    • ES 모듈(ESM): 모듈 로딩이 비동기식이며, import 문은 Promise를 반환합니다. 이는 모듈 로딩이 완료될 때까지 기다리지 않고 다른 작업을 계속할 수 있음을 의미합니다.
  3. 정적 vs 동적:
    • CommonJS: 모듈 로딩 및 실행이 런타임에 동적으로 이루어집니다.
    • ES 모듈(ESM): 모듈 로딩 및 실행이 정적으로 이루어지며, 모듈의 의존성 관계가 런타임 전에 결정됩니다.
  4. 스코프:
    • CommonJS: 모듈은 모듈 스코프를 갖습니다. 따라서 모듈 내에서 선언된 변수는 해당 모듈에서만 사용할 수 있습니다.
    • ES 모듈(ESM): 모듈은 자체적인 스코프를 갖습니다. import 문과 export 문을 사용하여 모듈 간에 변수 및 함수를 공유할 수 있습니다.

 

 

# CommonJS (CJS)

CommonJS 모듈 시스템은 Node.js의 기본 모듈 시스템으로, 서버 사이드 자바스크립트 환경에서 널리 사용됩니다. CommonJS 모듈은 require와 module.exports를 사용하여 모듈을 가져오고 내보냅니다.

특징:

  • 동기적 로딩: require는 동기적으로 작동하므로 파일이 로드될 때까지 코드 실행이 멈춥니다.
  • 파일 확장자 생략 가능: .js 확장자를 생략할 수 있습니다.
  • Node.js에서 기본 사용: package.json 파일에 type 필드가 없거나 type: "commonjs"로 설정된 경우 기본적으로 CommonJS 모듈로 처리됩니다.

module1.js

const greet = (name) => {
  return `Hello, ${name}!`;
};

module.exports = greet;

 

 

app.js

const greet = require('./module1');

console.log(greet('Alice'));

 

 

# ECMAScript 모듈 (ESM)

 

ECMAScript 모듈(ESM)은 ES6(ES2015) 표준의 일부로 도입된 모듈 시스템입니다. ESM은 import와 export 문법을 사용하여 모듈을 가져오고 내보냅니다. 최신 브라우저와 Node.js에서 사용 가능합니다.

 

특징:

  • 비동기적 로딩: ESM은 비동기적으로 모듈을 로드합니다.
  • 엄격한 모드: 모든 ES 모듈은 기본적으로 엄격 모드("strict mode")로 실행됩니다.
  • 파일 확장자 필요: .js 확장자를 포함해야 합니다.
  • type: "module":  package.json 파일에 type 필드를 module로 설정해야 합니다.

 

module1.mjs

export const greet = (name) => {
  return `Hello, ${name}!`;
};

 

app.mjs

import { greet } from './module1.mjs';

console.log(greet('Alice'));

 

package.json

{
  "type": "module"
}

 

CommonJS 예시:

// math.js
function add(a, b) {
    return a + b;
}

module.exports = {
    add: add
};

 

// main.js
const math = require('./math');

console.log(math.add(2, 3)); // 출력: 5

 

 

ES 모듈(ESM) 예시:

// math.js
export function add(a, b) {
    return a + b;
}

 

// main.js
import { add } from './math';

console.log(add(2, 3)); // 출력: 5

 

 

차이점 요약

  1. 문법:
    • CommonJS: require와 module.exports
    • ESM: import와 export
  2. 파일 확장자:
    • CommonJS: .js 확장자를 사용하며, 생략 가능
    • ESM: .mjs 확장자를 사용하거나, package.json 파일에 type: "module"을 설정하여 .js 파일에서도 사용
  3. 로딩 방식:
    • CommonJS: 동기적 로딩
    • ESM: 비동기적 로딩
  4. 기본 모드:
    • CommonJS: 기본 모드
    • ESM: 엄격 모드
    •  

정리

  • CommonJS: 기존의 Node.js 프로젝트, 서버 사이드 코드, 많은 NPM 패키지가 CommonJS 모듈 형식으로 작성됨.
  • ESM: 최신 브라우저 환경, 최신 Node.js 프로젝트, 모듈 표준을 따르는 프로젝트.

 

 

 

 

 

반응형