From b26fc358fb138010b6620ca927015916b5f70059 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=84=9D=EB=B2=94?= Date: Tue, 26 Aug 2025 22:42:19 +0900 Subject: [PATCH 1/3] =?UTF-8?q?Feat:=20=EB=82=B4=EA=B0=80=20=EA=B0=80?= =?UTF-8?q?=EC=9E=85=ED=95=9C=20=EA=B7=B8=EB=A3=B9=20=EC=A0=84=EC=B2=B4=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20API=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../group/controller/GroupController.java | 11 +++++++ .../repository/GroupRepositoryCustom.java | 2 ++ .../group/repository/GroupRepositoryImpl.java | 31 +++++++++++++++++++ .../flipnote/group/service/GroupService.java | 29 +++++++++++++++++ 4 files changed, 73 insertions(+) diff --git a/src/main/java/project/flipnote/group/controller/GroupController.java b/src/main/java/project/flipnote/group/controller/GroupController.java index 403b5b39..64ef4b9b 100644 --- a/src/main/java/project/flipnote/group/controller/GroupController.java +++ b/src/main/java/project/flipnote/group/controller/GroupController.java @@ -94,4 +94,15 @@ public ResponseEntity> findGroup( return ResponseEntity.ok(res); } + + //내 그룹 전체 조회 + @GetMapping("/me") + public ResponseEntity> findMyGroup( + @AuthenticationPrincipal AuthPrinciple authPrinciple, + @Valid @ModelAttribute GroupListRequest req + ) { + CursorPagingResponse res = groupService.findMyGroup(authPrinciple, req); + + return ResponseEntity.ok(res); + } } diff --git a/src/main/java/project/flipnote/group/repository/GroupRepositoryCustom.java b/src/main/java/project/flipnote/group/repository/GroupRepositoryCustom.java index d410eb3b..22decba9 100644 --- a/src/main/java/project/flipnote/group/repository/GroupRepositoryCustom.java +++ b/src/main/java/project/flipnote/group/repository/GroupRepositoryCustom.java @@ -7,4 +7,6 @@ public interface GroupRepositoryCustom { List findAllByCursor(Long lastId, Category category, int pageSize); + + List findAllByCursorAndUserId(Long lastId, Category category, int pageSize, Long userId); } diff --git a/src/main/java/project/flipnote/group/repository/GroupRepositoryImpl.java b/src/main/java/project/flipnote/group/repository/GroupRepositoryImpl.java index 0865cf17..03748d37 100644 --- a/src/main/java/project/flipnote/group/repository/GroupRepositoryImpl.java +++ b/src/main/java/project/flipnote/group/repository/GroupRepositoryImpl.java @@ -10,6 +10,7 @@ import lombok.RequiredArgsConstructor; import project.flipnote.group.entity.Category; import project.flipnote.group.entity.QGroup; +import project.flipnote.group.entity.QGroupMember; import project.flipnote.group.model.GroupInfo; @RequiredArgsConstructor @@ -18,6 +19,7 @@ public class GroupRepositoryImpl implements GroupRepositoryCustom { private final JPAQueryFactory queryFactory; QGroup group = QGroup.group; + QGroupMember groupMember = QGroupMember.groupMember; @Override public List findAllByCursor(Long lastId, Category category, int pageSize) { @@ -47,4 +49,33 @@ public List findAllByCursor(Long lastId, Category category, int pageS .fetch(); } + @Override + public List findAllByCursorAndUserId(Long lastId, Category category, int pageSize, Long userId) { + BooleanBuilder where = new BooleanBuilder() + .and(group.deletedAt.isNull()); + + if (lastId != null) { + where.and(group.id.lt(lastId)); + } + + if (category != null) { + where.and(group.category.eq(category)); + } + + return queryFactory.select(Projections.constructor( + GroupInfo.class, + group.id, + group.name, + group.description, + group.category, + group.imageUrl + )) + .from(group) + .join(groupMember.group, group) + .where(groupMember.group.id.eq(group.id).and(groupMember.user.id.eq(userId)).and(where)) + .orderBy(group.id.desc()) + .limit(pageSize+1) + .fetch(); + } + } diff --git a/src/main/java/project/flipnote/group/service/GroupService.java b/src/main/java/project/flipnote/group/service/GroupService.java index decc06be..c4d50e1c 100644 --- a/src/main/java/project/flipnote/group/service/GroupService.java +++ b/src/main/java/project/flipnote/group/service/GroupService.java @@ -6,6 +6,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import project.flipnote.common.exception.BizException; @@ -365,4 +366,32 @@ private Category convertCategory(String rawCategory) { public boolean existsMember(Long groupId, Long userId) { return groupMemberRepository.existsByGroup_IdAndUser_Id(groupId, userId); } + + /** + * 내가 가입한 그룹 전체 조회하기 + * + * @param authPrinciple 회원 accessToken + * @param req 필터링 + * @return + */ + public CursorPagingResponse findMyGroup(AuthPrinciple authPrinciple, @Valid GroupListRequest req) { + //1. 유저 가져오기 + UserProfile user = getUser(authPrinciple); + + //2. 카테고리 변환 + Category category = convertCategory(req.getCategory()); + + List groups = groupRepository.findAllByCursorAndUserId(req.getCursorId(), category, req.getSize(), + user.getId()); + + boolean hasNext = groups.size() > req.getSize(); + + if (hasNext) { + groups = groups.subList(0, req.getSize()); + } + + Long nextCursor = hasNext ? groups.get(groups.size() - 1).groupId() : null; + + return CursorPagingResponse.of(groups, hasNext, nextCursor); + } } From 1bce59f9786d96ff59ed28c4c2eb48a60f7ca142 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=84=9D=EB=B2=94?= Date: Wed, 27 Aug 2025 16:59:36 +0900 Subject: [PATCH 2/3] =?UTF-8?q?Refactor:=20=EA=B3=B5=ED=86=B5=20=EB=B6=80?= =?UTF-8?q?=EB=B6=84=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../flipnote/group/service/GroupService.java | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/main/java/project/flipnote/group/service/GroupService.java b/src/main/java/project/flipnote/group/service/GroupService.java index c4d50e1c..49cb337f 100644 --- a/src/main/java/project/flipnote/group/service/GroupService.java +++ b/src/main/java/project/flipnote/group/service/GroupService.java @@ -332,15 +332,7 @@ public CursorPagingResponse findGroup(AuthPrinciple authPrinciple, Gr List groups = groupRepository.findAllByCursor(req.getCursorId(), category, req.getSize()); - boolean hasNext = groups.size() > req.getSize(); - - if (hasNext) { - groups = groups.subList(0, req.getSize()); - } - - Long nextCursor = hasNext ? groups.get(groups.size() - 1).groupId() : null; - - return CursorPagingResponse.of(groups, hasNext, nextCursor); + return createGroupInfoCursorPagingResponse(req, groups); } private Category convertCategory(String rawCategory) { @@ -374,7 +366,7 @@ public boolean existsMember(Long groupId, Long userId) { * @param req 필터링 * @return */ - public CursorPagingResponse findMyGroup(AuthPrinciple authPrinciple, @Valid GroupListRequest req) { + public CursorPagingResponse findMyGroup(AuthPrinciple authPrinciple, GroupListRequest req) { //1. 유저 가져오기 UserProfile user = getUser(authPrinciple); @@ -384,6 +376,12 @@ public CursorPagingResponse findMyGroup(AuthPrinciple authPrinciple, List groups = groupRepository.findAllByCursorAndUserId(req.getCursorId(), category, req.getSize(), user.getId()); + return createGroupInfoCursorPagingResponse(req, groups); + } + + //리스트 조회시 response 생성 + private CursorPagingResponse createGroupInfoCursorPagingResponse(GroupListRequest req, + List groups) { boolean hasNext = groups.size() > req.getSize(); if (hasNext) { From 4bfef4637731c730c57763922f8564346cb6ec23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=84=9D=EB=B2=94?= Date: Sun, 31 Aug 2025 17:18:42 +0900 Subject: [PATCH 3/3] =?UTF-8?q?Fix:=20=EC=A1=B0=EC=9D=B8=20=EA=B8=B0?= =?UTF-8?q?=EC=A4=80=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../flipnote/group/repository/GroupRepositoryImpl.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/project/flipnote/group/repository/GroupRepositoryImpl.java b/src/main/java/project/flipnote/group/repository/GroupRepositoryImpl.java index 03748d37..ddd162e0 100644 --- a/src/main/java/project/flipnote/group/repository/GroupRepositoryImpl.java +++ b/src/main/java/project/flipnote/group/repository/GroupRepositoryImpl.java @@ -70,9 +70,10 @@ public List findAllByCursorAndUserId(Long lastId, Category category, group.category, group.imageUrl )) - .from(group) + .from(groupMember) .join(groupMember.group, group) - .where(groupMember.group.id.eq(group.id).and(groupMember.user.id.eq(userId)).and(where)) + .on(groupMember.user.id.eq(userId)) + .where(where) .orderBy(group.id.desc()) .limit(pageSize+1) .fetch();