모듈이란?
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 모듈을 불러오는 법
1const module = require('module_name')
require() 함수를 이용해서 자바스크립트 파일을 읽고, 그 파일을 실행시켜 객체를 반환한다.
이렇게 모듈을 가져와서 변수 또는 상수에 할당해서 사용할 수 있다.
2. HTTP 서버 구축하기
2.1 HTTP 모듈 이용
Node.js Built-in 모듈 중에서 HTTP 모듈을 이용해서 서버를 구현해보자. 아래와 같이 3000번 포트를 이용해서 로컬 호스트에 브라우저로 접근하면, Hello, World!라는 문구가 나온다.
1// http build-in 모듈 가져오기2const http = require('node:http')34// 3000번 포트 사용5const port = 300067// 모듈을 사용해 HTTP 서버를 만들기8const server = http.createServer((req, res) => {9res.statusCode = 20010res.setHeader('Content-Type', 'text/plain')11res.end('<h1>Hello, World</h1>')12})1314// 서버는 지정된 포트(3000)에서 수신대기하도록 설정됨15// 서버가 준비되면, 수신 콜백 함수가 호출됨16server.listen(port, hostname, () => {17console.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 가능2module.exports.A = 134// 이런 식으로도 export 가능5module.exports.encrypt = function encrypt(data) {6return 'encrypted data'7}89// module 생략해도 가능10exports.someFunction = function someFunction() {}1112function send(url, data) {13const encryptedData = encrypt(data)14console.log(`${encryptedData}` is being sent to `${url}`)15}1617moudle.exports = {18// send: send19send20}2122// 이 함수를 default로 export한다면 이렇게도 가능23module.exports = function read() {24return decrypt('data')25}2627// default로 export 했다면 이렇게도 가능28const read = require('./response')2930function makeRequest(url, data) {31// 요청을 보내기32request.send(url)33// 데이터를 리턴하기34return 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 버전이 지원하는 가져오기(import)/내보내기(export) 구문(syntax)을
- Node.js 13.2.0 버전부터 Ecmascript module을 지원함
5.2 Ecmascript 란?
1Ecma international ---> ECMA-262 기술규격 ---> ECMAScript23^ 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// 이전, CommonJS2const { send } = require('./request')3const { read } = require('./response')45// 이후, ECMAScript6import { send } from './request'7import { read } from './response'
6.2 내보내기
1// 이전, CommonJS2module.exports = {3read,4}56// 이후, ECMAScript7export { 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
- => 불필요하게 복잡한 모듈 로딩 시스템