만들고 있는 메모장 프로젝트에 좋아요 기능이 필요했다. 먼저 작업에 들어가기 전에 이미 정의된 엔티티( 게시판 :Memo / 댓글 : Comments / 유저 : User )들과의 연관관계나 어떤 API로 받아야 할지를 고민했다.
좋아요 요청은 POST로만 사용한다. 요청이 들어왔을 때 올라가고, 다시 한 번 요청하면 내려가는 식으로 구성했다.
Likes 엔티티 하나로 만들어서 사용하면 연관관계가 너무 복잡해진다. 그래서 LikesMemo / LikesComment 로 나누어 사용했다.
연관관계는 위 항목들에 대해서 다대일로 처리했다. 다만 유저 부분은 양방향이 아닌 단방향이다. 컨트롤러에서 요청을 보낼 때 사용하는 userDetails를 사용해서 유저의 정보를 가져와(userDetails.getUser()) LikesRepository에 있는 유저의 중복 여부를 알 수 있기 때문에 유저 객체는 Likes 엔티티를 알 필요가 없다고 생각했다.
위와 같은 형태, @PathVariable 로 특정 메모의 id를 받아서 그 메모에 좋아요를 올려주는 방식이다. userDetails로 유저의 정보를 가져온다.
컨트롤러 부분의 리턴 타입으로 ResponseDto를 사용했는데, 이 Dto 안에서는 memo가 가진 Likes엔티티의 리스트의 size를 int로 반환하여 필드로 사용한다.
위와 가팅 Memo가 List를 가지고 있기 때문. CascadeType은 REMOVE로 결정했다.
Repository에서는 유저 id를 통해 특정 유저가 소유한 Likes를 조회 할 수 있는 findByUserId 매서드와
역시 마찬가지로 특정 유저가 중복해서 likes를 눌렀다면 delete할 수 있도록 하는 매서드를 만들었다.
if문에서 유저의 아이디로 repository에 등록된 좋아요가 있는지 확인한다. 그 후 비어있다면 추가하고, 이미 존재한다면 삭제한다.