MongoDB & mongoose

·2022년 12월 14일
0

study

목록 보기
4/81
post-thumbnail

05. MongoDB → mongoose

데이터베이스

단순히 데이터를 잘 저장하고 잘 찾기 위해 만들어진 소프트웨어를 Database Management System(DBMS)

DB 서버의 모든 데이터는 DBMS가 관리.

MongoDB

가장 인기있는 비관계형 데이터베이스 (NoSQL) 중 하나

  • 모든 데이터가 JSON 형태로 저장됩니다.
  • 복잡한 구조를 쉽게 저장할 수 있는 장점이 있습니다.
  • 무료로 사용할 수 있습니다.
  • 스케일을 쉽게 줄이고 늘일 수 있습니다.

웹 서버 & DB 서버

웹 서버는 DB 서버를 이용하는 DB 클라이언트가 될 수 있습니다.

브라우저 ↔ 웹 서버 ↔ DB 서버

  • 웹 서버웹 클라이언트가 원하는 데이터와 기능을 제공합니다.
  • DB 서버는 데이터를 최대한 성능 좋게 저장하고 DB 클라이언트가 원하는 데이터를 제공합니다.

Studio 3T

  • Studio 3T는 API의 사용을 도와주는 API Client처럼 MongoDB를 위해서 만들어진 MongoDB Client입니다.
  • Studio 3T의 GUI를 통해 MongoDB에 저장된 데이터를 관리하기 쉽게 보여주는 프로그램입니다.
  • DB Client와 API Client의 다른점은?
    서버에 연결해 데이터를 보내는것 까지는 같은 개념이지만 DBMS는 웹처럼 단순하지 않아 프로그램 사용법이 조금 더 복잡하고 DB의 데이터를 조회하거나, 관리할 수 있는 기능을 제공합니다.
    Studio 3TDB Client 종류 중 하나이며, MongoDB를 관리하기 위한 DB Client입니다.

명령어

  • db.collectionName.find({})
  • db.collectionName.insertOne({ key: "value", key2: "값" })
  • db.collectionName.deleteOne({ _id: ObjectId("...")})

Mongoose

우리는 API에 MongoDB를 연결해서 데이터를 주고 받아볼 예정.
코드에서도 DB Client 역할을 하는 무언가가 있어야 데이터베이스에 연결을 할 수 있음.
=> mongoose 라는 도구를 이용해 데이터베이스에 연결

mongoose의 문서(Document)

MongoDB에서 가지고 있는 각 데이터 하나하나를 문서(Document)라고 정의합니다.
1개 이상의 Key-Value의 쌍으로 이루어져있습니다.

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

mongoose의 컬렉션(Collection)

JSON 형식의 여러가지 문서(Document)를 보유할 수 있습니다.
이후에 설명할 관계형 데이터베이스(RDB)Table과 동일한 역할을 합니다.

mongoose의 스키마(Schema)

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

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

null, string, number, date, buffer, boolean, objectId, array 등

mongoose의 모델(Model)이란?

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

  • 스키마를 사용하여 만들고, MongoDB에서 실제 작업을 처리할 수 있는 함수들을 지니고 있습니다.
  • 문서(Document)를 생성할 때 사용합니다.

API작성해보기

GET/POST/PUT/DELETE

// 상품목록조회
router.get("/goods", (req, res) => {
  res.status(200).json({ goods: goods });
});

// 상품상세조회
router.get("/goods/:goodsId", (req, res) => {
  const { goodsId } = req.params;
  // let result = null;
  // for(const good of goods) {
  //     if(Number(goodsId) === good.goodsId) {
  //         result = good;
  //     }
  // }
  const [detail] = goods.filter((goods) => goods.goodsId === Number(goodsId));
  res.status(200).json({ detail });
});

// 장바구니에 상품추가 api
const Cart = require("../schemas/cart.js");
router.post("/goods/:goodsId/cart", async (req, res) => {
  const { goodsId } = req.params;
  const { quantity } = req.body;

  const existsCarts = await Cart.find({ goodsId });
  if (existsCarts.length) {
    return res.status(400).json({
      success: false,
      errorMessage: "이미 장바구니에 해당 상품이 존재합니다.",
    });
  }

  await Cart.create({ goodsId, quantity });

  res.json({ result: "sucess" });
});

//장바구니 상품 수량 수정 api(없는 상품이여도 오류는 안남)
router.put("/goods/:goodsId/cart", async (req, res) => {
  const { goodsId } = req.params;
  const { quantity } = req.body;

  const existsCarts = await Cart.find({ goodsId });

  if (existsCarts.length) {
    await Cart.updateOne(
      { goodsId: goodsId },
      { $set: { quantity: quantity } }
    );
  }
  res.status(200).json({ success: true });
});

// 장바구니 상품을 제거하는 api
router.delete("/goods/:goodsId/cart", async (req, res) => {
  const { goodsId } = req.params;

  const existsCarts = await Cart.find({ goodsId });

  if (existsCarts.length) {
    await Cart.deleteOne({ goodsId });
  }

  res.json({ result: "success" });
});
profile
개발자 꿈나무

0개의 댓글