web server 2

Ethan KIM·2022년 8월 10일
0

node.js

목록 보기
2/3

What is module?

여러 sprint를 진행하면서 module.exports, module, exports를 수도없이 보았다. 현재 웹서버를 진행하면서 따라가지 못하고 있는 이유는 이 module에 대해 정확히 이해를 하고 있지 않기 때문이다.

그래서, 모듈이 무엇인가?

여러 답변들 중에 가장 마음에 드는 답변은 이것이다.

To divide things up.

프로그래밍에서 가장 먼저 해결해야하는 부분은 복잡도를 줄여야하는데, line-by-line 프로그래밍은 모듈을 나눌 필요없이 그냥 직관적으로 볼 수 있다. 하지만, 작업하는 프로그램이 커질수록 코드의 양은 무한으로 늘어날 것이고, 결국 직관적이었던 프로그래밍도 양이 많아지고 복잡해진다면, 더이상 직관적이지 않게 된다.

그래서 프로그래머들은 프로그램을 self-contained chunk에 넣어두고 그 안에있는 디테일에 집중하지 않고, 그 chunk 가 무엇을 하는지 대충 알고 프로그램을 만들어 나간다. 여기서의 chunk가 바로 module이라고 생각하면 된다.

즉, 모듈이란, 한데 모아두면 복잡한 프로그램 코드들을 하나하나 특징에 맞게 나누는 역할을 하고, 이를 재사용하거나, 재활용해서 프로그래밍의 난이도를 낮추는 역할을 한다


Node.js 에서의 ECMAScript moudles에 대한 정의는,

the official standard format to package JavaScript code for reuse.

말그대로 재사용을 위한 정형화된 자바스크립트 코드 패키지 포맷 이라고 정의한다.

import 와 export statements로 나뉘고,

export는 export {function} 로 function 안에는 생성자 함수가 될 수도 있고, 
그냥 함수, class함수가 될 수 도 있다.


import는 import { function } from './user/file....' 이런식으로 모듈을 파일명등을 통해 
불러 올 수 있음 package.json에 있는것도 불러올 수 있고 등등등..

원래는 Javscript 에선 모듈 기능이 없었다. script tag로 로드하는 JavaScript 는 하나의 파일로 merge 하며 동일한 스코프를 가진다.

이는 ES6로 넘어와서 모듈기능이 추가되므로서 해결됬는데, import, expert를 내장모듈로 사용가능. 현재 브라우저에서 사용하기 위해선 webpack등의 모듈 번들러를 사용해야함.

JavaScript를 클라이언트 사이드에 국한하지 않고 범용적으로 사용하고자 하여 module 기능 해결 해야했는데, 이를 제안한 것이 commonJS 와 AMD(Asynchronous Moudle Definition)이다.

이에 Node.js는 CommonJS 채택.

Node.js 는 module 단위로 각 기능을 분할할 수 있다. module은 파일과 1대1 대응 관계를 가지며 하나의 모듈은 자신만의 독립적인 스코프를 가지게 된다. JavaScript와는 정 반대다.

모듈은 module.exports 또는 exports 객체를 통해 정의하고 외부로 공개한다. 공개된 모듈은 require 함수를 사용하여 import 한다.

어떠한 기능을 수행하기 위해 함수 또는 객체를 만드는데, 이를 한 파일에 써놓기엔 가독성이나 유지보수가 좋지 않아서 관련 함수 또는 객체들을 파일별로 따로 모아놓은 것들을 모듈이라고도함.

그렇다면 언제 module.exports를 써야하고 Exports를 써야하나?

이 두 양식의 차이점은.

@Module.exports

는 우리가 하나의 클래스나 변수나 함수를 다른 모듈로 보내고싶을때 사용하고, module.exports {} 로 바로 보내줄때 사용한다.

"calculator.js"

class Arithmetic {
    constructor(a, b) {
        this.a = a;
        this.b = b;
    }
 
    add() {
        return this.a + this.b;
    }
    subtract() {
        return this.a - this.b;
    }
 
    multiply() {
        return this.a * this.b;
    }
 
    divide() {
        if (this.b != 0) {
            return this.a / this.b;
        }
        return "divided by zero !!!!";
    }
};
 
module.exports = Arithmetic;

이 class 를 calculator.js에서 모듈화하여 모듈로 만들어 주었다면
operation.js 에서 이를 다음과 같은 방법으로 사용할 수 있다.

"operation.js"

const Arithmetic = require('./calculator.js');
const op = new Arithmetic(100,40);

@Exports

는 우리가 여러개의 변수나 함수를 다른 모듈로 보내고 싶을때 exports 방법을 사용한다.

"calculator.js"

exports.add = (a, b) => a + b;
exports.subtract = (a, b) => a - b;
exports.multiply = (a, b) => a * b;
exports.divide = (a, b) => {
    if (b != 0) {
        return a / b;
    }
    return `Divided by zero !!!`;
}


operation.js

const Arithmetic = require('./calculator.js');
console.log(`Addition -> ${Arithmetic.add(100,40)}`);

이런식으로 exports 는 보내고자 하는 변수나 함수가 많을때 사용한다.

exports 와 module.exports는 동일한 기능을 하며, 차이점은 2가지이다. 첫째는 위에서 말한 사용처와 둘째는,

require calls에 리턴되는것은 무조건 module.exports이다. export도 module.exports로 변경되어 리턴된다.

profile
좋아하는것만 함

0개의 댓글