구현하고자 하는 좋아요의 기능은 다음과 같습니다.
- 좋아요라는 기능은 회원만 사용할 수 있다.
- 한 명의 회원은 여러 개의 게시글에 각각 좋아요를 누를 수 있다.
- 하나의 게시글은 여러 명의 회원으로부터 좋아요를 받을 수 있다.
피드백을 거쳐 2 개의 테이블로만 DB 를 구성했기 때문에, 다대다가 아닌 개별적으로 회원 테이블과 게시글 테이블에 각각 좋아요 정보를 입력해주어야 합니다.
회원 테이블에서는 liked 가, 게시글 테이블에서는 like_user_id 가 각각 좋아요 정보를 담는 컬럼입니다. 배열에 정보를 담아 stringify
를 활용해 저장하도록 구현했습니다.
이를 위해 서버는 클라이언트로부터 회원의 정보(user.id) 와 게시글의 정보(article.id) 를 전달받습니다. 그런 다음 liked, like_user_id 안에 전달받은 정보(각각의 id)가 있는지를 확인하고 정보가 있다면 삭제, 없다면 추가합니다.
좋아요 기능이 구현되었으니 좋아요 순으로 정렬도 가능합니다.
처음에는 좋아요의 정보가 배열로 들어가 있으니 배열을 꺼내와서 그 길이를 산출하면 되겠다는 식으로 접근했습니다만, 생각해보니 어차피 좋아요가 많은 순이라면 굳이 배열을 꺼내올 필요가 없겠더라구요. 대신에 좋아요 정보가 저장된 컬럼의 길이를 비교해 길이가 가장 긴 것부터 가져오도록 구현했습니다.
좋아요의 총합을 띄우는 것도 간단하게 구현할 수 있었습니다. 서버에서 배열의 길이를 확인해 숫자로 보내줄 수도 있겠지만, 그냥 배열 자체를 보내서 클라이언트에서 길이를 확인하는 방식이 좀 더 쉽게 구현이 가능하겠더라구요. 게시물 관련 기능을 구현 중인 클라이언트 담당 팀원과 이야기한 끝에 이 방식으로 진행하게 되었습니다.
like_user_id 컬럼의 길이가 긴 순으로 배열을 정렬하는데 사용한 sequelize 쿼리문은 다음과 같습니다. (필요한 부분만 발췌했습니다.)
await article.findAll({
attributes: ['id', 'title', 'thumbnail_type', 'thumbnail_color', 'ingredient', 'like_user_id'],
order: [[sequelize.fn('length', sequelize.col('like_user_id')), 'DESC']],
});
코드를 작성하는데 참고했던 stackoverflow 글과 공식 자료(참고자료 1, 참고자료2, 참고자료3)를 링크로 남깁니다.
생각보다 bare-minimum 의 구현이 빨리 끝났습니다. 배포도 일정 부분 진행해둔 만큼 이제 추가할 만한 기능이 있을지를 고민해보고 공부해야 할 것 같습니다.
검색 기능에 많이 사용되는 것이 Elastic Search 라는 힌트를 엔지니어분께 얻었었는데요. 과연 남은 시간 안에 도전할 수 있을지, 내일과 이번 주말을 보내볼까 싶기도 하네요.