module / exports - module.exports / 동기 - 비동기 / npm / pacakage.json

yunny·2023년 1월 22일
0

westudy

목록 보기
2/15

Node.js module system
module == 레고 조각
여러 모듈을 조합하여 하나의 소프트웨어 만듦

코드를 잘 모듈화 함

  • 유지보수 쉬움
  • 재사용성 높임
  • 확장성 높임
    => 결과적으로, 비용 감소 & 생산성 증대

모듈의 종류

  1. Built-in module : 기본적으로 내장되어 있는 모듈

  2. Custom module : Node.js CommonJS 방식으로 만든 모듈

  3. 3rd-party module : 다른 개발자들이 만들어 둔 모듈

CommonJS의 등장

JavaScript를 브라우저에서만 사용하는 언어가 아닌
일반적인 범용 언어로 사용하고자 함
=> 명세(specifiacation) 만듦
Node.js module system도 Common JS의 Module Specification 따름

CommonJS의 Module Specification

  1. 모든 모듈은 자신만의 독립적인 실행 영역이 필요
    전역변수(Global variable)와 지역변수(Local variable)를 분리함을 의미
    파일 하나에 모듈 하나를 작성하는 방법으로 독립적인 실행 영역 확보

  2. 모듈을 외부에서 사용할 수 있도록 공개
    exports라는 전역 객체 이용해서 정의

  3. require() 함수를 이용해서 모듈 불러오기

모듈은 module.exports 또는 exports 객체를 통해 정의하여 외부로 공개,
공개된 모듈은 require 함수를 사용하여 import!


exports 객체 사용하여 module 만들기

여러 개의 속성과 메소드 정의 가능

// calculator.js
const initialNum = 0

exports.add = (x, y) => initialNum + x + y;
// export 객체에 add method 정의

exports.substract = (x, y) => initialNum + x - y;
// export 객체에 substract method 정의

calculator.js는 독립적인 파일 스코프를 갖는 모듈
<exports 객체의 메소드로 정의>
add
substract

이때 변수 initialNum은 calculator 모듈에서 유효한 private 변수 지정
외부에 공개했을 때 사용 가능

// main.js

const calculator = require("./calculator.js");

console.log(`1 + 5 =  ${calculator.add(1, 5)}`);
console.log(`1 - 5 =  ${calculator.subtract(1, 5)}`);

main.js에서 require()로 calculator 호출하여 사용 가능

claculator 모듈은 객체 형태로 반환되어 calculator 변수에 담김

module.exports 사용

하나의 객체만 할당 가능

// calculator.js
const initialNumber = 0

function add(a, b) {
  return a + b;
}

function substract(a, b) {
  return a - b;
}

module.exports = {
  add,
  substract
}

calculator 모듈의 module.exports에는 하나의 객체만 할당

// main.js

const calculator = require("./calculator.js");

console.log(`1 + 5 = ${calculator.add(1, 5)}`);
console.log(`1 - 5 = ${calculator.substract(1, 5)}`);

require()함수를 통해 calculator moduel import -> calculator 변수에 할당

// main.js
const {add, substract} = require("./calculator.js");

console.log(`1 + 5 = ${add(1, 5)}`);
console.log(`1 - 5 = ${substract(1, 5)}`);

구조분해 할당하여 사용 가능!

Built-in modules - File system module

Node.js는 할 수 있지만
JavaScript는 못하는 일
= 파일 시스템(File System)에서 파일을 읽고 쓰는 기능

파일 읽고 쓰는 기능 - 동기적 방식

//syncFileSystem.js

const fileSystem = require('fs')

require()함수를 사용해서 FS 모듈 호출,
모듈 안에 우리가 사용할 수 있는 많은 함수들이 있는 객체 반환

파일 읽고 쓰는 기능 - 비동기적 방식


// CASE 2. Non-blocking, Asynchronous
// asyncFileSystem.js

const fileSystem = require("fs");

// Read File (Before)
fileSystem.readFile("./privateInformation.txt", "utf-8", (err, data1) => {
  console.log(`===== Before written ===== \n${data1}`);

  const additionalInfo = `${data1}PhoneNumber : 010-7777-0000\nModified at : ${Date.now()}`;

  // Write File
  fileSystem.writeFile("./privateInformation.txt", additionalInfo, "utf-8", (err, data2) => {
      console.log("===== Your file has been written =====");

      // Read File (After)
      fileSystem.readFile("./privateInformation.txt", "utf-8", (err, data3) => {
        console.log(`===== After written ===== \n${data3}`);
      });
    }
  );
});

실행결과

//zsh
$ node asyncFileSystem.js

===== 추가적으로 실행되어야 하는 코드 =====
추가적으로 실행되어야 하는 코드 1
추가적으로 실행되어야 하는 코드 2
추가적으로 실행되어야 하는 코드 3
추가적으로 실행되어야 하는 코드 4

===== Before written =====
Name : Harry Potter
Age  : 22

===== Your file has been written =====

===== After written =====
Name        : Harry Potter
Age         : 22
PhoneNumber : 010-7777-0000
Modified at : 1653192110477

비동기 함수가 실행되면 작업이 끝날 때까지 기다려주지 않고
바로 출력할 수 있는 결과부터 내보낸다
시간이 걸리는 작업들은 백그라운드에게 작업을 위임하여 실행 후 출력

3rd-party module 소스 코드들이 모여 있는 저장소, 웹사이트, CLI

이를 NPM 이라 통칭


텍스트
package.json
프로젝트에 대한 정보와 사용 중인 npm 패키지에 대한 정보를 담은 파일
버전 명시 필요

npm init - y

pacakage.json 파일의 속성

# pacakage.json 파일
{
  "name": "api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "lordmyshepherd",
  "license": "MIT",
	"dependencies": {
    "bcryptjs": "^2.4.3",
    "cors": "^2.8.5",
    "dotenv": "^16.0.0",
    "express": "^4.17.3",
    "jsonwebtoken": "^8.5.1",
    "mysql2": "^2.3.3",
    "typeorm": "^0.3.0"
  },
  "devDependencies": {
    "nodemon": "^2.0.15"
  }
}
  • scripts : node.js command line 정의해서 사용
  • dependencies : 프로젝트에서 사용하는 배포용 패키지
  • devDependencies : 프로젝트에서 사용하는 로컬 개발용 패키지
profile
기록하지 않으면 잊어버려요 !

0개의 댓글

관련 채용 정보