🎉 berenickt 블로그에 온 걸 환영합니다. 🎉
Back
NodeJs
03-Node.js 모듈 시스템

모듈이란?

1. 모듈이란?

  • Node.js에서 module은 ‘필요한 함수들의 집합’을 의미한다.
  • 사용하고자 하는 모든 기능을 다 자신이 처음부터 만들어서 사용할 수 없다.
    • 그래서 누군가가 이미 만들어 놓은 모듈을 이용해서 사용하면 된다.
  • 노드 JS에서 제공해주는 많은 모듈들을 손쉽게 사용할 수 있다.
  • 또한 직접 모듈을 만들어서 사용할 수도 있다.
  • 이러한 모듈을 가져와서 사용할 때는 require 함수를 이용해서 다른 모듈들을 가져올 수 있다.

1.1 모듈 종류

1.1.1 Core Module

Node.js에서 기본적으로 내장된 모듈을 의미

  • http 모듈 : http 서버를 생성하기 위한 클래스, 메소드, 이벤트를 포함
  • url 모듈 : URL 확인 및 구문 분석을 위한 메서드가 포함
  • querystring 모듈 : 쿼리 문자열을 처리하는 메서드가 포함
  • path 모듈 : 파일 경로를 처리하는 메서드가 포함
  • fs 모듈 : 파일 I/O 작업을 위한 클래스, 메서드 및 이벤트가 포함
  • util 모듈 : 프로그래머에게 유용한 유틸리티 기능이 포함

1.1.2 Local Module

Node.js 애플리케이션에서 로컬로 생성된 모듈을 의미

  • 이 모듈은 별도의 파일과 폴더에 애플리케이션의 다양한 기능을 포함
  • Node.js 커뮤니티에서 사용할 수 있도록 패키지로 만들어 NPM을 통해 배포 가능
  • e.g. MongoDB에 연결하고 데이터를 가져와야 하는 경우
    • 애플리케이션에서 재사용할 수 있는 모듈을 생성 가능

1.1.3 Third Party Module

NPM(Node Package Manager)을 사용하여 온라인에서 사용할 수 있는 모듈이다.

  • 이러한 모듈은 프로젝트 폴더에 설치하거나 전역적으로 설치 가능
  • 인기 있는 타사 모듈 중 일부는 mongoose, express, etc.

1.2 모듈을 불러오는 법

1
const module = require('module_name')

require() 함수를 이용해서 자바스크립트 파일을 읽고, 그 파일을 실행시켜 객체를 반환한다.

이렇게 모듈을 가져와서 변수 또는 상수에 할당해서 사용할 수 있다.


2. HTTP 서버 구축하기

2.1 HTTP 모듈 이용

Node.js Built-in 모듈 중에서 HTTP 모듈을 이용해서 서버를 구현해보자. 아래와 같이 3000번 포트를 이용해서 로컬 호스트에 브라우저로 접근하면, Hello, World!라는 문구가 나온다.

1
// http build-in 모듈 가져오기
2
const http = require('node:http')
3
4
// 3000번 포트 사용
5
const port = 3000
6
7
// 모듈을 사용해 HTTP 서버를 만들기
8
const server = http.createServer((req, res) => {
9
res.statusCode = 200
10
res.setHeader('Content-Type', 'text/plain')
11
res.end('<h1>Hello, World</h1>')
12
})
13
14
// 서버는 지정된 포트(3000)에서 수신대기하도록 설정됨
15
// 서버가 준비되면, 수신 콜백 함수가 호출됨
16
server.listen(port, hostname, () => {
17
console.log(`Server running at port : ${port}/`)
18
})
  • req : 요청 세부 정보를 제공
    • 이를 통해 요청 헤더 및 요청 데이터에 액세스한다.
    • http.IncomingMessage 객체
  • res : 클라이언트에 반환할 데이터를 채우는데 사용
    • http.ServerResponse 객체
    • res.status 코드 = 200
    • 성공적인 응답을 나타내기 위해 statusCode 속성을 200으로 설정
  • Content-Type 헤더도 설정합니다.
    • res.setHeader(‘콘텐츠 유형’, ‘텍스트/html’);
  • 그리고 end()에 대한 인수로 내용을 추가하여 응답을 종료한다.

3. 모듈을 사용하는 이유

모듈들이 모여서 프로그램이 된다.

장점

  • 존재하는(이미 작성한) 코드를 재사용 가능
  • 관계가 있는 코드끼리 모아 놓아서 코드를 정리 가능
  • 관계없는 디테일한 부분은 숨기고, 직접 사용되는 코드만 가져와서 보여줄 수 있다.
    • (해당 모듈 전체를 가져오는 게 아닌 특정 함수나 변수, 클래스만을 가져와서 사용)

4. 모듈을 export하는 여러 가지 방법

1
// 상수도 export 가능
2
module.exports.A = 1
3
4
// 이런 식으로도 export 가능
5
module.exports.encrypt = function encrypt(data) {
6
return 'encrypted data'
7
}
8
9
// module 생략해도 가능
10
exports.someFunction = function someFunction() {}
11
12
function send(url, data) {
13
const encryptedData = encrypt(data)
14
console.log(`${encryptedData}` is being sent to `${url}`)
15
}
16
17
moudle.exports = {
18
// send: send
19
send
20
}
21
22
// 이 함수를 default로 export한다면 이렇게도 가능
23
module.exports = function read() {
24
return decrypt('data')
25
}
26
27
// default로 export 했다면 이렇게도 가능
28
const read = require('./response')
29
30
function makeRequest(url, data) {
31
// 요청을 보내기
32
request.send(url)
33
// 데이터를 리턴하기
34
return read()
35
}

처음에 사용한 module.exports = {}가 가장 좋은 방법입니다. 왜냐하면 아래에 어떤 게 export 되어 있는지 정리되어 있기 때문입니다.


5. CommonJS와 ECMAScript 모듈의 차이

지금까지 Node.js에서 우리가 사용한 모듈은 CommonJS이다. 이것은 바로 module.exports로 내보내고, require로 가져온다.
이 CommonJS는 Node.js에서 기본 모듈로 사용되고 있다.


5.1 ECMAScript Module

EcmaScript 모듈은 아래에서 보는 것과 같이 export, import를 이용해서,
모듈에서 내보내고 가져오는 Syntax를 이용하고 있습니다.

  • ES 모듈은 JavaScript의 표준이고, CommonJS는 Node.js의 기본값이다.
  • 모든 주요 브라우저는 ES 모듈을 지원하며,
    • React, Vue 같은 프레임워크에서도 ES 모듈의 가져오기(import)/내보내기(export)를 사용 가능하다.
  • 이러한 프레임워크는 Babel과 같은 transpiler를 사용하여,
    • 이전 Node.js 버전이 지원하는 가져오기(import)/내보내기(export) 구문(syntax)을 require()로 컴파일한다.
  • Node.js 13.2.0 버전부터 Ecmascript module을 지원함

5.2 Ecmascript 란?

1
Ecma international ---> ECMA-262 기술규격 ---> ECMAScript
2
3
^ ECMA international : 정보 통신에 대한 표준을 제정하는 비영리 표준화 기구
4
^ ECMA-262 기술규격 : 표준어
5
^ ECMAScript : ECMA-262 기술규격을 토대로 만든 스크립트 언어

ECMAScript는 Ecma 인터내셔널에 의해 제정된 ECMA-262 기술 규격에 의해 정의된 범용 스크립트 언어이다.
또한 JavaScript는 ECMAScript 사양을 준수하는 범용 스크립팅 언어다.


5.3 ECMAScript6 (ES6, ES2015, ECMAScript 2015)

자바스크립트를 사용하다 보면 ES6에 대한 얘기를 많이하게 됩니다. 이 ES6는 ECMAScript 언어의 6번째 버전이다.
ES6는 ES2015이라고도 부르는데, 그 이유는 2015년 Ecma 인터내셔널이 ECMAScript를 매년마다 개정하기로 발표했기 때문이다.
따라서 앞으로는 매년 해의 이름을 딴 ECMAScript가 새로 발표될 예정이다.

ECMAScript 버전 중에서 이 ES6이 가장 중요한데 그 이유는 ES6에서 추가된 문법들이 기존의 문제들을 매우 깔끔하게 해결했으며,
가독성 및 유지 보수성을 보강하는 문법도 대거 추가됐다.
e.g. 새롭게 추가된 기능으로는 Promise, Class, Arrow function 등이 있다.


6. Node.js에서 ECMAScript 모듈 이용하기

6.1 가져오기

1
// 이전, CommonJS
2
const { send } = require('./request')
3
const { read } = require('./response')
4
5
// 이후, ECMAScript
6
import { send } from './request'
7
import { read } from './response'

6.2 내보내기

1
// 이전, CommonJS
2
module.exports = {
3
read,
4
}
5
6
// 이후, ECMAScript
7
export { read }

7. 모듈 캐싱

모듈에서 다른 모듈을 가져올 때, (load) ECMAScript 모듈을 사용하든지 CommonJS 모듈을 사용하든지 해당 모듈을 캐싱하게 된다.


8. index.js

  • https://www.youtube.com/watch?v=M3BM9TB-8yA
  • Node.js 를 개발한 Ryan Dahl 이 개발한 지 10년이 된 후 후회되는 부분 10가지를 말한 영상이다.
  • 그 10가지 중 하나가 바로 index.js 파일이라고 했다.
  • It needlessly complicated the module loading system
  • => 불필요하게 복잡한 모듈 로딩 시스템