생각정리/사이드 프로젝트
사이드 프로젝트 : 중고 거래 플랫폼 - 게시글 좋아요 레디스 활용
생각중임
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);
}