포시코딩

Mongoose 소개 및 Express에서의 사용법 본문

MongoDB

Mongoose 소개 및 Express에서의 사용법

포시 2022. 12. 13. 16:51
728x90

https://www.npmjs.com/package/mongoose

 

mongoose

Mongoose MongoDB ODM. Latest version: 6.8.0, last published: 8 days ago. Start using mongoose in your project by running `npm i mongoose`. There are 13094 other projects in the npm registry using mongoose.

www.npmjs.com

설치 방법

npm install mongoose

 

문서(Document)

MongoDB에서 가지고 있는 각 데이터 하나하나를 문서(Document)라고 정의한다.

1개 이상의 Key-Value의 쌍으로 이루어져 있다.

{
  "_id": ObjectId("6682192a1c155bd2f27881"), 
  "name": "csh", 
}

 

컬렉션(Collection)

JSON 형식의 여러가지 문서(Document)를 보유할 수 있다.

관계형 데이터베이스(RDB)Table과 동일한 역할을 한다.

 

스키마(Schema)

스키마는 컬렉션(Collection)에 들어가는 문서(Document)에 어떤 종류의이 들어가는지를 정의한다.

데이터를 모델링할 때 사용한다.

대표적인 스키마 타입

  • null: null 값과 존재하지 않는 필드
    • ex) null
  • String: 문자열
    • ex) "mongoDB"
  • Number: 숫자
    • ex) 3.14
  • Date: 날짜
    • ex) new Date()
  • Buffer: 파일을 담을 수 있는 버퍼, UTF-8이 아닌 문자열을 저장
    • ex) 0x65
  • Boolean: true or false
    • ex) true
  • ObjectId(Schema.Types.ObjectId): 객체 ID, 주로 다른 객체를 참조할 때 넣음
    • ex) ObjectId()
  • Array: 배열 형태의 값
    • ex) ["a", "b", "c"]

 

모델(Model)

데이터베이스에 데이터를 저장해줄 때 데이터의 구조를 담당한다.

스키마를 사용하여 만들고, MongoDB에서 실제 작업을 처리할 수 있는 함수들을 지니고 있다.

문서(Document)를 생성할 때 사용한다.

 

Express 웹 서버에 DB 연결

Directory Structure 예시

.
├── app.js
├── routes
│   ├── carts.js
│   └── goods.js
└── schemas
    ├── index.js
    ├── cart.js
    └── goods.js

연결

// (/schemas/index.js)
const mongoose = require("mongoose");

const connect = () => {
  mongoose
    .connect("mongodb://localhost:27017/db_name")
    .catch(err => console.log(err));
};

mongoose.connection.on("error", err => {
  console.error("몽고디비 연결 에러", err);
});

module.exports = connect;
// (/app.js)
const connect = require("./schemas");
connect();

strictQuery 에러 해결방법

서버 실행 시 위와 같은 에러가 뜰 경우 db 연결하는 코드 부분에 아래처럼 추가해준다. 

const mongoose = require("mongoose");

mongoose.set('strictQuery', true);  // 이 부분
const connect = () => {
  mongoose
    .connect("mongodb://localhost:27017/db_name")
    .catch(err => console.log(err));
};

mongoose.connection.on("error", err => {
  console.error("몽고디비 연결 에러", err);
});

module.exports = connect;

 

mongoose Schema

템플릿

const mongoose = require("mongoose");

const defaultSchema = new mongoose.Schema({
  defaultId: {
    type: Number,
    required: true,
    unique: true
  }
});

module.exports = mongoose.model("Defaults", defaultSchema);

예시

// (/schemas/goods.js)
const mongoose = require("mongoose");

const goodsSchema = new mongoose.Schema({
  goodsId: {
    type: Number,
    required: true,
    unique: true
  },
  name: {
    type: String,
    required: true,
    unique: true
  },
  thumbnailUrl: {
    type: String
  },
  category: {
    type: String
  },
  price: {
    type: Number
  }
});

module.exports = mongoose.model("Goods", goodsSchema);

 

데이터 추가

// (/routes/goods.js)
const Goods = require("../schemas/goods");

router.post("/goods", async (req, res) => {
	const { goodsId, name, thumbnailUrl, category, price } = req.body;
  // 객체 구조 분해 할당을 통해 데이터를 가져옴

  const goods = await Goods.find({ goodsId });  // find()를 통해 goodsId에 해당하는 값 존재하는지 확인
  if (goods.length) {  // goods.length가 0보다 크면
    return res.status(400).json({ success: false, errorMessage: "이미 있는 데이터입니다." });
  }

  const createdGoods = await Goods.create({ goodsId, name, thumbnailUrl, category, price });

  res.json({ goods: createdGoods });

위 코드 작성 후 사진처럼 Thunder Client를 통해 아래 데이터를 보내면 정상적으로 db에 데이터가 들어가는 것을 볼 수 있다.

{
   "goodsId": 2,
   "name": "시원한 콜라",
   "thumbnailUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRk7JqMw7ZYZP4ZW136wcoMTmLzbrMIJzUWb1Dhu9cHwCPp0gA&usqp=CAc",
   "category": "drink",
   "price": 3000
}
728x90