생각정리/사이드 프로젝트

사이드 프로젝트 : 중고 거래 플랫폼 - 게시글 좋아요 레디스 활용

생각중임 2024. 2. 20. 20:34

레디스 활용

레디스를 보면서 다양한 곳에 활용하는 방법을 봤는데, 그중 Set을 이용해서 중복이 없는 데이터를 키값 별로 사용을 할 수 있어 게시글의 아이디를 키로 잡고 유저의 아이디를 값으로 해 해당 게시글을 좋아요를 누른 유저를 가지고 있는 Set 키가 만들어지고 Set이기 때문에 한 게시글에 동일한 유저는 한 번 더 저장되지 않는다.

이미 좋아요를 했을 경우, Set에 해당 값(유저의 아이디)을 삭제를 해주도록 해, 데이터 베이스에 직접적으로 계속 연결될 때보다 레디스를 이용해서 빠르고 데이터베이스에 부담을 덜어 줄 수 있다.

변경 전 코드

public ResponseEntity<MessageResponseDto> likeBoard(long id, long userId) {
        Board board = findBoard(id);
        User user = findUser(userId);

        BoardLike boardLike = boardLikeRepository.findByUserAndBoard(user, board).orElse(null);
        if (boardLike == null) {
            boardLike = new BoardLike(user, board);
            boardLikeRepository.save(boardLike);
        }

        if (boardLike.isLike_yn()) {
            board.changeLike(board.getBoard_like() - 1);
            boardLike.changeLike();
            MessageResponseDto responseEntity = new MessageResponseDto("게시글 좋아요를 취소하였습니다.",200);
            return ResponseEntity.status(HttpStatus.OK).body(responseEntity);
        }

        board.changeLike(board.getBoard_like() + 1);
        boardLike.changeLike();
        MessageResponseDto responseEntity = new MessageResponseDto("게시글 좋아요를 성공하였습니다.",200);
        return ResponseEntity.status(HttpStatus.OK).body(responseEntity);
    }

변경 후 코드

public ResponseEntity<MessageResponseDto> likeBoard(long id, long userId) {
        Board board = findBoard(id);
        User user = findUser(userId);

        Set<Object> boardLikeList = redisRepository.getSetValues("board:like:" + board.getId());

        if (boardLikeList.contains(user.getId() + "")) {
            redisRepository.deleteSetValue("board:like:" + board.getId(), user.getId() + "");
            MessageResponseDto responseEntity = new MessageResponseDto("게시글 좋아요를 취소하였습니다.",200);
            return ResponseEntity.status(HttpStatus.OK).body(responseEntity);
        }

        redisRepository.saveSet("board:like:" + board.getId(), user.getId() + "");
        MessageResponseDto responseEntity = new MessageResponseDto("게시글 좋아요를 성공하였습니다.",200);
        return ResponseEntity.status(HttpStatus.OK).body(responseEntity);
    }