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