IT/Node.js

[Node.js] 모듈이 뭘까? - 레고로 설명하는 모듈 개념

Buang 2023. 2. 9. 16:30
반응형

<목차>

 

1. 모듈의 정의

2. 모듈 사용 방법

 


1. 모듈의 정의

 

모듈은 프로그램 내부를 기능별 단위로 분할한 부분이다.

쉽게 말해 모듈은 '부품'이라고 보면 된다.

 

레고를 조립할 때 가로 5cm, 세로 10cm인 레고 부품과

가로 세로가 10cm 짜리인 납작한 레고 부품 등

서로  다른 크기와 모양을 가진 레고 부품을 이용해서 작품을 만드는 것처럼

 

프로그램이라는 작품을 만들 때도

모듈(부품)들을 조립해서 만들 수 있다.

 

보통 웹 서비스에서 공통적으로 사용되는 기능이

회원가입과 로그인, 그리고 게시판에 글쓰기 기능이 있다.

 

이런 기능을 모듈(부품)로 만들어 놓으면

내가 A라는 사이트를 만들 때 회원가입 부분 코드를

처음부터 작성하지 않고, 다른 사람이 만든 회원가입 모듈(부품)을 이용하면

쉽고 빠르게 회원가입 페이지를 완성할 수 있다.

 

 

모듈은 코드를 깔끔하게 할 수 있다는 장점도 있다.

 

function add(a, b) {
  return a + b;
}

function substract(a, b) {
  return a - b;
}

module.exports = {
  add: add,
  substract: substract,
};

 

나는 calc.js라는 파일을 생성하고 그 안에

두 수를 더하고, 빼는 함수 코드를 위와같이 작성했다.

 

코드 아래 module.exports는 뒤에서 설명할 건데

내가 만든 더하기, 빼기 함수를 모듈(부품)로

만들어 주는 것이다. 이렇게 모듈(부품)로 만들어 주면

calc.js가 아닌 다른 파일에서 내가 만든 더하기, 빼기 함수들을

다른 파일에서 사용할 수 있게 된다.

 

대충 그런 코드구나 생각하고 아래 코드를 봐보자.

 

const add = require('./calc.js').add;
const substract = require('./calc.js').substract;

console.log(add(add(1,2), substract(3,2))); // 4

 

다른 파일(Result.js)에서 내가

calc.js란 파일에서 만든 함수(add와 substarct 함수)를 사용한 모습이다.

짧게 3문장 만으로도 내가 만든 함수를 사용한 걸 볼 수 있다.

 

모듈을 사용하지 않았다면 calc.js 파일에 썼던 것처럼

Result.js란 파일에 add 함수와 substract 함수를

길게 작성해줘야 했다.

 

하지만 모듈을 이용했기에 

다른 파일(calc.js)에 있던 함수(add 함수, substract함수)를 사용할 수 있었고,

그덕에 코드를 짧게 쓸 수 있게 됐다.

 

지금 당장 이해가 안 갈 수도 있다.

그냥 모듈을 사용하면 코드가 간결해 지구나!

라고만 인지하고 가도 충분하다.


2. 모듈 사용 방법

 

모듈을 직접 만들어 보고, 사용하는 걸 다뤄보고자 한다.

 

나는 A.js라는 파일에 A라는 변수를 선언한 뒤 그 변수에

'Hi, I'm A.js'라는 문자열을 저장할 예정이다.

그리고 A.js라는 파일에 있는 A라는 변수를

B.js 파일에서 사용할 예정이다.

 

// A.js

const A = "Hi, I'm A.js";

module.exports = A;

 

일단 A.js 파일에 위와같은 코드를 작성했다.

A라는 변수에 "Hi, I'm A.js"란 문자열을 저장했다.

 

그리고 맨 마지막에 module.exports = A; 가 보인다. 

 

 

module.exports '모듈을 내보내는 것'으로

A.js 파일에 있는 A라는 변수를 모듈을 다른 파일에서 사용할 수 있어!

라고 해주는 것이다.

 

모듈을 사용하지 않았다면 A.js 파일에 있는 A라는 변수는

다른 파일에서 사용할 수 없었다.

 

Node.js에선 하나의 모듈은 자신만의 스코프(범위)를 가지기 때문에

전역변수 중복 문제가 발생하지 않는다.

 

이게 무슨 말이냐면 A.js 파일에서 선언한 변수 A와

B.js 파일에서 선언한 변수 A는

똑같이 A라는 변수 이름을 가지지만 서로 다른 변수로 인식된다.

 

따라서 자신의 스코프에서만 사용할 수 있었던 모듈의 기능을

다른 모듈에서 사용하려면 module.exports를 통해

외부에서도 사용하고 싶다고 알려줘야 한다.

 

module.exports를 사용하면 A.js라는 파일에서 선언한 A란 변수를

그대로 가져와서 B.js라는 파일에서 사용할 수 있게 된다.

 

// B.js

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

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

 

위의 코드는 B.js 파일에 쓰인 코드다.

 

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

A.js 파일에 있는 모듈을 가져와라~는 뜻이다.

 

다른 모듈의 기능은 require란 단어를 써서 불러올 수 있다.

module.exports가 모듈을 내보내는 것(다른 곳에서 모듈을 사용할 수 있게 모듈을 내보내는 것)이었다면

require()은 (다른 곳에 있는)모듈을 불러온다는 뜻이다.

 

 

node B.js를 입력해서 B.js 파일을 실행해줬더니

결과로 Hi, I'm A.js in B.js가 출력됐다.

 

이렇게 exports와 require을 통해

모듈을 내보내고, 불러옴으로서 모듈을 사용할 수 있다.

 

 

* 추가

 

우리가 이렇게 만든 모듈을 파일 모듈이라 한다.

반대로 Node에서 제공하는 기본 모듈,

가령 http나 express같은 모듈은 코어 모듈이라고 한다.

 

 

 

* Node.js로 서버 만들기 책을 참고해서 작성한 글입니다.

반응형