티스토리 뷰
NPM
▶ NPM 이란?
Node Package Manager
→ Node.js 프로젝트를 관리하는 필수적인 도구
→ 온라인 저장소 + 커맨드라인 도구
- 온라인 저장소
: 수많은 오픈소스 라이브러이와 도구들이 업로드되는 저장소
필요한 라이브러리나 도구를 손쉽게 검색, 다운로드 가능
거대한 생태계 보유
- 커맨드라인
: 프로젝트 관리를 위한 다양한 명령어를 제공하는 도구
저장소에서 라이브러리, 도구 설치
프로젝트 설정/관리
프로젝트 의존성 관리
NPM 사용해보기
▶ 프로젝트 생성하기
npm init
프로젝트 디렉터리 생성
→ 생성한 디렉터리 안에서 npm init 명령어 실행
→ package name, version 등 몇 개의 질문을 통해 package.json 파일 생성
→ 이 package.json이 있는 디렉터리가 Node.js 프로젝트 디렉터리가 됨
package.json
프로젝트 관련 정보들이 저장되는 파일
이 파일을 직접 수정하거나 npm 명령어를 사용하여 프로젝트 정보를 수정할 수 있음
key | value |
version | 프로젝트 버전 |
name | 프로젝트 이름 |
description | 프로젝트 설명 |
scripts | npm run [script name] 으로 실행할 수 있는 사용자 작성 스크립트 |
dependencies | 의존성 패키지들 |
devDependencies | 개발환경에서만 사용하는 의존성 패키지들 |
... | ... |
▶ dependency 관리
npm을 사용하면 dependency들을 쉽게 관리할 수 있음
Dependency (의존성)
: 프로젝트 내에서 사용하는 라이브러리를 관리하는 방법
프로젝트가 실행되기 위해 직접 작성한 코드뿐 아니라 다양한 라이브러리들에 의존하고 있기 때문에
이러한 라이브러리들을 dependency(의존성)이라고 함
Library (라이브러리)
: 특정 기능을 수행하는 코드의 묶음
복잡한 기능을 직접 작성하지 않고, 다른 누군가가 구현한 것을 사용하는 방법
Node.js에서는 패키지라고도 부름
npm install [package-name]
: dependency 추가
추가된 패키지는 package.json의 dependencies 안에 추가되며, node_modules 디렉터리에 저장됨
npm install [package-name]@[version]
: 패키지 버전을 지정할 수 있음
~1.13.0 : 1.13.x 버전 설치 (가장 오른쪽 버전을 제외한 나머지 버전을 고정)
^1.13.0 : 1.x.x 버전 설치 (가장 왼쪽의 0이 아닌 버전을 고정)
0.13.0 : 0.13.0 버전만 설치 (해당 버전만 설치)
package-lock.json
프로젝트에 dependency를 추가하면 package-lock.json이라는 파일이 생성됨
dependency 추가 시 버전을 명시하지 않고 추가하게 되면 자동으로 ^최신버전으로 추가되는데
dependency 버전이 갑자기 변경되지 않도록 설치된 버전을 고정하는 역할
npm install [package-name] --save-dev
: 개발용 dependency 추가
배포 전까지만 사용하는 dependency (ex. 유닛 테스트 라이브러리)
package.json의 devDependencies안에 추가됨
npm install [package-name] --global
: 전역 패키지 추가
프로젝트 외부에서 사용할 패키지를 전역 패키지 디렉터리에 내려받음
주로 커맨드라인 도구들을 전역 패키지로 추가해서 사용 (ex. express-generator, pm2)
Local package (로컬 패키지)
: package.json에 선언되어있고, node_modules에 저장된 패키지
Global package (전역 패키지)
: npm install -g 로 내려받아 전역 패키지 저장소에 저장된 패키지
전역 패키지도 프로젝트에서 사용할 수는 있으나, 프로젝트의 dependency는 package.json 내에 명시적으로 선언되어 있는 것이 프로젝트관리의 좋은 방향임
npm install
: dependency 내려받기
npm install 명령어를 아무 옵션 없이 사용하면 package.json에 정의된 dependencies와 devDependencies를
node_modules 디렉터리에 내려받음
기본적으로 node_modules 디렉터리는 코드관리나 배포 시 업로드 하지 않음
→ 의존성이 많아지면 용량이 커지고, 운영체제별 실행되는 코드가 다른 경우가 존재하기 때문
npm install --production
: 프로젝트를 배포할때 개발용 의존성을 같이 포함할 필요가 없으므로 package.json의 dependencies만 node_modules 디렉터리에 내려받음
npm remove [package-name]
: dependency 삭제
package.json의 dependencies와 devDependencies에서 삭제되고 node_modules 디렉터리에서도 삭제됨
▶ 스크립트 실행하기
스크립트란?
→ 간단한 동작을 수행하는 코드
package.json의 scripts에 선언된 스크립트를 npm run [script-name] 명령어로 실행할 수 있음
// package.json
{
...
"scripts": {
"say-hi": "echo \"hi"\"
},
...
}
// 실행
npm run say-hi
"hi"
npm script를 사용하는 이유 → npm script 내에선 의존성 패키지를 사용할 수 있음
npm script엔 run을 제외하고 사용할 수 있는 주요 스크립트들이 있음
→ run을 제외하고 사용할 수 있을 뿐 npm 내부적으로 코드를 제공해 주는 것은 아님
(많이 사용하는 명령어라 간단하게 쓸 수 있게 제공하는 것)
test : 코드 유닛 테스트 등에 사용
start : 프로젝트 실행
stop : 프로젝트 종료
▶ NPM 요약
명령어
npm init : 프로젝트 생성
npm install : 의존성 추가
npm remove : 의존성 삭제
npm run : 스크립트 실행
주요파일/디렉터리
node_modules : 프로젝트 의존성 저장 디렉터리
package.json : 프로젝트 관리 (버전, 의존성, 스크립트, ...)
package-lock.json : 의존성 버전 확인
NPX
▶ NPX 란?
npm 패키지를 설치하지 않고 사용할 수 있게 해주는 도구
→ 프로젝트에 추가하거나 전역 패키지로 추가하지 않고, npx를 이용하여 바로 실행할 수 있음
→ 자주 사용하진 않지만 한번씩 사용하는 npm 패키지들은 npx로 쉽고 빠르게 사용 가능
npx를 사용하면
1) node.js의 특정 버전을 따로 설치하지않고 바로 사용해볼 수 있음
→ 프로젝트의 node.js 버전별 실행환경을 확인할 때 유용
2) github gist코드 실행 가능
→ gist는 github에 등록된 간단한 코드 조각
예제코드 같은 것을 gist를 통해 배포하는데 npx를 사용하면 이를 다운받거나 내 파일에 붙여넣지않고 바로 실행 가능
! git이 설치되어 있어야 gist코드 실행 가능
! 온라인 상의 코드는 어떤 위험이 있을지 모르므로 항상 코드를 잘 확인하고 실행해볼 것
Node.js의 모듈 (Module)
▶ 모듈(Module)이란?
간단한 프로그램이라면 파일 하나로도 실행 가능하지만 프로젝트 규모가 커지면 기능에 맞게 코드를 분리하는 것이 중요
→ 모듈은 코드를 분리하기 위한 방법
Package (패키지)
package는 module의 모음
→ npm package들은 많은 module을 포함하고 있는 코드 모음
▶ Node.js의 기본 제공 모듈
1) console
- 브라우저에서 제공되는 console과 유사한 디버깅 도구
- log, warn, error 함수로 로그 레벨 표시하여 커맨드라인에 출력
- time, timeLog, timeEnd 함수로 시간 추적
2) process
- 현재 실행하고 있는 node.js파일의 프로세스 관련 기능 제공
- arch, argv, env 등 실행 환경 및 변수 관련 값 제공
- abort, kill, exit 등 프로세스 동작 관련 함수 제공
3) fs
- 파일 입출력을 하기 위해 사용
- readFile, writeFile 함수로 파일 읽기/쓰기
- Sync 함수(readFileSync, writeFileSync) 제공 → 동기 동작
- watch로 파일/디렉터리의 변경 이벤트 감지
4) http
- http 서버, 클라이언트를 node.js를 통해 만들 수 있는 기능 제공
- createServer 함수로 서버 생성
- Request 함수로 http 클라이언트 요청 생성
5) 기타 기본제공 모듈
- url : url 파싱
- os : 운영체제 정보
- Path : 디렉터리 string 관련 작업 (서로 다른 운영체제 간 공통된 로직)
- crypto : 암호화, hash 관련 함수 제공
등등...
▶모듈 작성 방법
1) 기본적인 모듈 작성법
: 모듈이 load될 때 사용될 값을 module.exports로 내보냄
// elice.js
const name = ‘elice’;
const age = 5;
const nationality = ‘korea’;
module.exports = {
name,
age,
nationality ,
};
---
const student = require(‘./elice’);
// student 출력값 { name: ‘elice’, age: 5, nationality: ‘korea’ }
2) 변수명으로 export하는 모듈 작성법
: 모듈을 object로 만들고, 각 key-value를 지정해서 내보냄
// elice.js
const name = ‘elice’;
const age = 5;
const nationality = ‘korea’;
exports.name = name;
exports.age = age;
exports.nationality = nationality;
---
const student = require(‘./elice’);
// student 출력값 { name: ‘elice’, age: 5, nationality: ‘korea’ }
3) 함수를 export하는 모듈 작성법
: 모듈을 함수로 만들어서 모듈 사용 시에 값을 정할 수 있게 내보냄
// elice.js
module.exports = (name, age, nationality) => {
return {
name,
age,
nationality,
};
}
---
const student = require(‘./elice’)(‘elice’, 5, ‘korea’);
// student 출력값 { name: ‘elice’, age: 5, nationality: ‘korea’ }
▶모듈 사용 방법
require 함수를 통해 모듈을 load 할 수 있음
의존성 패키지, 직접 작성한 모듈 사용 가능
require
require 할 때 모듈 코드가 첫 실행됨
→ 그 다음에는 메모리에 cache된 모듈을 가져다가 씀
→ 다른 파일에서 또다시 require한다고 해서 모듈이 두번 실행되지 않음
→ 모듈 코드를 여러번 실행하기 위해서는 함수형 모듈로 작성할 필요가 있음
1) npm 패키지
: 패키지를 사용하려면 node_modules에 내려받아져 있어야 load 가능
const dayjs = require('dayjs');
console.log(dayjs());
2) 직접 작성한 모듈
: 현재 파일과의 상대 디렉터리로 load
const myModule = require('./my-module');
console.log(myModule);
// my-module이 .js파일인 경우 해당 파일 load
// my-module이 디렉터리인 경우 my-module/index.js 파일 load
3) 함수형 모듈
: 함수형 모듈은 load한 경우 모듈이 바로 실행되지 않음
필요한 시점에 load된 함수를 실행하여 모듈을 사용할 수 있음
const myFunctionModule = require('./my-function-module');
console.log(myFunctionModule(name, age, nationality));
4) json 파일
: json파일을 load하면 object로 자동 파싱
// my-data.json 을 가지고 있을 때
const myData = require('./my-data');
console.log(myData);
▶모듈의 작성과 사용 요약
- module.exports를 사용하여 모듈을 작성할 수 있음
- require 함수를 사용하여 의존성 패키지, 모듈, json파일을 사용할 수 있음
- 모듈은 첫 require 시에만 실행하고 cache됨.
- 그 이후에 require할 때는 cache된 모듈을 가져오게 되므로 여러번 실행할 모듈은 항수형으로 작성해야함
ES Module
▶ ES Module ?
- ES6에서 등장한 JavaScript의 공식적인 표준 모듈
JavaScript는 기본적으로 모듈을 제공하고 있지 않았고, Node.js는 독자적인 방식을 통해 모듈을 지원하고 있었음 (commonjs)
→ ES Module의 등장으로 Node.js에선 두 가지 모듈을 지원할 필요가 생김
ES Module과 commonjs는 문법과 기본적인 동작 방식이 다름
- commonjs : module.exports와 require로 모듈을 만들고 사용
- ES Module : export와 import로 모듈을 만들고 사용
ES Module은 Node.js의 등장 이후로 탄생한 표준
→ Node.js는 14버전부터 ES Module을 안정적으로 지원하지만 commonjs가 일반적으로 많이 사용되고 있었음
→ 두 모듈의 동작 방식이 크게 달라서 require를 import로 대체할 수 없음
→ Node.js는 ES Module과 commonjs를 같이 사용하기에 부적절함
현재 ES Module은 Node.js에서 기본적으로 사용하기에 제약이 많음
(프로젝트 타입을 module로 변경, commonjs 모듈 import 시에 문제 발생 등)
이 글은 엘리스 AI트랙 5기 강의를 들으며 정리한 내용입니다.
'개발공부 > 🟩 Node.js' 카테고리의 다른 글
[NodeJS] Node.js와 MongoDB (0) | 2022.07.31 |
---|---|
[NodeJS] Express.js로 REST API 구현하기 (0) | 2022.07.30 |
[NodeJS] Express.js의 Middleware (0) | 2022.07.28 |
[NodeJS] 웹과 Express.js (0) | 2022.07.27 |
[NodeJS] Node.js 이해하기 (0) | 2022.07.26 |
프론트엔드 개발자 삐롱히의 개발 & 공부 기록 블로그