헬창 개발자

npm 명령어와 node.js 모듈의 관하여 본문

공부방

npm 명령어와 node.js 모듈의 관하여

찬배 2022. 8. 17. 01:14

1.1 npm 명령어

Node.js를 시작하기 위해서는 config(설정 파일)를 설정해줘야한다.

npm 명령어를 이용하면 된다,

npm 명령어는 Node.js를 시작하기 위한 초기화(init) 작업이자 package.josn을 만드는 명령어이다.

내가 만들 하나의 프로젝트에 들어 있는 여러 패키지 정보를 이 package.josn이라는 파일이 관리해주므로 반드시 처음 생성해줘야한다.

npm init 명령어를 입력하면 pakage name을 입력하라는 표시가 보이게 된다.

원하는 이름을 입력하자

package name만 입력해주고 나머지는 enter로 넘어가고 마지작에 It this ok? 질문에 yes라고 입력해주자

다음은 초기화 작업에 필요한 설명이다.

  • package name : 패키지 명입니다.
  • version : 패키지 버전입니다. (1.0.0)는 기본 값입니다.
  • description : 프로젝트(패키지)의 설명을 지정합니다.
  • entry point : 시작 파일 명입니다. (index.js)는 기본 값입니다.
  • test command : npm test를 호출할 때마다 실행되는 명령입니다.
  • git repository : 패키지가 저장되어 있는 Git 저장소의 URL입니다.
  • keywords : 프로젝트(패키지)의 키워드를 배열로 지정합니다
  • author : 제작자의 이름을 지정합니다.
  • license : 패키지 사용을 허용하는 방법과 제한 사항을 알 수 있도록 라이센스를 지정합니다.

 

2.1 모듈 시스템이란?

프로그램 내부를 기능별 단위로 분할한 부분 또는 메모리 보드 등의 부품을 간단하게 떼서 교환이 쉽도록 설계 있을 때의 그 각 구성 요소

객체 지향 프로그래밍에서 캡슐화와 동일한 개념이다.

모듈로 API를 묶어줘서 변수나 함수에 name space를 보장해주고 기능별로 코딩이 가능하고 재사용이 가능하다.

/* A.js */

const A = 'variable A from A.js';

module.exports = A;
/* B.js */

const A = require('./A');

console.log(A + ' in B.js');

만약 A.js 파일에서 module.exports를 통해 A 변수를 지정해주지 않았다면 B.js에는 위의 같은 결과 같이 A,js에서 선언한 A변수를 사용하지 못한다.

모듈 시스템을 사용하는 중요한 이유는 ‘전역변수’ 문제 때문이다.

Node.js에서 하나의 모듈은 자신만의 스코프를 가지기 때문에 전연벽수 중복문제가 발생하지 않는다.

A.js파일에서 선언한 변수 A와 B.js파일에서 선언한 변수 A는 서로 다른 변수가 된다.

따라서 자신의 스코프에서만 사용할 수 있었던 모듈의 기능을 다른 모듈에서 사용하려면 module.exports 또는 exports 객체를 통해 정의하고 외부에서 사용하고 싶다고 알려줘야 한다.

그리고 다른 모듈의 기능을 불러올 때는 require를 통해 불러올 수 있다.

require() : 모듈을 불러온다.
mudule.exports = 프로퍼티 or exports.프로퍼티 : 모듈을 내보낸다.

예를 들어 매뉴 주문 시스템이 있다고 하자. 시스템을 위해 주문 모듈과 메뉴 모듈로 분리하고 각각의 모듈 이름은 Order.js와 Menu.js이다. Oreder.js 모듈에서 Menu.js 모듈 안에 있는 menu()라는 험슈룰 가져오고 싶다면 어느 모듈에 require()를 하고 exports()해야 할까? 위 그림을 참고하자

그리고 각 모듈이 서로 내부 요소를 참조하는 것도 가능한데 이를 ‘순환 참조’라고 한다.

아래 예시 코드를 보자

 

/* A2.js */

const A = 'variable A from A2.js';
const B = require('./B2');

console.log(B + ' in A2.js');

module.exports = A;
/* B2.js */

const A = require('./A2');
const B = 'variable B from B2.js';

console.log(A + ' in B2.js');

module.exports = B;

A2.js를 실행할 때 아직 B.js에서 B변수를 내보내지 않았다. 즉 아직 B2.js에 있는 B변수를 모듈 객체에 추가하지 않았다는 뜻이다. 평소 같으면 undefined 객체가 반환되어야 할 코드지만 정상 실행이 된다.

그 이유는 자바스크립트가 순환 참조를 허용하기 때문이다.

순환 참조 예시

하지만 순환 참조를 할 때 require()의 순서에 따라 오류가 발생할 수 있다. 실제로 순환 참조를 많이 사용하면 발생하는 여러 문제가 있다. 그러나 실행할 때 오류가 발생하는 것이 아니므로 순환 참조에 관해 오류가 발생하더라도 알아차리기가 쉽지 않다. 위 그림을 보면 순호나 참조를 하는 모듈이 어려 개일 때는 문제가 눈덩이처럼 커지게 될것이다.

모듈을 내보낼 때는 다음같은 2가지 방법을 사용한다.

  1. mudule.exports = 프로퍼티;
  2. exports.프로퍼티;

첫번째 방법은 하나의 값을 할당할 수 있고 두번째 방법은 메서드, 프로퍼티를 여러 개 내보낼 수 있다는 차이점이 있다.

project/
├── app.js
└── module/
    ├── index.js
    ├── calc.js
    └── print.js
// app.js
const myModule = require('./module');

위 같은 디렉터리가 있다고 하자. module/ 디렉터리 하나만 require해주면 내부에 있는 index.js, calc.js, print.js를 모두 사용할 수 있다.

2.2 모듈의 종류

  • 기본(코어)모듈, 확장 모듈 : 기본적으로 포함되고 있다면 기본(코어) 모듈이고 아니라면 확장 모듈이다.
  • 일반 모듈, 네이트브 모듈 : 자바스클비트로 작성되어있으면 일반 모듈이고 그 외의 언어로 작성되어있으면 네이트브 모듈이다.
  • 지역 모듈, 전역 모듈 : 현재 웹을 사용하기 위해서만 만들어졌으면 지역 모듈이고 어디든 사용할 수 있게 확장했다면 전역 모듈이다.

'공부방' 카테고리의 다른 글

express 미들웨어  (0) 2022.08.19
express 모듈을 사용해 서버 만들기  (1) 2022.08.18
자바스크립트 동기/비동기 부셔버리기  (0) 2022.08.12
자바스크립트 리마인드  (0) 2022.08.11
Node.js 첫걸음  (0) 2022.07.26
Comments