본문 바로가기
컴공/스프링 부트 (Spring boot)

스프링 부트(Spring Boot) 투표 좋아요 기능 구현

by 만슨 2023. 12. 5.

투표 앱을 만들면서 투표에 좋아요 기능을 만들어 투표를 정렬해서 ui로 보여줄 때 좋아요가 많은 순으로 보여주면 좋겠다는 생각이 들어 좋아요 기능을 만들기로 하였다.

 

구현 계획은 한 유저가 좋아요 버튼을 한 번 누르면 투표 좋아요 count가 +1 이 돼고 한 번 더 누르면 - 1 이 되게끔 구현 하도록 하겠다.

 

 Poll 엔티티 .

likedUsers
 해당 투표에 좋아요를 누른 사용자들의 집합이다.
어떤 사용자가 투표에 좋아요를 눌렀는지 구분하여 중복투표를 막기 위해 user엔티티의 likedPolls 필드와 ManyToMany 어노테이션으로 관계 설정을 하였다.
likesCount
투표가 받은 좋아요 수를 나타내는 변수로 초기값을 0으로 설정하였다.

 

 

User 엔티티

likedPolls
사용자가 좋아요를 누른 투표들의 집합으로 . 좋아요를 관리하기 위해 user_likes 테이블에 user_id와 poll_id로 묶어서 만들었다.

 

 

여기서 likePolls를 Set<Poll>로 구현한 이유는 'Set'은 중복된 원소를 허용하지 않는 자료구조이기 때문에, 사용자가 동일한 투표에 여러 번 좋아요를 누르는 것을 방지하기 위한 목적으로 사용하였다. 

 

likePoll 매서드 (Service)

 

likePoll 메서드 흐름

 

1. 클라이언트에서 전달한 likeDto를 통해 어떤 투표에 좋아요를 누를지에 대한 정보를 얻음.

 

2. 해당 투표를 pollRepository를 사용하여 데이터베이스에서 가져온다.

 

3. 투표의 likedUsers 집합을 얻어온다. 현재 인증된 사용자의 닉네임과 likeDto에 담긴 닉네임을 비교하여 같지 않으면 인증된 사용자가 아닌 것으로 판단하고 예외처리.

 

4. 사용자 정보를 userRepository를 사용하여 가져온다. 만약 likedUsers에 해당 사용자가 이미 존재한다면, 좋아요를 취소하고 likedUsers에서 해당 사용자를 제거, 사용자의 likedPolls에서 해당 투표를 제거, 투표의 좋아요 수를 1 감소시킨다. 

 

5. 그렇지 않다면, 좋아요를 누르는 동작을 수행.

 

6. likedUsers에 해당 사용자를 추가. 사용자의 likedPolls에 해당 투표를 추가. 투표의 좋아요 수를 1 증가.

 

7. 최종적으로 투표와 사용자의 정보를 데이터베이스에 저장합니다.

 

 

컨트롤러 

 

프론트에서 LikeDto를 받아 likePoll 매서드로 넘겨주고 ok응답을 프론트로 처리해 준다!