[프로젝트] 33. 뉴스피드 조회 기능 리팩토링
프로젝트의 뉴스피드 조회 기능을 리팩토링하는 것은 성능 최적화 및 코드의 가독성을 향상시키는 중요한 과정입니다. 사용자가 팔로우하는 다른 사용자들의 최신 활동(알림)과 게시물을 효율적으로 조회하기 위해 NotificationRepository와 PostRepository에 새로운 메소드를 추가하고, FollowService에서 이를 활용하는 방식으로 리팩토링을 진행했습니다.
NotificationRepository 수정
NotificationRepository에 findByFromUserIdIn 메소드를 추가하여, 특정 사용자 ID 목록에 해당하는 발신자(fromUser)를 가진 모든 알림을 조회할 수 있습니다. 이를 통해 특정 사용자가 팔로우하는 사용자들이 생성한 알림을 효율적으로 가져올 수 있습니다.
public interface NotificationRepository extends JpaRepository<Notification, Long> {
List<Notification> findByFromUserIdIn(List<Long> userIds);
}
PostRepository 수정
PostRepository에 findByUserIdIn 메소드를 추가하여, 특정 사용자 ID 목록에 해당하는 사용자들이 생성한 모든 게시물을 조회할 수 있습니다. 이 방식을 사용함으로써, 사용자가 팔로우하는 사용자들의 게시물을 한 번의 쿼리로 효과적으로 가져올 수 있습니다.
public interface PostRepository extends JpaRepository<Post, Long> {
List<Post> findByUserIdIn(List<Long> userIds);
}
FollowService 리팩토링
FollowService에서는 사용자가 팔로우하는 사용자들의 ID 목록을 구한 후, 이를 기반으로 해당 사용자들의 알림과 게시물을 조회합니다. 이렇게 조회한 알림과 게시물 정보를 NewsFeedDto로 포장하여 반환합니다. 이 과정에서 findByFromUserIdIn과 findByUserIdIn 메소드를 활용하여 데이터베이스에서 필요한 데이터를 효율적으로 조회합니다.
@Transactional(readOnly = true)
public List<NewsFeedDto> getFeeds(Long userId) {
userRepository.findById(userId).orElseThrow(
() -> new BadRequestException("유저 정보를 찾을 수 없습니다.")
);
// 현재 사용자가 팔로우하는 사용자들의 ID 목록
List<Long> followingIds = followRepository.findByFollowerId(userId).stream()
.map(follow -> follow.getFollowing().getId())
.collect(Collectors.toList());
// 현재 사용자가 팔로우하는 사용자들의 활동 (알림) 가져오기
List<Notification> notifications = notificationRepository.findByFromUserIdIn(followingIds);
// 현재 사용자가 팔로우하는 사용자들의 게시물 가져오기
List<Post> posts = postRepository.findByUserIdIn(followingIds);
return List.of(NewsFeedDto.getNewsfeedDto(notifications, posts));
}
결론
이러한 리팩토링을 통해, 뉴스피드 조회 기능의 성능을 최적화하고, 코드의 가독성 및 유지보수성을 향상시킬 수 있습니다. 사용자가 팔로우하는 다른 사용자들의 최신 활동과 게시물을 효과적으로 조회할 수 있게 되어, 사용자 경험도 개선됩니다.