저장을 습관화

230710 TIL 본문

공부/TIL

230710 TIL

ctrs 2023. 7. 10. 11:08

- sequelize로 MySQL 다룰때

데이터 생성한다고 반드시 router.post 써야하는거 아니고

삭제한다고 반드시 router.delete 써야하는것도 아니고

수정한다고 반드시 router.put 써야하는것도 아니다

 

router.put 안에서도 Table.create, Table.destory 잘만 작동하더라..

 

 

- sequelize .increment(), .decrement()

MySQL 기준

테이블에 데이터 타입이 integer 등 숫자로 지정된 데이터의 값을 증가하거나 감소시킬때 쓰는 메소드

더하기 빼기

 

※ 적용하기 전에

적용하려는 데이터의 컬럼의 기본값이 null이면 값의 증감이 안됨

자바스크립트에서는 null + 1은 1이고, 결과의 데이터 타입도 number가 되지만

 

MySQL에서는 아님

null + 정수는 그대로 null 임

 

때문에 반드시 아래와 같이 기본값을 지정해주어야함

for 반복문에서 i 기본값 지정해주는 것 같네

exTable.init(
    {
      ...(중략)...
      exColumn: {
        type: DataTypes.INTEGER,
        defaultValue: 0,
      },
      ...(중략)...
    },
    {
      sequelize,
      modelName: "exTable",
    }
  );

 

증가

방법 1. exTable.increment("컬럼", { by: 값 })

방법 2. exTable.increment({ 컬럼 : 값 })

 

감소

방법 1. exTable.decrement("컬럼", { by: 값 })

방법 2. exTable.decrement({ 컬럼 : 값 })

 

사용 예시

// 좋아요 테이블: Likes
// 좋아요 테이블의 컬럼: likesId(PK), PostId(FK), UserId(FK)

// 게시글 좋아요 API
router.put("/posts/:postId/like", authMiddleware, async (req, res) => {
  const { postId } = req.params;
  const { userId } = res.locals.user;

  if (!userId) {
    return res.status(403).json({ errorMessage: "로그인 후 사용 가능합니다." });
  }

  console.log("현재 접속한 사용자의 ID", userId);

  const post = await Posts.findOne({
    where: { postId: postId },
    attribute: ["liked"],
  });

  if (!post) {
    return res.status(404).json({ message: "게시글을 찾을 수 없습니다." });
  }
  console.log(post);
  console.log("현재 게시글의 좋아요 수", post.dataValues.liked);

  try {
    // 좋아요, 좋아요 취소 로직
    const didILike = await Likes.findOne({
      where: { [Op.and]: [{ PostId: postId }, { UserId: userId }] },
    });
    // console.log("좋아요했던가?", didILike);

    if (!didILike) {
      // 없다면 좋아요 등록
      await Likes.create({ PostId: postId, UserId: userId });

      // 1번 방법
      // await Posts.increment("liked", { where: { postId: postId } }, { by: 1 });

      // 2번 방법
      // await Posts.increment(
      //   {
      //     liked: 1,
      //   },
      //   { where: { postId: postId } }
      // );

      return res.status(200).json({ LIKE: "해당 게시글에 좋아요 했습니다." });
    } else if (didILike) {
      // 있다면 좋아요 취소
      await Likes.destroy({
        where: { [Op.and]: [{ PostId: postId }, { UserId: userId }] },
      });

      // 1번 방법
      await Posts.decrement("liked", { where: { postId: postId } }, { by: 1 });

      // 2번 방법
      // await Posts.decrement(
      //   {
      //     liked: 1,
      //   },
      //   { where: { postId: postId } }
      // );

      return res
        .status(200)
        .json({ CANCEL: "해당 게시글의 좋아요를 취소했습니다." });
    }
    // 기능 작동은 하는데 이런 식으로 하면 likeId가 끝도없이 계속 늘어난다..
    // 당장은 괜찮겠지만 12351235125 이 정도로 늘어나면 문제 생길텐데
  } catch (error) {
    return res
      .status(400)
      .json({ errorMessage: "좋아요 작업에 실패했습니다." });
  }
});

 

 

[참조]

https://velog.io/@cadenzah/sequelize-document-3

 

Sequelize 공식 Document - (3) Instances

해석과 설명을 곁들인 Sequelize 도큐먼트 정복, 그 3편

velog.io

 

https://includecoding.tistory.com/217

 

node.js sequelize 값 증가 update 하는 방법 ( sequelize 더하기 )

아.. 정말 이것때문에 애 먹었던 것 같다. 현재 만드는 포트폴리오 중 동영상 스트리밍 홈페이지 '나튜브'를 만들고 있는데 영상을 클릭할 때마다 조회수를 증가시킬 수 있도록 하려고 하는데 upd

includecoding.tistory.com

 

'공부 > TIL' 카테고리의 다른 글

230801 TIL - TypeScript 강의 요약 및 추가 학습 자료  (0) 2023.08.02
230725 TIL - 데이터 타입 enum, babel  (0) 2023.07.26
230706 TIL  (0) 2023.07.06
230704 TIL  (0) 2023.07.04
230629 TIL  (0) 2023.06.29