나의 개발일지(김지헌)
항해 99 14일차 10/02 본문
오늘은 강의 자료를 마지막으로 보고 내일 본격적으로 시작할려고한다.
몽구스 설치 하기
npm install mongoose
몽고디비랑 연결하기
몽구스란?
MongoDB에서 가지고 있는 각 데이터 하나하나를 **문서(Document)**라고 정의합니다.
1개 이상의 Key-Value의 쌍으로 이루어져있습니다.
mongoose의 컬렉션(Collection)이란?
JSON형식의 여러가지 **문서(Document)**를 보유할 수 있습니다.
이후에 설명할 **관계형 데이터베이스(RDB)**의 Table과 동일한 역할을 합니다.
mongoose의 스키마(Schema)란?
스키마는 **컬렉션(Collection)**에 들어가는 **문서(Document)**에 어떤 종류의 값이 들어가는지를 정의합니다.
데이터를 모델링할 때 사용합니다.
❓대표적인 스키마의 타입은 어떤것들이 있을까요?
null : null 값과 존재하지 않는 필드
ex: null
String : 문자열
ex: “mongoDB”
Number : 숫자
ex: 3.14
Date : 날짜
ex: new Date()
Buffer : 파일을 담을 수 있는 버퍼, UTF-8이 아닌 문자열을 저장
ex: 0x65
Boolean : trueor false
ex: true
ex: ObjectId()
Array : 배열 형태의 값
ex: ["a", "b", "c"]
ex: ["a", "b", "c"]
ObjectId(Schema.Types.ObjectId) : 객체 ID, 주로 다른 객체를 참조할 때 넣음
mongoose의 모델(Model)이란?
데이터베이스에 데이터를 저장해줄때 데이터의 구조를 담당합니다.
스키마를 사용하여 만들고, MongoDB에서 실제 작업을 처리할 수 있는 함수들을 지니고 있습니다.
**문서(Document)**를 생성할 때 사용합니다.
.
예시
├── app.js
├── routes
│ ├── carts.js
│ └── goods.js
└── schemas
├── index.js
├── cart.js
└── goods.js
스키마 짜기 예시 index.js에 써야함 메인!!안에 넣기
const mongoose = require("mongoose");
const connect = () => {
mongoose
.connect("mongodb://localhost:27017/spa_mall")
.catch(err => console.log(err));
};
mongoose.connection.on("error", err => {
console.error("몽고디비 연결 에러", err);
});
module.exports = connect;
app.js 메인에 넣어두자
const connect = require("./schemas");
connect();
스키마 폴더에 넣어야함
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);
미들 웨어는 순차적으로 지나가기 때문에
app.use(express.json()); <= 미들 웨어
middleware가 app.use("/api", [goodsRouter]) 보다 위에!!
데이터 저장시 해 쓰는 코드
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 });
if (goods.length) {
return res.status(400).json({ success: false, errorMessage: "이미 있는 데이터입니다." });
}
const createdGoods = await Goods.create({ goodsId, name, thumbnailUrl, category, price });
res.json({ goods: createdGoods });
});
목록 조회 api
const express = require("express");
const Goods = require("../schemas/goods");
const Cart = require("../schemas/cart");
const router = express.Router();
router.get("/carts", async (req, res) => {
const carts = await Cart.find();
const goodsIds = carts.map((cart) => cart.goodsId);
const goods = await Goods.find({ goodsId: goodsIds });
const results = carts.map((cart) => {
return {
quantity: cart.quantity,
goods: goods.find((item) => item.goodsId === cart.goodsId)
};
});
res.json({
carts: results,
});
});
module.exports = router;
app.js 예시
미들 웨어임
const cartsRouter = require("./routes/carts");
app.use("/api", [goodsRouter, cartsRouter]);
이후 받아온 :goodsId값을 통해 이미 장바구니에 상품이 들어가 있는지 확인 후, 존재하면 수량만 수정하고, 존재하지 않는다면 새로운 카트에 상품정보를 새로 생성하도록 작성해볼거예요!
const Cart = require("../schemas/cart");
router.post("/goods/:goodsId/cart", async (req, res) => {
const { goodsId } = req.params;
const { quantity } = req.body;
const existsCarts = await Cart.find({ goodsId: Number(goodsId) });
if (existsCarts.length) {
return res.json({ success: false, errorMessage: "이미 장바구니에 존재하는 상품입니다." });
}
await Cart.create({ goodsId: Number(goodsId), quantity: quantity });
res.json({ result: "success" });
});
오늘 아쉬웠던거.
-과제를 빨리 파악하고 시작했어야 했는데 좀 늦은거 같다.
-홈페이지를 만들어서 시작했었는데 그런게 아니고 api구현만 하는거였다..
-Thunder Client를 사용해서 post 요청 get 요청 다 보낼 수 있다.
'항해 99' 카테고리의 다른 글
항해 99 16일차 10/04 (0) | 2022.10.05 |
---|---|
항해 99 15일차 10/03 (2) | 2022.10.04 |
항해 99 13일차 10/01 (0) | 2022.10.02 |
항해 99 12일차 09/30 (2) | 2022.10.01 |
항해 99 11일차 09/29 (0) | 2022.09.29 |