[Node.js] 모듈 & 비동기 프로그래밍
Module
모듈(Module)이란 "전체를 이루는 부품 하나하나"를 의미한다.
Node.js에서는 JavaScript 파일 하나가 모듈이다.
이러한 모듈들이 여러 개 모여 하나의 프로그램이 되는 것이다.
사용법
1. 모듈 생성하기
다음은 덧셈, 뺄셈, 곱셈, 나눗셈 연산이 들어있는 math-tools.js라는 모듈을 생성하는 코드이다.
// math-tools.js
// Module 생성
function plus(a, b) {
return a + b;
}
function minus(a, b) {
return a - b;
}
function multiply(a, b) {
return a * b;
}
function divide(a, b) {
return a / b;
}
2. 모듈 내보내기
외부에서 math-tools.js 모듈을 사용하려면 모듈 생성 후, 모듈을 내보내는 코드를 작성해야 한다.
모듈을 내부의 것을 외부로 공개하는 방법은 2가지가 있다.
1) 공개하고 싶은 것들을 "하나씩" exports로 공개
exports . 모듈_외부로_공개할_이름 = 모듈_내부에서의_이름 ;
// math-tools.js
// Module 생성
function addAB(a, b) {
return a + b;
}
// Module 내보내기
exports.plusAB = addAB;
// 생성 & 공개 (동시에)
// 화살표 함수(Arrow Function)을 사용하여 "함수 표현식(Function Expression)" 형태로 작성
exports.PI = 3.14;
exports.add = (a, b) => { return a + b; };
exports.subtract = (a, b) => { return a - b; };
exports.multiply = (a, b) => { return a * b; };
exports.divide = (a, b) => { return a / b; };
2) 공개하고 싶은 것들을 모아서 하나의 "객체"로 만들고 module.exports로 그 객체를 통째로 공개
module . exports = 객체이름 ;
// math-tools.js
// 모듈 생성 (객체)
let calculator = {
PI : 3.14,
add : (a, b) => a + b,
subtract : (a, b) => a - b,
multiply : (a, b) => a * b,
divide : (a, b) => a / b,
}
// 객체 공개하기
module.exports = calculator;
3. 외부에서 사용하기
1) 모듈 로드(Load)하기
외부에 있는 모듈을 가져오는 것을 "모듈을 로드(Load)한다"고 표현한다.
이때 require 함수를 사용하여 모듈을 로드한다.
const 상수명 = require( 모듈_경로 ) ;
- 모듈을 로드하는 함수
- 모듈을 로드해서 하나의 객체를 리턴
- 모듈_경로를 작성할 때, 모듈의 확장자인 .js를 꼭 붙이지 않아도 됨
- require가 리턴하는 객체는 변수(let)보다는 상수(const)로 받는 것이 좋다.
변수(let)에 저장하게 되면 나중에 이미 존재하는 변수에 재할당하는 일이 발생할 수 있으므로,
한 번 할당되면 다시 할당할 수 없는 상수(const)에 저장하는 것이 실수를 방지하는 방법이다.
// main.js
// 모듈 로드하기
const m = require('./math-tools.js');
// 모듈 사용하기
console.log(m.PI);
console.log(m.add(1, 2));
console.log(m.subtract(7, 2));
console.log(m.multiply(4, 2));
console.log(m.divide(8, 2));
종류
모듈은 크게 "직접 만든 모듈"과 "이미 존재하는 모듈" 이렇게 두 가지로 나눌 수 있다.
이전에 살펴본 내용은 "직접 만든 모듈"에 해당한다. 지금부터 "이미 존재하는 모듈"에 대해 알아보자.
모듈 (Module)
- 직접 만든 모듈
- 이미 만들어져 있는 모듈
- Core 모듈
- Third Party 모듈
Core Modules
코어 모듈(Core Module)은 node라는 실행 프로그램 안에 이미 포함되어 있는 모듈이다.
이 모듈들은 Node를 만든 개발자들이 일반적으로 필요한 기능들을 모아 미리 Node 안에 넣어둔 것이다.
따라서 Node가 설치되어 있기만 하다면 코어 모듈을 바로 사용할 수 있다.
💡 Core Module의 종류 및 자세한 사용법은 다음 공식문서를 참고한다.
Node.js API 공식 문서
[ 코어 모듈 예시 ]
///// 01. < fs : File System > 코어 모듈 /////
const fs = require('fs');
// readdirSync 함수 : 특정 디렉토리 안에 있는 파일 목록을 배열 형식으로 반환(return)
let fileList = fs.readdirSync('.');
console.log(fileList);
// writeFileSync 함수 : 지정한 파일 안에 원하는 내용 작성
// new라는 파일에 'Hello Node.js!'를 작성
fs.writeFileSync('new', 'Hello Node.js!');
///// 02. < os : Operating System > 코어 모듈 /////
const os = require('os');
// cpus 함수 : 현재 컴퓨터의 CPU 정보를 리턴
console.log(os.cpus());
Third Party Modules
서드파티 모듈(Third Party Module)은 "제 3자가 만든 모듈"이다.
다시말해, 여러 개발자 혹은 회사들이 만들어 인터넷 공개 저장소에서 제공하고 있는 모듈을 의미한다.
이 모듈을 사용하려면 공개 저장소에서 내 컴퓨터로 모듈을 가져와야 한다.
[ 서드파티 모듈 예시 ]
cowsay라는 서드파티 모듈을 사용해보자.
1) 터미널에 npm install cowsay
명령을 입력하여 모듈을 설치한다.
설치를 완료하면 package-lock.json 파일과 node_modules라는 폴더가 새롭게 생성될 것이다.
2) main.js에 다음 코드를 입력한다.
// main.js
const cowsay = require('cowsay');
console.log(cowsay.say({
text : "Hello, COWSAY Module!",
}));
3) 터미널에 node main.js
명령을 입력하여 main.js를 실행시킨다. 결과는 다음과 같다.
비동기 프로그래밍
먼저 main 모듈(main.js)에 작성한 다음 예시 코드의 결과를 예상해보자.
1. 동기 실행
// main.js
// 파일 시스템 모듈(코어 모듈) 로드
const fs = require('fs');
console.log('Start!');
// 파일의 내용을 읽어서 리턴 ---> fs.readFileSync( 파일명 , 인코딩_방식 )
let content = fs.readFileSync('./new', 'utf8');
console.log(content);
console.log('Finish!');
작성한 순서대로 코드가 실행되는 것을 확인할 수 있다.
2. 비동기 실행
비동기 실행
특정 작업이 완료되었을 때 실행할 콜백을 등록해두고 바로 다음 코드로 실행을 넘기는 것을 비동기 실행이라고 한다. 이 비동기 실행을 이용한 프로그래밍을 비동기 프로그래밍이라고 란다.
📌 콜백 함수 (Callback Function) : 어떤 작업이 완료되고 실행될 함수
// main.js
// 파일 시스템 모듈(코어 모듈) 로드
const fs = require('fs');
console.log('Start!');
// fs.readFile( 파일명 , 인코딩_방식 , 콜백함수 );
fs.readFile('./new', 'utf8', (error, data) => {
console.log(data);
});
console.log('Finish!');
이번에는 코드가 작성한 순서대로 실행되지 않았다.
그 이유는 바로 readFile 함수가 비동기 실행 함수이기 때문이다.
readFile 함수의 세 번째 인자인 콜백함수는 readFile 함수의 읽기 작업이 완료된 이후에 실행된다.
따라서 코드 실행 순서를 정리해보면 다음과 같다.
1. console.log('Start!');
2. fs.readFile
3. console.log('Finish!');
4. (error, data) => { console.log(data); }
비동기 실행의 또 다른 방법, " 이벤트 "
📌 Event 코어 모듈
- EventEmitter라는 클래스를 외부에 공개한다.
- EventEmitter를 우리말로 하면 "이벤트 발송기" 혹은 "이벤트 전파기"라고 할 수 있다.
- EventEmitter가 있어야 이벤트를 사용할 수 있다.
- on 메소드 : 어떤 이벤트가 발생했을 때 실행할 콜백을 등록하는 함수
- emit 메소드 : 이벤트를 직접 발생시키는 함수
// main.js
// Event 코어 모듈 로드
const EventEmitter = require('events');
// myEmitter이라는 이름을 가진 EventEmitter 객체 생성
const myEmitter = new EventEmitter();
// on 메소드 --> test 이벤트가 발생하면 Success! 문자열 출력
myEmitter.on('test', () => {
console.log('Success!');
});
// emit 메소드 --> test 이벤트 직접 발생
myEmitter.emit('test');
Author And Source
이 문제에 관하여([Node.js] 모듈 & 비동기 프로그래밍), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@savin/Node.js-모듈-비동기-프로그래밍저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)