From ff2bdbef47e1ca9de0a9dbdf9d3284b20d5cf147 Mon Sep 17 00:00:00 2001 From: rinarina0429 Date: Thu, 20 Mar 2025 14:32:50 +0900 Subject: [PATCH 1/6] =?UTF-8?q?[FIX]=20User=20=EC=84=9C=EB=B9=84=EC=8A=A4?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=EC=97=90=20=EB=84=98=EA=B8=B0=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/websoso/WSSServer/controller/NovelController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/websoso/WSSServer/controller/NovelController.java b/src/main/java/org/websoso/WSSServer/controller/NovelController.java index 7e078ac41..59c907b7c 100644 --- a/src/main/java/org/websoso/WSSServer/controller/NovelController.java +++ b/src/main/java/org/websoso/WSSServer/controller/NovelController.java @@ -114,10 +114,10 @@ public ResponseEntity unregisterAsInterest(Principal principal, @GetMapping("/popular") public ResponseEntity getTodayPopularNovels(Principal principal) { - //TODO 차단 관계에 있는 유저의 피드글 처리 + User user = userService.getUserOrException(Long.valueOf(principal.getName())); return ResponseEntity .status(OK) - .body(novelService.getTodayPopularNovels()); + .body(novelService.getTodayPopularNovels(user)); } @GetMapping("/taste") From eb1fb0ee278f21b2d4d010a8599975b3a00f139e Mon Sep 17 00:00:00 2001 From: rinarina0429 Date: Fri, 21 Mar 2025 09:58:49 +0900 Subject: [PATCH 2/6] =?UTF-8?q?[Feat]=20=EC=B0=A8=EB=8B=A8=20=EC=9C=A0?= =?UTF-8?q?=EC=A0=80=EC=9D=98=20=ED=94=BC=EB=93=9C=20=EB=B3=B4=EC=A7=80=20?= =?UTF-8?q?=EC=95=8A=EB=8F=84=EB=A1=9D=20=ED=95=98=EB=8A=94=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../WSSServer/repository/FeedCustomRepository.java | 2 +- .../repository/FeedCustomRepositoryImpl.java | 12 ++++++++++-- .../org/websoso/WSSServer/service/NovelService.java | 9 +++++---- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/websoso/WSSServer/repository/FeedCustomRepository.java b/src/main/java/org/websoso/WSSServer/repository/FeedCustomRepository.java index 8e5100012..7f28387ce 100644 --- a/src/main/java/org/websoso/WSSServer/repository/FeedCustomRepository.java +++ b/src/main/java/org/websoso/WSSServer/repository/FeedCustomRepository.java @@ -6,7 +6,7 @@ public interface FeedCustomRepository { - List findPopularFeedsByNovelIds(List novelIds); + List findPopularFeedsByNovelIds(User user, List novelIds); List findFeedsByNoOffsetPagination(User owner, Long lastFeedId, int size); } diff --git a/src/main/java/org/websoso/WSSServer/repository/FeedCustomRepositoryImpl.java b/src/main/java/org/websoso/WSSServer/repository/FeedCustomRepositoryImpl.java index 03752bd5f..a260231cf 100644 --- a/src/main/java/org/websoso/WSSServer/repository/FeedCustomRepositoryImpl.java +++ b/src/main/java/org/websoso/WSSServer/repository/FeedCustomRepositoryImpl.java @@ -1,6 +1,7 @@ package org.websoso.WSSServer.repository; +import static org.websoso.WSSServer.domain.QBlock.block; import static org.websoso.WSSServer.domain.QFeed.feed; import static org.websoso.WSSServer.domain.QLike.like; @@ -21,12 +22,19 @@ public class FeedCustomRepositoryImpl implements FeedCustomRepository { private final JPAQueryFactory jpaQueryFactory; @Override - public List findPopularFeedsByNovelIds(List novelIds) { + public List findPopularFeedsByNovelIds(User user, List novelIds) { + List blockedUserIds = jpaQueryFactory + .select(block.blockedId) + .from(block) + .where(block.blockingId.eq(user.getUserId())) + .fetch(); + return novelIds.stream() .map(novelId -> jpaQueryFactory .selectFrom(feed) .leftJoin(feed.likes, like) - .where(feed.novelId.eq(novelId)) + .where(feed.novelId.eq(novelId) + .and(feed.user.userId.notIn(blockedUserIds))) .groupBy(feed.feedId) .orderBy(like.count().desc()) .fetchFirst()) diff --git a/src/main/java/org/websoso/WSSServer/service/NovelService.java b/src/main/java/org/websoso/WSSServer/service/NovelService.java index 3d4e1de75..2fa7982fc 100644 --- a/src/main/java/org/websoso/WSSServer/service/NovelService.java +++ b/src/main/java/org/websoso/WSSServer/service/NovelService.java @@ -352,11 +352,12 @@ private NovelGetResponsePreview convertToDTO(Novel novel) { } @Transactional(readOnly = true) - public PopularNovelsGetResponse getTodayPopularNovels() { + public PopularNovelsGetResponse getTodayPopularNovels(User user) { List novelIdsFromPopularNovel = getNovelIdsFromPopularNovel(); List selectedNovelIdsFromPopularNovel = getSelectedNovelIdsFromPopularNovel(novelIdsFromPopularNovel); List popularNovels = getSelectedPopularNovels(selectedNovelIdsFromPopularNovel); - List popularFeedsFromPopularNovels = getPopularFeedsFromPopularNovels(selectedNovelIdsFromPopularNovel); + List popularFeedsFromPopularNovels = getPopularFeedsFromPopularNovels(user, + selectedNovelIdsFromPopularNovel); Map feedMap = createFeedMap(popularFeedsFromPopularNovels); Map avatarMap = createAvatarMap(feedMap); @@ -382,8 +383,8 @@ private List getSelectedPopularNovels(List selectedPopularNovelIds) return novelRepository.findAllById(selectedPopularNovelIds); } - private List getPopularFeedsFromPopularNovels(List selectedPopularNovelIds) { - return feedRepository.findPopularFeedsByNovelIds(selectedPopularNovelIds); + private List getPopularFeedsFromPopularNovels(User user, List selectedPopularNovelIds) { + return feedRepository.findPopularFeedsByNovelIds(user, selectedPopularNovelIds); } private static Map createFeedMap(List popularFeedsFromPopularNovels) { From 8ccd336703f0c34b7e692bb0d3d6c04998e89012 Mon Sep 17 00:00:00 2001 From: rinarina0429 Date: Fri, 21 Mar 2025 10:14:07 +0900 Subject: [PATCH 3/6] =?UTF-8?q?[FIX]=20=EB=B9=84=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=9D=B8=20=EC=9C=A0=EC=A0=80=EB=93=A4=EB=8F=84=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=EA=B0=80=EB=8A=A5=ED=95=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../WSSServer/controller/NovelController.java | 4 +++- .../repository/FeedCustomRepositoryImpl.java | 13 ++++++++----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/websoso/WSSServer/controller/NovelController.java b/src/main/java/org/websoso/WSSServer/controller/NovelController.java index 59c907b7c..ce44c506f 100644 --- a/src/main/java/org/websoso/WSSServer/controller/NovelController.java +++ b/src/main/java/org/websoso/WSSServer/controller/NovelController.java @@ -114,7 +114,9 @@ public ResponseEntity unregisterAsInterest(Principal principal, @GetMapping("/popular") public ResponseEntity getTodayPopularNovels(Principal principal) { - User user = userService.getUserOrException(Long.valueOf(principal.getName())); + User user = principal == null + ? null + : userService.getUserOrException(Long.valueOf(principal.getName())); return ResponseEntity .status(OK) .body(novelService.getTodayPopularNovels(user)); diff --git a/src/main/java/org/websoso/WSSServer/repository/FeedCustomRepositoryImpl.java b/src/main/java/org/websoso/WSSServer/repository/FeedCustomRepositoryImpl.java index a260231cf..582411604 100644 --- a/src/main/java/org/websoso/WSSServer/repository/FeedCustomRepositoryImpl.java +++ b/src/main/java/org/websoso/WSSServer/repository/FeedCustomRepositoryImpl.java @@ -7,6 +7,7 @@ import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.jpa.impl.JPAQueryFactory; +import java.util.Collections; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; @@ -23,11 +24,13 @@ public class FeedCustomRepositoryImpl implements FeedCustomRepository { @Override public List findPopularFeedsByNovelIds(User user, List novelIds) { - List blockedUserIds = jpaQueryFactory - .select(block.blockedId) - .from(block) - .where(block.blockingId.eq(user.getUserId())) - .fetch(); + List blockedUserIds = (user != null) ? + jpaQueryFactory + .select(block.blockedId) + .from(block) + .where(block.blockingId.eq(user.getUserId())) + .fetch() + : Collections.emptyList(); return novelIds.stream() .map(novelId -> jpaQueryFactory From 3b7140a0e420cf71b479fb4165eba3cf96431c0d Mon Sep 17 00:00:00 2001 From: rinarina0429 Date: Fri, 21 Mar 2025 10:50:43 +0900 Subject: [PATCH 4/6] =?UTF-8?q?[REFACTOR]=20findPopularFeedsByNovelIds()?= =?UTF-8?q?=20=EC=BF=BC=EB=A6=AC=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/FeedCustomRepositoryImpl.java | 39 +++++++++++++------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/src/main/java/org/websoso/WSSServer/repository/FeedCustomRepositoryImpl.java b/src/main/java/org/websoso/WSSServer/repository/FeedCustomRepositoryImpl.java index 582411604..3ecd96933 100644 --- a/src/main/java/org/websoso/WSSServer/repository/FeedCustomRepositoryImpl.java +++ b/src/main/java/org/websoso/WSSServer/repository/FeedCustomRepositoryImpl.java @@ -1,15 +1,18 @@ package org.websoso.WSSServer.repository; - import static org.websoso.WSSServer.domain.QBlock.block; import static org.websoso.WSSServer.domain.QFeed.feed; import static org.websoso.WSSServer.domain.QLike.like; +import com.querydsl.core.Tuple; import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.jpa.impl.JPAQueryFactory; +import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Map; import java.util.Objects; +import java.util.function.Function; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; @@ -24,6 +27,10 @@ public class FeedCustomRepositoryImpl implements FeedCustomRepository { @Override public List findPopularFeedsByNovelIds(User user, List novelIds) { + if (novelIds.isEmpty()) { + return Collections.emptyList(); + } + List blockedUserIds = (user != null) ? jpaQueryFactory .select(block.blockedId) @@ -32,17 +39,25 @@ public List findPopularFeedsByNovelIds(User user, List novelIds) { .fetch() : Collections.emptyList(); - return novelIds.stream() - .map(novelId -> jpaQueryFactory - .selectFrom(feed) - .leftJoin(feed.likes, like) - .where(feed.novelId.eq(novelId) - .and(feed.user.userId.notIn(blockedUserIds))) - .groupBy(feed.feedId) - .orderBy(like.count().desc()) - .fetchFirst()) - .filter(Objects::nonNull) - .collect(Collectors.toList()); + List results = jpaQueryFactory + .select(feed, like.count()) + .from(feed) + .leftJoin(feed.likes, like) + .where(feed.novelId.in(novelIds) + .and(feed.user.userId.notIn(blockedUserIds))) + .groupBy(feed.feedId) + .orderBy(like.count().desc()) + .fetch(); + + Map topFeedsByNovel = results.stream() + .map(tuple -> tuple.get(feed)) + .collect(Collectors.toMap( + Feed::getNovelId, + Function.identity(), + (existing, replacement) -> existing + )); + + return new ArrayList<>(topFeedsByNovel.values()); } @Override From b9d902dec7a63706ed006bff10e31ae383da1f35 Mon Sep 17 00:00:00 2001 From: rinarina0429 Date: Fri, 21 Mar 2025 11:02:29 +0900 Subject: [PATCH 5/6] =?UTF-8?q?[REFACTOR]=20=EC=A4=91=EB=B3=B5=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/FeedCustomRepository.java | 3 +- .../repository/FeedCustomRepositoryImpl.java | 43 +++++-------------- .../WSSServer/service/NovelService.java | 12 +----- 3 files changed, 15 insertions(+), 43 deletions(-) diff --git a/src/main/java/org/websoso/WSSServer/repository/FeedCustomRepository.java b/src/main/java/org/websoso/WSSServer/repository/FeedCustomRepository.java index 7f28387ce..6202a91d6 100644 --- a/src/main/java/org/websoso/WSSServer/repository/FeedCustomRepository.java +++ b/src/main/java/org/websoso/WSSServer/repository/FeedCustomRepository.java @@ -1,12 +1,13 @@ package org.websoso.WSSServer.repository; import java.util.List; +import java.util.Map; import org.websoso.WSSServer.domain.Feed; import org.websoso.WSSServer.domain.User; public interface FeedCustomRepository { - List findPopularFeedsByNovelIds(User user, List novelIds); + Map findPopularFeedsByNovelIds(User user, List novelIds); List findFeedsByNoOffsetPagination(User owner, Long lastFeedId, int size); } diff --git a/src/main/java/org/websoso/WSSServer/repository/FeedCustomRepositoryImpl.java b/src/main/java/org/websoso/WSSServer/repository/FeedCustomRepositoryImpl.java index 3ecd96933..e860eac43 100644 --- a/src/main/java/org/websoso/WSSServer/repository/FeedCustomRepositoryImpl.java +++ b/src/main/java/org/websoso/WSSServer/repository/FeedCustomRepositoryImpl.java @@ -7,11 +7,9 @@ import com.querydsl.core.Tuple; import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.jpa.impl.JPAQueryFactory; -import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.function.Function; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; @@ -26,51 +24,32 @@ public class FeedCustomRepositoryImpl implements FeedCustomRepository { private final JPAQueryFactory jpaQueryFactory; @Override - public List findPopularFeedsByNovelIds(User user, List novelIds) { + public Map findPopularFeedsByNovelIds(User user, List novelIds) { if (novelIds.isEmpty()) { - return Collections.emptyList(); + return Collections.emptyMap(); } - List blockedUserIds = (user != null) ? - jpaQueryFactory - .select(block.blockedId) - .from(block) - .where(block.blockingId.eq(user.getUserId())) - .fetch() - : Collections.emptyList(); + List blockedUserIds = (user != null) ? jpaQueryFactory.select(block.blockedId).from(block) + .where(block.blockingId.eq(user.getUserId())).fetch() : Collections.emptyList(); - List results = jpaQueryFactory - .select(feed, like.count()) - .from(feed) - .leftJoin(feed.likes, like) - .where(feed.novelId.in(novelIds) - .and(feed.user.userId.notIn(blockedUserIds))) - .groupBy(feed.feedId) - .orderBy(like.count().desc()) - .fetch(); + List results = jpaQueryFactory.select(feed, like.count()).from(feed).leftJoin(feed.likes, like) + .where(feed.novelId.in(novelIds).and(feed.user.userId.notIn(blockedUserIds))).groupBy(feed.feedId) + .orderBy(like.count().desc()).fetch(); - Map topFeedsByNovel = results.stream() + return results + .stream() .map(tuple -> tuple.get(feed)) .collect(Collectors.toMap( Feed::getNovelId, Function.identity(), (existing, replacement) -> existing )); - - return new ArrayList<>(topFeedsByNovel.values()); } @Override public List findFeedsByNoOffsetPagination(User owner, Long lastFeedId, int size) { - return jpaQueryFactory - .selectFrom(feed) - .where( - feed.user.eq(owner), - ltFeedId(lastFeedId) - ) - .orderBy(feed.feedId.desc()) - .limit(size) - .fetch(); + return jpaQueryFactory.selectFrom(feed).where(feed.user.eq(owner), ltFeedId(lastFeedId)) + .orderBy(feed.feedId.desc()).limit(size).fetch(); } private BooleanExpression ltFeedId(Long lastFeedId) { diff --git a/src/main/java/org/websoso/WSSServer/service/NovelService.java b/src/main/java/org/websoso/WSSServer/service/NovelService.java index 2fa7982fc..0e53ddca9 100644 --- a/src/main/java/org/websoso/WSSServer/service/NovelService.java +++ b/src/main/java/org/websoso/WSSServer/service/NovelService.java @@ -356,10 +356,7 @@ public PopularNovelsGetResponse getTodayPopularNovels(User user) { List novelIdsFromPopularNovel = getNovelIdsFromPopularNovel(); List selectedNovelIdsFromPopularNovel = getSelectedNovelIdsFromPopularNovel(novelIdsFromPopularNovel); List popularNovels = getSelectedPopularNovels(selectedNovelIdsFromPopularNovel); - List popularFeedsFromPopularNovels = getPopularFeedsFromPopularNovels(user, - selectedNovelIdsFromPopularNovel); - - Map feedMap = createFeedMap(popularFeedsFromPopularNovels); + Map feedMap = getPopularFeedsFromPopularNovels(user, selectedNovelIdsFromPopularNovel); Map avatarMap = createAvatarMap(feedMap); return createPopularNovelsGetResponse(popularNovels, feedMap, avatarMap); @@ -383,15 +380,10 @@ private List getSelectedPopularNovels(List selectedPopularNovelIds) return novelRepository.findAllById(selectedPopularNovelIds); } - private List getPopularFeedsFromPopularNovels(User user, List selectedPopularNovelIds) { + private Map getPopularFeedsFromPopularNovels(User user, List selectedPopularNovelIds) { return feedRepository.findPopularFeedsByNovelIds(user, selectedPopularNovelIds); } - private static Map createFeedMap(List popularFeedsFromPopularNovels) { - return popularFeedsFromPopularNovels.stream() - .collect(Collectors.toMap(Feed::getNovelId, feed -> feed)); - } - private Map createAvatarMap(Map feedMap) { Set avatarIds = feedMap.values() .stream() From a75f7700cadfd132ffdf0befb76fc03a8aa8e36a Mon Sep 17 00:00:00 2001 From: rinarina0429 Date: Fri, 21 Mar 2025 11:17:06 +0900 Subject: [PATCH 6/6] =?UTF-8?q?[STYLE]=20=EC=BD=94=EB=93=9C=20=EC=8A=A4?= =?UTF-8?q?=ED=83=80=EC=9D=BC=20=EB=B3=B5=EA=B5=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/FeedCustomRepositoryImpl.java | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/websoso/WSSServer/repository/FeedCustomRepositoryImpl.java b/src/main/java/org/websoso/WSSServer/repository/FeedCustomRepositoryImpl.java index e860eac43..088741554 100644 --- a/src/main/java/org/websoso/WSSServer/repository/FeedCustomRepositoryImpl.java +++ b/src/main/java/org/websoso/WSSServer/repository/FeedCustomRepositoryImpl.java @@ -32,9 +32,14 @@ public Map findPopularFeedsByNovelIds(User user, List novelIds List blockedUserIds = (user != null) ? jpaQueryFactory.select(block.blockedId).from(block) .where(block.blockingId.eq(user.getUserId())).fetch() : Collections.emptyList(); - List results = jpaQueryFactory.select(feed, like.count()).from(feed).leftJoin(feed.likes, like) - .where(feed.novelId.in(novelIds).and(feed.user.userId.notIn(blockedUserIds))).groupBy(feed.feedId) - .orderBy(like.count().desc()).fetch(); + List results = jpaQueryFactory + .select(feed, like.count()) + .from(feed) + .leftJoin(feed.likes, like) + .where(feed.novelId.in(novelIds).and(feed.user.userId.notIn(blockedUserIds))) + .groupBy(feed.feedId) + .orderBy(like.count().desc()) + .fetch(); return results .stream() @@ -48,8 +53,15 @@ public Map findPopularFeedsByNovelIds(User user, List novelIds @Override public List findFeedsByNoOffsetPagination(User owner, Long lastFeedId, int size) { - return jpaQueryFactory.selectFrom(feed).where(feed.user.eq(owner), ltFeedId(lastFeedId)) - .orderBy(feed.feedId.desc()).limit(size).fetch(); + return jpaQueryFactory + .selectFrom(feed) + .where( + feed.user.eq(owner), + ltFeedId(lastFeedId) + ) + .orderBy(feed.feedId.desc()) + .limit(size) + .fetch(); } private BooleanExpression ltFeedId(Long lastFeedId) {