프로젝트 (Java)/예약마켓

[프로젝트] 20. 뉴스피드 기능 추가

hihyuk 2024. 1. 29. 09:13

사용자가 자신이 팔로우한 다른 사용자들의 게시물을 볼 수 있게 하는 뉴스피드 기능입니다. 이를 통해 사용자는 커뮤니티 내에서 활발한 상호작용과 정보 공유를 경험할 수 있습니다. 

 

FollowController 수정

FollowController에 사용자 뉴스피드를 조회하는 엔드포인트를 추가합니다. 이 메소드는 현재 사용자가 팔로우하는 사용자들의 게시물을 조회합니다.

    @GetMapping
    public List<PostDto> getfeeds() {
        TokenContext context = TokenContextHolder.getContext();
        Long followerId = context.getUserId();
        return followService.getFeeds(followerId);
    }

 

PostDto 수정

PostDto는 게시물의 데이터를 전달하기 위한 DTO입니다. 이 DTO는 게시물의 ID, 내용, 작성자 이름, 프로필 이미지, 좋아요 수, 댓글 수 등을 포함합니다.

    public static PostDto getPostDto(Post post) {
        return new PostDto(
                post.getId(),
                post.getContent(),
                post.getUser().getName(),
                post.getUser().getProfileImg(),
                post.getUser().getId(),
                post.getLikes().size(),
                post.getComments().size());
    }

 

FollowRepository 수정

FollowRepository에서는 사용자 ID에 따라 게시물을 조회하는 메소드를 정의합니다.

public interface FollowRepository extends JpaRepository<Follow, Long> {
    List<Follow> findByFollowerId(Long followerId);
}

 

FollowService 구현

FollowService에서는 사용자가 팔로우하는 사용자들의 게시물을 조회하는 로직을 구현합니다. 팔로우하는 사용자들의 ID 목록을 가져온 다음, 해당 사용자들의 게시물을 조회합니다.

    @Transactional(readOnly = true)
    public List<PostDto> getFeeds(Long userId) {
        userRepository.findById(userId).orElseThrow(
                () -> new BadRequestException("팔로워 사용자를 찾을 수 없습니다.")
        );
        List<Long> followingIds = followRepository.findByFollowerId(userId).stream()
                .map(follow -> follow.getFollowing().getId())
                .collect(Collectors.toList());
        List<Post> posts = new ArrayList<>();
        for (int i = 0; i < followingIds.size(); i++) {
            if(postRepository.existsByUserId(followingIds.get(i))){
                posts.add(postRepository.findByUserId(followingIds.get(i)));
            }
        }
        return posts.stream().map(PostDto::getPostDto).collect(Collectors.toList());
    }

 

결론

뉴스피드 기능을 통해 사용자는 자신이 관심 있는 커뮤니티 내의 최신 활동을 쉽게 추적할 수 있습니다. 이 기능은 사용자 경험을 향상시키고, 애플리케이션 내에서의 상호작용을 촉진하는 중요한 역할을 합니다. 구현 과정에서 연관관계 매핑을 적절히 활용하여 효율적이고 확장 가능한 데이터 관리 전략을 수립하는 것이 중요합니다.