#HasTag 기능으로 각 게시글을 필터링 한 이후 게시글들을 가져오는 과정에서 heartStatus column 이 추가되면서 (heartStatus 관련 이전 작성글 참고) 코드를 변경해야 했다.
2024.05.31 - [분류 전체보기] - 2024-05-31 [Programmers newsfeed Project (Update HeartStatus)]
2024-05-31 [Programmers newsfeed Project (Update HeartStatus)]
Problem금일 팀 프로젝트 진행 중 맞이한 문제는 Post 의 Like 상태를 User 에 맞춰 다르게 반환해주는 것이었습니다.예시를 들어 문제를 설명해 보면A 라는 유저가 있고 애플리케이션 내 로그인을 하
hongjinkwon.tistory.com
정리해서 설명하면 HasTag 를 기준으로 필터링하여 게시물을 조회하는 것에서 현재 애플리케이션을 사용중인 유저에 맞춰 heartStatus Boolean 값도 반환하는 로직이 추가로 구성되어야 했다.
아래는 이전 로직이 바뀌기 전 코드입니다.
override fun getFilteredPosts(tagName: String): List<PostsResponse> {
val post = postRepository.findById(tagName).map { PostsResponse.from(it) }
return post.sortedByDescending { post -> post.createdAt }
}
코드를 설명하자면,
PostRepository 에서 tagName 에 해당하는 게시물들을 하나씩 조회합니다.
'postRepository.findById(tagName)' 는 주어진 태그 이름으로 필터링 된 게시물 리스트를 새롭게 반환하며, 반환된 게시물 리스트의 각 게시물 객체를 'PostsResponse.from(it)' 를 통해 PostsResponse 객체로 변환합니다.
변환된 PostsResponse 객체 리스트를 createdAt 필드를 기준으로 내림차순 정렬합니다.
해당 코드에서
1. heartStatus 컬럼이 추가
2. 현재 인증된 User 가 어떤 Post 에 Like 를 했는지 여부에 따라 True 또는 False 를 반환합니다.
코드를 작성하기 전, 정리한 내용은 다음과 같습니다.
1. TagName 을 기준으로 Post 를 새로운 리스트 형태로 가져옵니다. 'findByTagName' 메소드를 활용 Tag 를 기준으로 Post 를 분류하는 작업을 진행합니다.
2. 분류한 Posts 의 Id 값을 추출하여 새로운 리스트를 만듭니다.
3. 'findByPostIdsAndUserId' 메소드를 새롭게 정의하여 특정 사용자가 특정 포스트에 대해 남긴 좋아요 정보를 가져옵니다. 해당 함수는 PostId 목록과 사용자 Id 를 기준으로 좋아요 정보를 반환합니다.
4. 여기서 PostId 값만 가져오는 새로운 리스트를 반환합니다. (현재 사용자가 좋아요를 누른 PostId)
최종적으로 현재 사용자가 좋아요를 누른 Post 는 True, 아닐 경우 False 를 반환합니다.
이를 기반으로 작성한 코드는 아래와 같습니다.
override fun getFilteredPosts(authUser: AuthUser, tagName: String): List<PostsResponse> {
// TagName 기준으로 Post 들을 분류하여 새로운 리스트로 반환
val posts = postRepository.findByTagName(tagName)
// 위에서 새롭게 분류한 리스트의 PostId 만 가져오는 작업을 진행
val postIds = posts.mapNotNull { it.id }
// 현재 사용자가 좋아요를 누른 Post 들을 리스트 형태로 반환 (PostId 와 현재 사용자의 Id를 가진 리스트)
val userLikes = postLikeRepository.findByPostIdInAndUserId(postIds, authUser.id)
// 위 리스트에서 PostId 만 가져옵니다.
val likedPostIds = userLikes.map { it.post.id }
// likePostIds 에 postId 가 포함될 경우 True 값으로 설정
posts.forEach { post ->
post.heartStatus = likedPostIds.contains(post.id)
}
return posts.map { PostsResponse.from(it) }.sortedByDescending { it.createdAt }
}
너무 과정이 복잡해지는 것 같아서, 더 나은 방법이 있다면 조언 부탁드리겠습니다..