관리 메뉴

나의 개발일지(김지헌)

항해 99 14일차 10/02 본문

항해 99

항해 99 14일차 10/02

코딩이좋아요 2022. 10. 3. 00:29

오늘은 강의 자료를 마지막으로 보고 내일 본격적으로 시작할려고한다.

더보기

몽구스 설치 하기

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()); <= 미들 웨어

 

middlewareapp.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