잡다한 사전

(2023.11.08) mongoose, nodo.js을 사용한 api 구현(1) 본문

프로그래밍 언어/node.js

(2023.11.08) mongoose, nodo.js을 사용한 api 구현(1)

잡사전집사 2023. 11. 8. 09:42
반응형

개인 과제 목표

1. 상품 작성 API

2. 상품 목록 조회 API

3. 상품 상세 조회 API

4. 상품 정보 수정 API

5. 상품 삭제 API

 

이렇게 5가지 API를 구현하는 것이 과제 요구 사항이였다. 

 

먼저 상품 작성 API 코드를 보고 코드리뷰를 시작해 보겠다.

 

1. 상품 작성 API

router.post("/products/", async (req, res) => {
  const { Product_Name, Product, User_Name, Password } = req.body;

  const products = Products.find({ Product_Name });

  if (products.length) {
    return res.status(400).json({
      success: false,
      errorMessage: "이미 존재하는 GoodsId입니다.",
    });
  }

  const createProducts = await Products.create({
    Product_Name,
    Product,
    User_Name,
    Password,
  });
  
    res.json({ products: createProducts });
});

POST를 이용하여 request에서 전달을 받아 데이터를 받아왔다.

이 때 products.length를 이용하여 이미 중복되는 값이 있는지 확인을 한 후 중복되는 값이 없다면, request를 통해서 req.body에 존재하는 데이터를 등록하도록 작성을 하였다. 

(Products.find 함수를 이용해서 req.body에서 입력한 Product_Name을 받아 데이터 베이스에 값이 있는지 확인을 했으며, 이때 위에서 말한것처럼 중복 되는 값이 있는지 검사를 한 후 데이터를 생성하였다.)

 

2. 상품 목록 조회 API

router.get("/products", async (req, res) => {
  const product = await Products.find({});
  res.send(product);
});

상품 목록 조회를 하는 API는 데이터 베이스에 존재하는 모든 상품을 가져오는 부분으로 find 함수를 이용해서 데이터베이스에 존재하는 모든 상품 정보를 가져와서 res.send를 이용해서 정보를 가져왔습니다.

 

3. 상품 상세 조회 API

router.get("/products/:productId", (req, res) => {
  const { productId } = req.params;

  console.log(productId);

  Products.findOne({ Product_Name: productId }).then((good) => {
    if (!good)
      return res.status(400).json({ message: "상품 조회에 실패하였습니다." });
    res.json({ good });
  });
});

GET을 이용하며, 상세 조회 API에서는 req.params를 이용하여 productId를 입력을 받아 특정 상품을 조회합니다.

findOne 함수에 입력받은 productId를 이용하여 특정 상품을 조회한 후, if문을 이용해서 상품이 존재하지 않을 때는 "상품 조회를 실패하였습니다."라는 message를 출력하며, 상품이 존재하는 경우 입력한 productId에 특정 상품을 출력받도록 작성하였습니다. 

 

4. 상품 정보 수정 API

router.put("/products/:productId", async (req, res) => {
  const { productId } = req.params;
  const { Password, Product, User_Name, State } = req.body;

  const good = await Products.find({ Product_Name: productId });

  if (good) {
    if (good.length) {
      if (Password === String(good[0].Password)) {
        console.log("success");
        await Products.updateOne(
          { Product_Name: productId },
          { $set: { Product: Product, User_Name: User_Name, State: State } }
        );
        res.json({ message: "success" });
      } else {
        res.send({ message: "비밀번호를 확인하세요" });
      }
    } else {
      res.send({ message: "상품이 존재하지 않습니다." });
    }
  }
});

PUT을 이용하며, 위에서 상품 조회를 할 때 사용한 방법으로 req.params로 productId를 입력받아서 특정 상품을 찾아서 find를 이용해서 good이라는 변수에 넣어주었다. 이 후 if문을 이용해서 데이터베이스에 상품이 존재하는지 검사한 후 입력되어 있는 password가 일치하는지 검사를 하는 if문을 작성하여, 일치하였을 때 req.body에 입력한 정보를 수정하며, 비밀번호가 일치 하지 않았을 때 "비밀번호를 확인하세요"라는 메세지를 출력시켜 주었다. 

 

5. 상품 삭제 수정 API

router.delete("/products/:productId", async (req, res) => {
  const { productId } = req.params;
  const { password } = req.body;

  const good = await Products.find({ Product_Name: productId });

  //   console.log(productId);

  if (good.length) {
    if (password === String(good[0].Password)) {
      await Products.deleteOne({ Product_Name: productId });
      console.log("일치");
      res.send({ message: "success" });
    } else if (password !== good[0].Password) {
      res.send({ message: "비밀번호를 확인해주세요" });
    }
  } else {
    res.send({ message: "상품이 존재하는지 확인해주세요." });
  }
  });

DELETE를 이용해서 삭제하는 API를 작성하였으며, 삭제를 하는 API는 위에서 수정을 하는 방법과 비슷한 방법을 사용하여, 상품이 존재하는지 검사한 후 비밀번호가 일치하는지 검사를 진행한 후 비밀번호가 일치하면 선택된 상품이 삭제되도록 만들었습니다.

 

이 때 삭제 API는 req.body에서 비밀번호만 입력을 받으며, 비밀번호가 일치한 경우에는 바로 삭제가 되도록 하였습니다.

(현재 만들어진 비밀번호를 일치시키고 등록하는 부분에서 암호화가 되지 않았기 때문에 보안적인 부분에서는 취약하다는 것을 알 수 있습니다. )

반응형