본문 바로가기
Web Development/웹

좋아요 기능(SpringBoot) MySQL > Redis로 컨버터했음

by doriver 2024. 6. 26.

결론부터 말하면...

웹 프로젝트( SpringBoot ) 기본 구조는 MVC패턴 이였음

BO( @Service ), DAO( @Repository ) 이런 형식임

 

구현되 있는 좋아요 기능을 분석해보니

결정적으로 LikeDAO.java 만 변경해주면 되는 거였음

애초에 LikeDAO.java에 좋아요 관련 db작업들이 다 들어있었음

 

Controller랑 Frontend부분은 손댈 필요가 없게 잘 구성되 있었음

기존 MySQL 테이블들을 봐보니, 좋아요 기능에 해당하는 like테이블은 다른 테이블들에 영향을 주지 않고 있었음

 

 

LikeDAO.java에 Redis에 맞게 구현

이때 Redis에서 자료구조Set을 이용하는게 point임
( Redis에서 자료구조Set을 지원함, key-set형태로 저장 )

 

Redis의 명령어 scard, sismember, sadd, srem, del 를 이용해서 구현함

좋아요를 위한 DB는 5번( index 5 ) db를 사용함 

 

LikeDAO.java 를 사용하는 다른 코드들( LikeBO.java 밖에 없었음 )을 LikeDAO 수정한거에 맞게 조금씩 수정해줌

SpringBoot에서 Redis사용해야 하니, 그에 필요한 설정들 추가해주고

 

좀 디테일 하게, 좋아요 기능은

게시글마다 (내가 좋아요 했는지 여부),  (좋아요 개수) 있음  

한사람당 좋아요 1개 or 0개

좋아요 버튼 누르면 바로 화면에 반영됨

좋아요 해당 기존 테이블

좋아요 > insert   ,   좋아요 취소 > delete

이렇게 처리

 

Redis에서는 key-set형태로 저장함

key를 type:postId 형태로 만들고  ex) invest:18

set에는 해당 게시물을 '좋아요' 한 userId값들을 넣었다

 

아래는 테스트후 Redis에 생긴 데이터들 

 

아래는 상황에 맞는 명령어들

  MySQL Redis
해당 글의 좋아요 개수 select scard
해당글에 내가 좋아요 했는지 select sismember
해당글에 사용자가 좋아요 insert sadd
해당글에 사용자 좋아요 취소 delete srem
해당글 삭제할때 좋아요된것들 삭제 delete del

 

까다로울수 있었던 부분

맨 처음 글이 작성됐을땐 좋아요가 0개 이다

 

'좋아요' 를 sadd명령어로 처리했는데, 맨처음 글 작성했을땐 해당key값과 value값 아예 없다

 

맨 처음 글을 작성한뒤,  게시글을 불러올때

(내가 좋아요 했는지 여부)와 (좋아요 개수) 를 Redis에서 가져오게 되는데

(내가 좋아요 했는지 여부)는 명령어sismember  ,    (좋아요 개수)는 명령어scard 처리하고 있었다

 

다행이 구현전에 먼저 Redis에서 테스트 해보니

, 해당 데이터가 아예 없을때 sismember는 false를 scard는 0을 반환해서

내가 생각했던 대로 깔끔하게 맞아 떨어졌다

( Redis 자체에서 오류를 띄워버리면 먼가 골치아파질수도 있던 상황 )

 

 

 

'Web Development > ' 카테고리의 다른 글

응답코드 01  (0) 2024.07.17
로드밸런싱 할때, 로그인처리 문제  (1) 2024.06.27
요청, 요청처리, 응답  (0) 2024.06.05
웹 API( SpringBoot + Tomcat )  (0) 2024.05.19
통신과 API, 그리고 웹개발  (1) 2024.04.05