coding/Node.js

모듈(module), require(), IIFE

JIN_Coder 2022. 8. 3. 13:08

모듈이란

여러 독립된 기능들에 관한 코드가 모여있는 하나의 파일

 

모듈의 특징

- 유지보수성

기능들이 모듈화가 잘 되어있다면, 의존성을 그만큼 줄일 수 있기 때문에 어떤 기능을 개선하거나 수정할 때 편하다.

 

- 네임스페이스화

js의 전역 변수는 전역 공간을 차지하는데 모듈을 분리하면 모듈만의 네임스페이스를 갖기 때문에 중복을 방지한다.

 

- 재사용성

똑같은 코드를 반복하지 않고, 모듈로 분리시켜서 필요할 때마다 사용 할 수 있다.

 

 

모듈 유형

- 외장 모듈

일반 node.js 개발자들이 만들어 놓은 모듈(라이브러리)

외장 모듈을 사용 하기 위해선 npm을 사용

 

- 내장 모듈

node.js를 설치하면 제공되는 기본 모듈

 

 

module객체 확인

console.log(module)

/*
Module {
  id: '.',
  path: '/Users/ksnotebook/Desktop/test/node/module_practice',
  exports: {},	//💥 이 프로퍼티 주목! 💥
  parent: null,
  filename: '/Users/ksnotebook/Desktop/test/node/module_practice/calc.js',
  loaded: false,
  children: [],
  paths: [
    '/Users/ksnotebook/Desktop/test/node/module_practice/node_modules',
    '/Users/ksnotebook/Desktop/test/node/node_modules',
    '/Users/ksnotebook/Desktop/test/node_modules',
    '/Users/ksnotebook/Desktop/node_modules',
    '/Users/ksnotebook/node_modules',
    '/Users/node_modules',
    '/node_modules'
  ]
}
*/

module.exports는 빈 객체

 

 

require()

외부 모듈울 가져와서 사용 가능하게 해주는 메소드

require('파일 경로')로 외부 모듈을 가져온다.

// some.js
console.log('hello')

// app.js
require('./some.js')

// node app.js 실행시
// 'hello'

app.js를 실행시켰지만, some.js의 콘솔로그가 실행된다. (some.js 에서 모듈을 require()로 가져왔기 때문)

 

// some.js
const greet = function() {
	console.log('greeting to see you')
}

// app.js
require('./some.js')
greet()

// node app.js 실행시
// 에러발생

app.js 에서 greet() 함수를 실행시켰을 때 some.js 에서 정의된 greet 함수를 호출할 수 없다.(모듈의 기능으로 모듈 안의 API를 보호하기 때문)

require()로 가져와도 해당 모듈의 함수에 접근 권한은 없다. 모듈을 밖으로 내보낼 때 module.exports의 object를 정의해야 권한이 생김

 

해결방법

// some.js
const greet = function() {
	console.log('greeting to see you')
}
// module.exports에 외부에 공유할 API 대입하기
module.exports = greet

// app.js
const greeting = require('./some.js')
greeting()

// node app.js 실행시
// 'greeting to see you'

module.exports의 프로퍼티는 빈 객체이므로, greet 메소드를 대입하여 외부에서도 사용할 수 있도록 해준다.

app.js에서는 새 변수 greeting을 만들어 module.exports의 greet메소드를 받아 사용한다.

 

 

require 실행구조

// require()함수의 실행 구조
var require = (function(src){          //line 1 -> src를 받음
    var fileAsStr = readFile(src)      //line 2 -> src파일을 읽어 fileAsStr에 할당
    var module.exports = {}            //line 3 -> module.export에 빈 객체 할당
    eval(fileAsStr)                    //line 4 -> fileAsStr을 eval함
    return module.exports              //line 5 -> 리턴함
})()

즉, 경로에 들어온 파일을 읽고, 해당 파일의 module.exprots를 가져와서 리턴하기 때문에 해당 모듈의 기능을 사용할 수 있다.

 

 

IIFE(Immediately Invoked Function Expressions)

정의와 동시에 즉시 실행되는 함수

(function add(a, b) {
    console.log(a + b)
})(1, 4)
// 5

 

require과 IIFE의 관련성

require로 모듈을 불러오면 그 즉시 실행된다는 특징을 가진다.

// test.js
console.log("I'm from test.js");

// app.js
require('./test.js');

// node app.js
// "I'm from test.js"

require로 모듈을 가져와서 바로 실행하다 보니 콘솔로그가 바로 찍힌다.

 

 

 

 

node 에서 모듈(module) 에 대해서 (한 페이지에 끝!)

0. 모듈은 왜 필요한 것인가 자바스크립트는 웹페이지에 있어서 보조적인 기능을 수행하기 위해 한정적인 용도로 만들어진 태생적 한계가 있습니다. 다른 언어에 비해 부족한(나쁜) 부분이 있는

basemenks.tistory.com

 

'coding > Node.js' 카테고리의 다른 글

계층형 아키텍처 패턴(Layered Architecture Pattern)  (0) 2022.08.05
nodemon  (0) 2022.08.04
sequelize CRUD 사용법  (0) 2022.08.02
package.json  (0) 2022.07.31
npm jsonwebtoken  (0) 2022.07.29