TIL

24.02.14

아리단길아조씨 2024. 2. 15. 12:07
728x90

전날에 하던 좋아요 기능을 마저 테스트, 검증 로직 추가, 코드 수정 등을 통해서 좋아요 기능을 만들었다.
정확하진 않지만 Likes라는 테이블을 새롭게 만들어서 누가 어떤 게시물을 좋아요를 눌렀는지 확인할 수 있으면 좋을 것 같아서 테이블을 만들었다.

import express from 'express';
import { prisma } from './model/index.js';
import {
  createAccessToken,
  validateAccessToken,
} from './middlewares/authomiddleware.js';

const router = express();

// get: 서버에 있는 데이터를 꺼내올 때(볼 때) post: 서버에 데이터를 새로 만들거나, 서버에 뭔가를 요청하거나
router.post('/:postId', validateAccessToken, async (req, res, next) => {
  const { postId } = req.params; // 특정 게시물의 위치
  const { userId } = req.user; // 중괄호x : 객체 자체가 저장, 중괄호: userId라는 키의 밸류 값만 가져온다.

  const abc = await prisma.likes.findFirst({
    where: { postId: +postId, userId },
  });

  if (abc) {
    await prisma.likes.delete({
      where: { likeId: abc.likeId },
    });
    return res.status(201).json({ message: '응 취소~' });
  }

  const someLike = await prisma.likes.create({
    data: {
      userId,
      postId: +postId,
    },
  });
  return res.status(201).json({ someLike });
});

router.get('/:postId', async (req, res) => {
  const { postId } = req.params;

  const likeCounter = await prisma.likes.count({
    where: { postId: +postId },
  });

  return res.status(200).json({ likeCounter });
});

export default router;

 아직도 모자라서 설명을 적는게 어려우니 글로 코드를 찬찬히 읽어보면서 설명을 덧붙여본다.
특정한 게시물에 접근하기 위해 라우터 변수에 postId로 접근을 하면 좋아요를 누른 사람이 삭제할 수 있게 미들웨어로 검증을 해준다.
{postId}는 req.params에서 객체형태로 오는 정보를 postId라는 키에 담긴 값을 할당받는다는 의미이다.
아래의 {userId}도 같은 맥락인데 미들웨어에서 정의한 user에서의 userId 값을 할당 받는다.
각각 현재 좋아요를 누를 게시물과 누를 유저의 정보를 담아주었다.

한 사람이 같은 게시물을 두 번 세 번 연속으로 눌렀을 때 카운터가 올라가지 않게 하기 위해서 새로운 로직을 만들어주었다.
abc상수에는 postId와 userId를 조건으로 맞는 데이터를 하나 찾아준다. 그 이후에 likes테이블에서 delete를 통해 abc를 가지고 있는 likeId를 삭제한 후 201번 상태 코드와 장난스러운 삭제 메시지를 json 형태로 리턴해준다.

검증로직을 지나면 someLike라는 상수에 like테이블에 새로운 데이터를 만들어주기 위해 create를 사용하여 새로 만들어줄 데어터를 정의한다. 누가 어떤 게시물을 눌렀는지 알기 위해 data에 userId와 postId를 넣어주는데 req.parmas에서 가져오는 postId값은 문자형으로 받아오기 때문에 앞에 postId: +postId라는 식으로 숫자형으로 받아오겠다고 적어주었고
생성이 완료됐다면 작성이 완료됐으므로 201번 상태코드와 json형식으로 만들어진 데이터 someLike를 반환해 준다.

likeCounter 상수를 말 그대로 좋아요를 카운트하는 상수인데 특정한 게시물의 좋아요 개수를 확인하기 위해 만들어주었다. likeCounter상수에는 likes테이블에서 postId라는 조건으로 count를 이용해서 1개 늘려준다는 의미이다.

이렇게 좋아요 기능을 만들어 봤는데, 비록 내가 짠 코드가 채택되지는 않았지만 코드를 작성해 보면서 잘은 모르지만 내가 많이 봐왔던 것들로 이루어지는데 활용을 못할 뿐이라는 것을 느꼈고, 작성하면서 마주친 에러를 동기분과 함께 에러메시지를 토대로 이것저것 시도해 보면서 해결을 하고 Thunder클라이언트로 작동이 되는 것을 확인했을 때 너무 신기하고 즐거움을 느낄 수 있었다. 내가 스스로 혼자서 한건 아니지만 동기분 덕분에 뭔가 그래도 조금은 눈이 뜨인 것 같았다.




 

'TIL' 카테고리의 다른 글

24.02.16  (1) 2024.02.16
24.02.15  (0) 2024.02.16
24.02.13  (0) 2024.02.14
24.02.08  (0) 2024.02.13
24.02.07  (0) 2024.02.07