[Node.js] 모듈 & 비동기 프로그래밍

23649 단어 node.jsnode.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');

좋은 웹페이지 즐겨찾기