Node.js의 정의
Node.js는 Chrome V8 JavaScript 엔진으로 빌드된 JavaScript 런타임 환경입니다. 이것은 JavaScript를 서버 측 애플리케이션 개발에 사용할 수 있도록 해주는 오픈 소스, 이벤트 기반, 비동기식 JavaScript 런타임입니다.
기존에는 JavaScript가 주로 클라이언트 측 웹 개발을 위해 사용되었지만, Node.js의 등장으로 JavaScript를 사용하여 서버 측 애플리케이션을 개발할 수 있게 되었습니다. Node.js는 단일 스레드 이벤트 루프를 기반으로 하고 있으며, 이러한 아키텍처는 비동기식 및 이벤트 기반 프로그래밍을 가능하게 합니다. 이는 대규모 네트워크 애플리케이션의 확장성과 성능에 이점을 제공합니다.
Node.js의 특징
- 비동기식 I/O: Node.js는 비동기식 I/O를 지원하여 입출력 작업이 완료될 때까지 대기하지 않고 다음 작업을 계속할 수 있습니다. 이는 서버의 성능과 확장성을 향상하는 데 도움이 됩니다.
- 이벤트 기반: Node.js는 이벤트 기반 아키텍처를 기반으로 하며, 이벤트가 발생할 때마다 이벤트 리스너가 호출됩니다. 이는 비동기식 프로그래밍을 지원하고 효율적인 처리를 가능하게 합니다.
- 단일 스레드: Node.js는 단일 스레드 모델을 사용하며, 각 요청에 대해 비동기식 방식으로 작업을 처리합니다. 이는 멀티 스레드 환경에서 발생하는 오버헤드를 줄이고 더 많은 연결을 처리할 수 있도록 합니다.
- 모듈 시스템: Node.js는 CommonJS와 함께 모듈 시스템을 제공하여 코드를 모듈화 하고 재사용할 수 있게 합니다. 이는 코드의 구조화와 유지보수를 용이하게 합니다.
Node.js의 주요 장점
- 높은 성능: Node.js는 비동기식 이벤트 기반 아키텍처를 통해 입출력 작업을 효율적으로 처리합니다. 이를 통해 대용량 데이터를 다루거나 대규모 트래픽을 처리할 때 뛰어난 성능을 발휘합니다.
- 확장성: Node.js는 단일 스레드 이벤트 루프 모델을 기반으로 하며, 이를 통해 쉽게 확장할 수 있습니다. 클러스터링 및 로드 밸런싱을 통해 다중 프로세스를 활용하여 서버의 성능을 향상할 수 있습니다.
- 빠른 개발: JavaScript를 사용하여 프론트엔드와 백엔드를 모두 개발할 수 있으므로 풀스택 개발이 가능합니다. 또한 npm을 통해 수많은 모듈과 패키지를 제공받아 빠르게 개발을 진행할 수 있습니다.
- 단순한 구조: Node.js는 자바스크립트를 기반으로 하며, 이로 인해 프런트엔드와 백엔드에서 동일한 언어를 사용할 수 있어 개발자들에게 일관된 경험을 제공합니다.
- 커뮤니티 및 생태계: Node.js는 큰 커뮤니티와 활발한 생태계를 가지고 있습니다. 수많은 오픈 소스 라이브러리와 패키지가 npm을 통해 제공되며, 이를 통해 개발 생산성을 높일 수 있습니다.
- 실시간 애플리케이션: Node.js는 이벤트 기반 아키텍처와 WebSocket을 지원하여 실시간 통신 애플리케이션을 개발하는 데 적합합니다. 실시간 채팅, 온라인 게임 등과 같은 애플리케이션을 쉽게 구현할 수 있습니다.
- 멀티 플랫폼 지원: Node.js는 다양한 플랫폼에서 실행할 수 있으며, Windows, macOS, Linux 등 다양한 운영 체제에서 사용할 수 있습니다.
# Node.js 설치
Windows:
- 공식 Node.js 웹사이트에서 설치 프로그램 다운로드:
- Node.js 공식 웹사이트에서 Windows용 설치 프로그램을 다운로드하여 실행합니다.
- 설치 프로그램을 실행하고 설치 지침을 따릅니다.
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 프로젝트를 개발할 준비가 되었습니다.
파일 관리하기
- 파일 생성 및 편집:
- 파일 생성: touch filename.js (Linux 및 macOS)
- 파일 생성: echo "" > filename.js (Windows)
- 편집기로 파일 열기: code filename.js (Visual Studio Code 사용 시)
- 파일 실행:
- Node.js로 JavaScript 파일 실행: node filename.js
- 파일 이동 또는 이름 변경:
- 파일 이동: mv oldfilename.js newfilename.js
- 파일 이름 변경: mv oldfilename.js newfilename.js
- 파일 복사:
- 파일 복사: cp sourcefile.js destinationfile.js
- 파일 삭제:
- 파일 삭제: rm filename.js
- 디렉토리 생성 및 삭제:
- 디렉토리 생성: mkdir dirname
- 디렉토리 삭제: rm -r dirname (주의: 이 명령은 디렉토리와 그 안의 모든 파일 및 하위 디렉토리를 삭제합니다. 신중하게 사용하세요.)
- 파일 및 디렉토리 리스트 보기:
- 현재 디렉토리의 파일 및 디렉토리 리스트 보기: ls
- 자세한 파일 및 디렉토리 정보 보기: ls -l
- 현재 작업 디렉토리 확인:
- 현재 작업 디렉토리 확인: pwd
- 파일 내용 보기:
- 파일 내용 보기: cat filename.js
- 파일 수정 및 편집:
- 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
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)
- 문법:
- CommonJS: module.exports와 require() 함수를 사용하여 모듈을 정의하고 로드합니다.
- ES 모듈(ESM): export 및 import 키워드를 사용하여 모듈을 정의하고 로드합니다.
- 로딩 방식:
- CommonJS: 모듈 로딩이 동기식입니다. require() 함수가 호출되면 해당 모듈이 즉시 로드되고 실행됩니다.
- ES 모듈(ESM): 모듈 로딩이 비동기식이며, import 문은 Promise를 반환합니다. 이는 모듈 로딩이 완료될 때까지 기다리지 않고 다른 작업을 계속할 수 있음을 의미합니다.
- 정적 vs 동적:
- CommonJS: 모듈 로딩 및 실행이 런타임에 동적으로 이루어집니다.
- ES 모듈(ESM): 모듈 로딩 및 실행이 정적으로 이루어지며, 모듈의 의존성 관계가 런타임 전에 결정됩니다.
- 스코프:
- 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
차이점 요약
- 문법:
- CommonJS: require와 module.exports
- ESM: import와 export
- 파일 확장자:
- CommonJS: .js 확장자를 사용하며, 생략 가능
- ESM: .mjs 확장자를 사용하거나, package.json 파일에 type: "module"을 설정하여 .js 파일에서도 사용
- 로딩 방식:
- CommonJS: 동기적 로딩
- ESM: 비동기적 로딩
- 기본 모드:
- CommonJS: 기본 모드
- ESM: 엄격 모드
정리
- CommonJS: 기존의 Node.js 프로젝트, 서버 사이드 코드, 많은 NPM 패키지가 CommonJS 모듈 형식으로 작성됨.
- ESM: 최신 브라우저 환경, 최신 Node.js 프로젝트, 모듈 표준을 따르는 프로젝트.
'Node.js' 카테고리의 다른 글
[ Node ] 용어 (0) | 2024.09.28 |
---|---|
[ Node.js ] 05. 포스트맨 postman (0) | 2024.08.30 |
[ Node.js ] 04. crud , HTTP method, MySQL 연동 (0) | 2024.04.30 |
[ Node.js ] 03. express 서버 만들기 (0) | 2024.04.28 |
[ Node.js ] 02. 노드(Node.js) 내장모듈 - OS, path, url , dns, crypto, util, Console (0) | 2024.04.28 |