Node.js 모듈

Node.js으로 앱을 개발하기 위해서는

모듈 시스템을 설계해야 합니다.

 

먼저 모듈이란 낯선 단어에

대해서 알아보겠습니다.

 

모듈이란 프로그램 전체 시스템을

이루는 분리된 구성요소를 의미합니다.

고유의 기능이 있을 수도 있고

모듈간에 의존하거나 상호작용이

있을 수 있습니다.

 

Node.js의 대표적인 웹프레임워크는

express 입니다. 이것도 모듈입니다.

모듈은 이미 만들어진 것을

npm(노드 패키지 관리자)을 통해

설치해서 나의 앱에 사용할 수 있고,

혹은 자신만의 고유의 모듈을

만들어서 사용할 수도 있습니다.

깃헙에 배포하는 것도 가능합니다.

 

다른 언어에서 사용하는 용어와

비슷한 것은 라이브러리, 프레임워크,

패키지 같은 것이 될 수 있는데요.

 

설명보다는 실습을 통한 이해가

더 빠를 겁니다.

간단한 모듈을 작성하면서

알아보겠습니다.

 

1. 모듈의 작성

자바스크립트 파일은 모두 모듈입니다.

 

파일의 확장자가 .js면 모듈입니다.

 

모듈은 그냥 자바스크립트 문법으로

작성하면 됩니다.

 

아래는 calmod.js 라는 파일입니다.

이 파일을 모듈로 다른 파일에서

사용하기 위해서는 module 의

export 속성에 추가함으로써 가능합니다.

 

사칙연산을 하는 모듈을

만들어 봅니다.

(연산자를 사용하면 되지만

간단한 예시를 위한 코드입니다)

 

이들을 exports 합니다.

function add(a,b){
    return a+b;
}
function sub(a,b){
    return a-b;
}
function mul(a,b){
    return a*b;
}
function div(a,b){
    return a/b;
}

module.exports.add = add;
module.exports.sub = sub;
module.exports.mul = mul;
module.exports.div = div;

 

같은 디렉토리에 있는 다른 파일명을

calmodtest.js로 만들고 require 함수로

모듈을 가져왔습니다.

가져왔다고 하지만 실제로는 모듈파일을

실행시키는 일을 합니다.

 

모듈의 이름을 지정하고 (calmod)

. 도토 연산자로 모듈안에 정의한

함수를 사용할 수 있습니다.

 

함수 뿐만 아니라 변수, 클래스 등도

사용할 수 있습니다.

 

const calmod = require('./calmod.js');


console.log('add:'+calmod.add(3,5));
console.log('sub:'+calmod.sub(7,3));
console.log('mul:'+calmod.mul(7,7));
console.log('div:'+calmod.div(9,3));

 

모듈 실행 결과
모듈 실행 결과

 

모듈을 exports 즉 바깥에서 사용할 수

있도록 수출하는 방법에는

여러가지가 있습니다. 

 

표준적인 것을 사용하면 되겠지만

가독성을 위해서 일관성을 지키는 것도

중요합니다. (통일된 방식을 사용)

 

*******

 

아래 두개 코드의 실행값을 같습니다만,

아래 쪽은 익명함수를 사용합니다.

 

function add(a,b){
    return a+b;
}
function sub(a,b){
    return a-b;
}
function mul(a,b){
    return a*b;
}
function div(a,b){
    return a/b;
}

module.exports = {
    add: add,
    sub: sub,
    mul: mul,
    div: div
}

 

익명함수(anonymous function)는

말 그대로 이름이 없는 함수입니다.

외부에 수출하면 다른 이름으로

사용할 것 이니까 번거롭게

이름을 지을 필요가 없습니다.

var exports = module.exports = {};

exports.add = function(a,b){
    return a+b;
};
exports.sub = function(a,b){
    return a-b;
};
exports.mul = function(a,b){
    return a*b;
};
exports.div = function(a,b){
    return a/b;
};

 

 

*******

 

익명함수를 더 간소화 시키면

아래와 같습니다. =>a+b는

a+b를 return 하라는 뜻.

 

exports.add = (a,b)=>a+b;
exports.sub = (a,b)=>a-b;
exports.mul = (a,b)=>a*b;
exports.div = (a,b)=>a/b;

console.log(module);

 

사용시에도 { } 로 exports 의

이름을 바로 가져와서 사용할 수

있습니다. 귀찮게 이름을 다시

별도로 할당하지 않아도 됩니다.

 

const {add,sub,mul,div} = require('./calmod.js');

console.log('- add: ' + add(5,2));
console.log('- sub: ' + sub(5,2));
console.log('- mul: ' + mul(5,2));
console.log('- div: ' + div(5,2));

 

console.log(module)로 모듈의

내부값들을 확인할 수 있습니다.

exports에 4개의 익명함수가 들어있는데

이것들이 require 함수가 리턴하는 값입니다.

 

*실행결과

╭─kayken@KAYSYS ~/nodejs/tut-1 
╰─$ node calmodtest.js
<ref *1> Module {
  id: '/home/kayken/nodejs/tut-1/calmod.js',
  path: '/home/kayken/nodejs/tut-1',
  exports: {
    add: [Function (anonymous)],
    sub: [Function (anonymous)],
    mul: [Function (anonymous)],
    div: [Function (anonymous)]
  },
  parent: Module {
    id: '.',
    path: '/home/kayken/nodejs/tut-1',
    exports: {},
    parent: null,
    filename: '/home/kayken/nodejs/tut-1/calmodtest.js',
    loaded: false,
    children: [ [Circular *1] ],
    paths: [
      '/home/kayken/nodejs/tut-1/node_modules',
      '/home/kayken/nodejs/node_modules',
      '/home/kayken/node_modules',
      '/home/node_modules',
      '/node_modules'
    ]
  },
  filename: '/home/kayken/nodejs/tut-1/calmod.js',
  loaded: false,
  children: [],
  paths: [
    '/home/kayken/nodejs/tut-1/node_modules',
    '/home/kayken/nodejs/node_modules',
    '/home/kayken/node_modules',
    '/home/node_modules',
    '/node_modules'
  ]
}
- add: 3
- sub: -1
╭─kayken@KAYSYS ~/nodejs/tut-1 
╰─$ node calmodtest.js
<ref *1> Module {
  id: '/home/kayken/nodejs/tut-1/calmod.js',
  path: '/home/kayken/nodejs/tut-1',
  exports: {
    add: [Function (anonymous)],
    sub: [Function (anonymous)],
    mul: [Function (anonymous)],
    div: [Function (anonymous)]
  },
  parent: Module {
    id: '.',
    path: '/home/kayken/nodejs/tut-1',
    exports: {},
    parent: null,
    filename: '/home/kayken/nodejs/tut-1/calmodtest.js',
    loaded: false,
    children: [ [Circular *1] ],
    paths: [
      '/home/kayken/nodejs/tut-1/node_modules',
      '/home/kayken/nodejs/node_modules',
      '/home/kayken/node_modules',
      '/home/node_modules',
      '/node_modules'
    ]
  },
  filename: '/home/kayken/nodejs/tut-1/calmod.js',
  loaded: false,
  children: [],
  paths: [
    '/home/kayken/nodejs/tut-1/node_modules',
    '/home/kayken/nodejs/node_modules',
    '/home/kayken/node_modules',
    '/home/node_modules',
    '/node_modules'
  ]
}
- add: 7
- sub: 3
- mul: 10
- div: 2.5

 

한개의 함수만 Exports

 

exports 에 한개의 함수만 할당하면

하나의 함수만 exports 하게됩니다.

이 경우 require 로 가져온 함수를

그대로 사용하면 됩니다.

 

하나의 모듈에 여러개의 함수를

exports 할 것 이면 적합하지 않습니다.

 

여기서 알아둬야 할 것은

객체지향프로그램에서 처럼

exports 를 통해서 어떤 것을

외부에 노출할 것인가, 안할 것인가

선택할 수 있다는 것입니다.

설계의 필요에 따라 달라지겠죠.

 

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

module.exports = add;
const add = require('./calmod.js');

console.log('add:'+ add(3,5));

 

require 함수와 npm

require 함수는 자바나 파이썬의

import 문이나 C계열의 include 처럼

외부의 기능을 사용하기 위해서

모듈을 가져오는 것 입니다.

 

상세한 내용에 따라 라이브러리냐,

프레임워크냐, 모듈이냐 등 여러가지

이름이 붙을 수 있겠지만 JS에서는

완성된 모듈 시스템을 싸잡아서

패키지라고 부릅니다.

 

npm은 분산된 JS의 패키지 repository로

JS 커뮤니티에 의하면 현재 130만개의

패키지가 개발되어 있다고 합니다.

그러니까 이 패키지들을 가져다 써서

자바스크립트로 만들 수 있는

프로그램의 수도 사실상 무한하다고

말할 수 있을 것 입니다.

 

어떤 이는 자바스크립트가 세계를

움직이고 있다고 표현하기도 하는데요.

틀린말은 아닌 것 같습니다.

 

npm 관리자로 필요한 모듈을

설치해서 require 함수로 가져오기만

하면 되기 때문에 어떤 프로그램이든

쉽고 빠르게 개발할 수 있는 것 입니다.

 

npm의 기본 정책은 오픈소스입니다.

 

오픈소스 커뮤니티가 빵빵한 것은

파이썬과 양대산맥을 이루고 있는데

둘 다 프로젝트가 백만개 이상이라서

웬만한 프레임워크, 라이브러리를

다 갖추고 있습니다만,

굳이 둘의 차이가 뭔지를 찾아보면

자바스크립트는 웹쪽 관련 패키지가

중심이 되고 파이썬은(Pypi) 웹보다는

일반 앱쪽의 패키지가 더 많은 것 같습니다.

 

파이썬 웹프레임워크도 인기가 있긴 한데

역시 태생적으로 웹에서 출발한

자바스크립트의 Node.js 가 웹은 더

앞서있다고 말할 수 있습니다.

 

Node.js와 자바스크립트를 왜 학습하는가?

라는 질문에는 당연히 웹 서비스를

개발하기 위한 목적이 주요합니다.

(물론 Node.js는 웹서버 말고도

수많은 일을 할 수 있습니다.)

 

요약

Node.js의 모듈 사용법에 대해서

알아봤습니다.

 

모듈시스템의 내부 동작은 복잡한데

내부의 속성값들을 확인하고 싶다면

exports 하는 모듈에서

console.log(module);

으로 상세한 내부를 볼 수 있습니다.

 

module 은 지금있는 그 파일을

의미합니다. Node.js는 그 자체가

wrapper 로 파일을 module로

감싸는데 exports 속성에 있는 참조는

모듈을 소환하는 require 함수에서

리턴되는 것 입니다.

그것으로 모듈의 기능을

사용할 수 있는 것이죠.

 

모듈(패키지)과 연결이 되는 것 입니다.

 

복잡해 보이는데 모듈의 관계를

잘 따라가면 다 연결되어 있습니다.

공유하기

facebook twitter kakaoTalk kakaostory naver band