티스토리 뷰

개발공부/🟩 Node.js

[NodeJS] NPM과 모듈

2022. 7. 27. 08:12

 

 

Node.js

Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.

nodejs.org

 

 

 

 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)이란?

 

간단한 프로그램이라면 파일 하나로도 실행 가능하지만 프로젝트 규모가 커지면 기능에 맞게 코드를 분리하는 것이 중요

→ 모듈은 코드를 분리하기 위한 방법

 

이미지출처 : 엘리스 - Node.js와 MongoDB Ⅰ - 02 NPM과 모듈 강의자료

 

 

 

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
프로필사진
개발자 삐롱히

프론트엔드 개발자 삐롱히의 개발 & 공부 기록 블로그