diff --git a/src/main/java/stackpot/stackpot/feed/controller/FeedController.java b/src/main/java/stackpot/stackpot/feed/controller/FeedController.java index 37541fbb..66a3fa68 100644 --- a/src/main/java/stackpot/stackpot/feed/controller/FeedController.java +++ b/src/main/java/stackpot/stackpot/feed/controller/FeedController.java @@ -16,6 +16,7 @@ import stackpot.stackpot.feed.entity.enums.Category; import stackpot.stackpot.feed.service.FeedQueryService; import stackpot.stackpot.feed.service.FeedCommandService; +import stackpot.stackpot.user.dto.response.UserMyPageResponseDto; import java.util.Map; @@ -137,37 +138,7 @@ public ResponseEntity> toggleLike(@PathVariable Long feedId) { "message", isLiked ? "좋아요를 눌렀습니다." : "좋아요를 취소했습니다." ))); } - @GetMapping("/{userId}") - @Operation( - summary = "사용자별 Feed 조회 API", - description = "사용자의 feed를 조회합니다." - ) - public ResponseEntity> getFeedsByUserId( - @Parameter(description = "사용자 ID", example = "1") - @PathVariable("userId") Long userId, - - @Parameter(description = "커서", example = "100", required = false) - @RequestParam(value = "cursor", required = false) Long cursor, - - @Parameter(description = "페이지 크기", example = "10") - @RequestParam(value = "size", defaultValue = "10") int size - ) { - FeedResponseDto.FeedPreviewList feedPreviewList = feedQueryService.getFeedsByUserId(userId, cursor, size); - return ResponseEntity.ok(ApiResponse.onSuccess(feedPreviewList)); - } - - @Operation(summary = "나의 Feed 조회 API") - @GetMapping("/my-feeds") - @ApiErrorCodeExamples({ - ErrorStatus.USER_NOT_FOUND - }) - public ResponseEntity> getFeeds( - @RequestParam(name = "cursor", required = false) Long cursor, - @RequestParam(name = "size", defaultValue = "10") int size) { - FeedResponseDto.FeedPreviewList feedPreviewList = feedQueryService.getFeeds(cursor, size); - return ResponseEntity.ok(ApiResponse.onSuccess(feedPreviewList)); - } @PostMapping("/series") @Operation(summary = "시리즈 생성/삭제 동기화 API", diff --git a/src/main/java/stackpot/stackpot/feed/converter/FeedConverter.java b/src/main/java/stackpot/stackpot/feed/converter/FeedConverter.java index 07587d94..d64cf8f9 100644 --- a/src/main/java/stackpot/stackpot/feed/converter/FeedConverter.java +++ b/src/main/java/stackpot/stackpot/feed/converter/FeedConverter.java @@ -33,7 +33,7 @@ public FeedResponseDto.FeedDto feedDto(Feed feed, Boolean isOwner, Boolean isLik return FeedResponseDto.FeedDto.builder() .feedId(feed.getFeedId()) .writerId(feed.getUser().getId()) - .writer(feed.getUser().getNickname() + " 씨앗") + .writer(feed.getUser().getNickname() + " 새싹") .writerRole(feed.getUser().getRole()) .title(feed.getTitle()) .content(feed.getContent()) @@ -61,7 +61,7 @@ public FeedResponseDto.CreatedFeedDto createFeedDto(Feed feed) { .title(feed.getTitle()) .content(feed.getContent()) .writerId(feed.getUser().getId()) - .writer(feed.getUser().getNickname()+ " 씨앗") + .writer(feed.getUser().getNickname()+ " 새싹") .writerRole(feed.getUser().getRole()) .categories(feed.getCategories().stream() .map(Enum::name) @@ -91,7 +91,7 @@ public FeedSearchResponseDto toSearchDto(Feed feed) { .feedId(feed.getFeedId()) .title(feed.getTitle()) .content(feed.getContent()) - .creatorNickname(feed.getUser().getNickname()+" 씨앗") + .creatorNickname(feed.getUser().getNickname()+" 새싹") .creatorRole(mapRoleName(String.valueOf(feed.getUser().getRole()))) .createdAt(DateFormatter.koreanFormatter(feed.getCreatedAt())) .likeCount(feed.getLikeCount()) // 좋아요 개수 포함 @@ -110,7 +110,7 @@ public FeedResponseDto.AuthorizedFeedDto toAuthorizedFeedDto(Feed feed, boolean FeedResponseDto.CreatedFeedDto createdDto = FeedResponseDto.CreatedFeedDto.builder() .feedId(feed.getFeedId()) .writerId(feed.getUser().getId()) - .writer(feed.getUser().getNickname()+" 씨앗") + .writer(feed.getUser().getNickname()+" 새싹") .writerRole(feed.getUser().getRole()) .title(feed.getTitle()) .content(feed.getContent()) diff --git a/src/main/java/stackpot/stackpot/feed/service/FeedQueryService.java b/src/main/java/stackpot/stackpot/feed/service/FeedQueryService.java index 479b1ffb..70d2f0ab 100644 --- a/src/main/java/stackpot/stackpot/feed/service/FeedQueryService.java +++ b/src/main/java/stackpot/stackpot/feed/service/FeedQueryService.java @@ -2,15 +2,16 @@ import stackpot.stackpot.feed.entity.Feed; import stackpot.stackpot.feed.dto.FeedResponseDto; +import stackpot.stackpot.user.dto.response.UserMyPageResponseDto; import java.util.Map; public interface FeedQueryService { FeedResponseDto.FeedPreviewList getPreViewFeeds(String category, String sort, Long cursor, int limit); FeedResponseDto.AuthorizedFeedDto getFeed(Long feedId); - FeedResponseDto.FeedPreviewList getFeedsByUserId(Long userId, Long nextCursor, int pageSize); + UserMyPageResponseDto getFeedsByUserId(Long userId, Long nextCursor, int pageSize); // FeedResponseDto.FeedPreviewList searchByUserIdByKeyword(Long userId, Long nextCursor, int pageSize); - FeedResponseDto.FeedPreviewList getFeeds(Long nextCursor, int pageSize); +UserMyPageResponseDto getFeeds(Long nextCursor, int pageSize); Map getMySeries(); Long getLikeCount(Long feedId); Feed getFeedByFeedId(Long feedId); diff --git a/src/main/java/stackpot/stackpot/feed/service/FeedQueryServiceImpl.java b/src/main/java/stackpot/stackpot/feed/service/FeedQueryServiceImpl.java index 8dc33ca5..46d4cdd4 100644 --- a/src/main/java/stackpot/stackpot/feed/service/FeedQueryServiceImpl.java +++ b/src/main/java/stackpot/stackpot/feed/service/FeedQueryServiceImpl.java @@ -30,6 +30,7 @@ import stackpot.stackpot.feed.repository.SeriesRepository; import stackpot.stackpot.notification.service.NotificationCommandService; import stackpot.stackpot.save.repository.FeedSaveRepository; +import stackpot.stackpot.user.dto.response.UserMyPageResponseDto; import stackpot.stackpot.user.entity.User; import stackpot.stackpot.user.repository.UserRepository; @@ -179,7 +180,7 @@ public FeedResponseDto.AuthorizedFeedDto getFeed(Long feedId) { } @Transactional - public FeedResponseDto.FeedPreviewList getFeedsByUserId(Long userId, Long nextCursor, int pageSize) { + public UserMyPageResponseDto getFeedsByUserId(Long userId, Long nextCursor, int pageSize) { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); boolean isAuthenticated = authentication != null && !(authentication instanceof AnonymousAuthenticationToken) @@ -201,13 +202,9 @@ public FeedResponseDto.FeedPreviewList getFeedsByUserId(Long userId, Long nextCu : List.of(); Pageable pageable = PageRequest.of(0, pageSize, Sort.by(Sort.Direction.DESC, "feedId")); - List feeds; - - if (nextCursor == null) { - feeds = feedRepository.findByUser_Id(userId, pageable); - } else { - feeds = feedRepository.findByUserIdAndFeedIdBefore(userId, nextCursor, pageable); - } + List feeds = (nextCursor == null) + ? feedRepository.findByUser_Id(userId, pageable) + : feedRepository.findByUserIdAndFeedIdBefore(userId, nextCursor, pageable); List feedDtos = feeds.stream() .map(feed -> { @@ -220,18 +217,23 @@ public FeedResponseDto.FeedPreviewList getFeedsByUserId(Long userId, Long nextCu }) .collect(Collectors.toList()); - Long nextCursorResult = (!feeds.isEmpty() && feeds.size() >= pageSize) - ? feeds.get(feeds.size() - 1).getFeedId() - : null; + // 조회 대상 유저 정보 + User targetUser = userRepository.findById(userId) + .orElseThrow(() -> new UserHandler(ErrorStatus.USER_NOT_FOUND)); - return FeedResponseDto.FeedPreviewList.builder() + List seriesComments = targetUser.getSeriesList().stream() + .map(Series::getComment) + .collect(Collectors.toList()); + + return UserMyPageResponseDto.builder() + .id(targetUser.getId()) + .seriesComments(seriesComments) .feeds(feedDtos) - .nextCursor(nextCursorResult) .build(); } @Override - public FeedResponseDto.FeedPreviewList getFeeds(Long nextCursor, int pageSize) { + public UserMyPageResponseDto getFeeds(Long nextCursor, int pageSize) { User user = authService.getCurrentUser(); Pageable pageable = PageRequest.of(0, pageSize, Sort.by(Sort.Direction.DESC, "feedId")); @@ -253,13 +255,14 @@ public FeedResponseDto.FeedPreviewList getFeeds(Long nextCursor, int pageSize) { }) .collect(Collectors.toList()); - Long nextCursorResult = (!feeds.isEmpty() && feeds.size() >= pageSize) - ? feeds.get(feeds.size() - 1).getFeedId() - : null; + List seriesComments = user.getSeriesList().stream() + .map(Series::getComment) + .collect(Collectors.toList()); - return FeedResponseDto.FeedPreviewList.builder() + return UserMyPageResponseDto.builder() + .id(user.getId()) + .seriesComments(seriesComments) .feeds(feedDtos) - .nextCursor(nextCursorResult) .build(); } diff --git a/src/main/java/stackpot/stackpot/pot/converter/PotApplicationConverter.java b/src/main/java/stackpot/stackpot/pot/converter/PotApplicationConverter.java index 2499226e..59621ad4 100644 --- a/src/main/java/stackpot/stackpot/pot/converter/PotApplicationConverter.java +++ b/src/main/java/stackpot/stackpot/pot/converter/PotApplicationConverter.java @@ -45,7 +45,7 @@ public PotApplicationResponseDto toDto(PotApplication entity) { .applicationId(entity.getApplicationId()) .potRole(roleInfo) .userId(entity.getUser().getId()) - .userNickname(entity.getUser().getNickname() + " 씨앗") + .userNickname(entity.getUser().getNickname() + " 새싹") .build(); } diff --git a/src/main/java/stackpot/stackpot/pot/converter/PotConverter.java b/src/main/java/stackpot/stackpot/pot/converter/PotConverter.java index 9891721b..a0acc7b7 100644 --- a/src/main/java/stackpot/stackpot/pot/converter/PotConverter.java +++ b/src/main/java/stackpot/stackpot/pot/converter/PotConverter.java @@ -72,7 +72,7 @@ public PotPreviewResponseDto toPrviewDto(User user, Pot pot, List recrui return PotPreviewResponseDto.builder() .userId(user.getId()) .userRole(user.getRole().name()) - .userNickname(user.getNickname() + " 씨앗") + .userNickname(user.getNickname() + " 새싹") .potId(pot.getPotId()) .potName(pot.getPotName()) .potContent(pot.getPotContent()) diff --git a/src/main/java/stackpot/stackpot/pot/converter/PotDetailConverter.java b/src/main/java/stackpot/stackpot/pot/converter/PotDetailConverter.java index f7870257..201a72b0 100644 --- a/src/main/java/stackpot/stackpot/pot/converter/PotDetailConverter.java +++ b/src/main/java/stackpot/stackpot/pot/converter/PotDetailConverter.java @@ -40,7 +40,7 @@ public PotDetailResponseDto toPotDetailResponseDto(User user, Pot pot, String re return PotDetailResponseDto.builder() .userId(user.getId()) .userRole(user.getRole().name()) - .userNickname(user.getNickname() + " 씨앗") + .userNickname(user.getNickname() + " 새싹") .isOwner(isOwner) .potId(pot.getPotId()) .potName(pot.getPotName()) diff --git a/src/main/java/stackpot/stackpot/save/repository/FeedSaveRepository.java b/src/main/java/stackpot/stackpot/save/repository/FeedSaveRepository.java index c0d2e1a8..4d4e8c87 100644 --- a/src/main/java/stackpot/stackpot/save/repository/FeedSaveRepository.java +++ b/src/main/java/stackpot/stackpot/save/repository/FeedSaveRepository.java @@ -10,8 +10,7 @@ import stackpot.stackpot.feed.entity.mapping.FeedSave; import stackpot.stackpot.user.entity.User; -import java.util.List; -import java.util.Optional; +import java.util.*; @Repository public interface FeedSaveRepository extends JpaRepository { @@ -30,6 +29,23 @@ public interface FeedSaveRepository extends JpaRepository { @Query("SELECT COUNT(fs) FROM FeedSave fs WHERE fs.feed.feedId = :feedId") long countByFeedId(@Param("feedId") Long feedId); + @Query(""" + SELECT fs.feed.feedId, COUNT(fs) + FROM FeedSave fs + WHERE fs.feed.feedId IN :feedIds + GROUP BY fs.feed.feedId + """) + List countByFeedIdsRaw(@Param("feedIds") List feedIds); + + default Map countByFeedIds(List feedIds) { + if (feedIds == null || feedIds.isEmpty()) return Collections.emptyMap(); + Map map = new HashMap<>(); + for (Object[] row : countByFeedIdsRaw(feedIds)) { + map.put((Long) row[0], (Long) row[1]); + } + return map; + } + } diff --git a/src/main/java/stackpot/stackpot/search/service/SearchServiceImpl.java b/src/main/java/stackpot/stackpot/search/service/SearchServiceImpl.java index 8dabfa58..c8a5c695 100644 --- a/src/main/java/stackpot/stackpot/search/service/SearchServiceImpl.java +++ b/src/main/java/stackpot/stackpot/search/service/SearchServiceImpl.java @@ -53,23 +53,22 @@ public Page searchPots(String keyword, Pageable pageable) .map(Pot::getPotId) .collect(Collectors.toList()); - User user = null; Long userId = null; try { - user = authService.getCurrentUser(); + User user = authService.getCurrentUser(); userId = user.getId(); - } catch (Exception e) { - // 비로그인 - } + } catch (Exception ignored) { /* 비로그인 */ } + // 배치 집계(이미 배치 쿼리 사용 중이라 OK) Map potSaveCountMap = potSaveRepository.countSavesByPotIds(potIds); + + // List -> Set (contains O(1)) Set savedPotIds = (userId != null) - ? potSaveRepository.findPotIdsByUserIdAndPotIds(userId, potIds) + ? new HashSet<>(potSaveRepository.findPotIdsByUserIdAndPotIds(userId, potIds)) : Collections.emptySet(); - // 참여 여부 isMember 확인 Set memberPotIds = (userId != null) - ? potMemberRepository.findPotIdsByUserIdAndPotIds(userId, potIds) + ? new HashSet<>(potMemberRepository.findPotIdsByUserIdAndPotIds(userId, potIds)) : Collections.emptySet(); return pots.map(pot -> { @@ -86,47 +85,50 @@ public Page searchPots(String keyword, Pageable pageable) }); } + @Override @Transactional(readOnly = true) public Page searchFeeds(String keyword, Pageable pageable) { - Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); - boolean isAuthenticated = authentication != null && - !(authentication instanceof AnonymousAuthenticationToken) && - authentication.isAuthenticated(); + var authentication = SecurityContextHolder.getContext().getAuthentication(); + boolean isAuthenticated = authentication != null + && !(authentication instanceof AnonymousAuthenticationToken) + && authentication.isAuthenticated(); + + User user = isAuthenticated ? authService.getCurrentUser() : null; + Long userId = (user != null) ? user.getId() : null; - User user; - Long userId = null; - if (isAuthenticated) { - user = authService.getCurrentUser(); - userId = user.getId(); - } else { - user = null; - } - // 키워드 기반 검색 Page feeds = feedRepository.findByTitleContainingOrContentContainingOrderByCreatedAtDesc( keyword, keyword, pageable ); - // 좋아요/저장 정보 조회 - List likedFeedIds = (userId != null) - ? feedLikeRepository.findFeedIdsByUserId(userId) - : Collections.emptyList(); + // === N+1 제거: 한 번에 집계/조회 === + List feedIds = feeds.getContent().stream() + .map(Feed::getFeedId) + .collect(Collectors.toList()); - List savedFeedIds = (userId != null) - ? feedSaveRepository.findFeedIdsByUserId(userId) - : Collections.emptyList(); + // 저장 수 배치 집계 + Map saveCountMap = feedSaveRepository.countByFeedIds(feedIds); + + // List -> Set (contains O(1)) + Set likedFeedIds = (userId != null) + ? new HashSet<>(feedLikeRepository.findFeedIdsByUserId(userId)) + : Collections.emptySet(); + + Set savedFeedIds = (userId != null) + ? new HashSet<>(feedSaveRepository.findFeedIdsByUserId(userId)) + : Collections.emptySet(); - // 각 Feed를 FeedDto로 변환 return feeds.map(feed -> { boolean isOwner = user != null && Objects.equals(user.getId(), feed.getUser().getId()); - Boolean isLiked = likedFeedIds.contains(feed.getFeedId()); - Boolean isSaved = savedFeedIds.contains(feed.getFeedId()); - int saveCount = feedSaveRepository.countByFeed(feed); + Boolean isLiked = (userId != null) ? likedFeedIds.contains(feed.getFeedId()) : null; + Boolean isSaved = (userId != null) ? savedFeedIds.contains(feed.getFeedId()) : null; + int saveCount = saveCountMap.getOrDefault(feed.getFeedId(), 0L).intValue(); return feedConverter.feedDto(feed, isOwner, isLiked, isSaved, saveCount); }); } + } diff --git a/src/main/java/stackpot/stackpot/user/controller/UserController.java b/src/main/java/stackpot/stackpot/user/controller/UserController.java index 4ad4d6b7..2cc20af0 100644 --- a/src/main/java/stackpot/stackpot/user/controller/UserController.java +++ b/src/main/java/stackpot/stackpot/user/controller/UserController.java @@ -1,6 +1,7 @@ package stackpot.stackpot.user.controller; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.tags.Tag; @@ -15,6 +16,7 @@ import stackpot.stackpot.apiPayload.ApiResponse; import stackpot.stackpot.apiPayload.code.status.ErrorStatus; import stackpot.stackpot.common.swagger.ApiErrorCodeExamples; +import stackpot.stackpot.feed.service.FeedQueryService; import stackpot.stackpot.pot.dto.CompletedPotRequestDto; import stackpot.stackpot.pot.dto.PotResponseDto; import stackpot.stackpot.pot.service.pot.MyPotService; @@ -26,7 +28,6 @@ import stackpot.stackpot.user.dto.request.UserUpdateRequestDto; import stackpot.stackpot.user.dto.response.*; import stackpot.stackpot.user.entity.enums.Provider; -import stackpot.stackpot.user.entity.enums.Role; import stackpot.stackpot.user.service.UserCommandService; import stackpot.stackpot.user.service.UserQueryService; import stackpot.stackpot.user.service.oauth.GoogleService; @@ -50,7 +51,7 @@ public class UserController { private final MyPotService myPotService; private final PotCommandService potCommandService; private final UserQueryService userQueryService; - + private final FeedQueryService feedQueryService; @GetMapping("/login/token") @Operation( @@ -399,37 +400,46 @@ public ResponseEntity> deleteMyDescription() { return ResponseEntity.noContent().build(); } - //삭제 예정 - @GetMapping("/mypages") + + + @GetMapping("/{userId}/feeds") @Operation( - summary = "나의 마이페이지 조회 API", - description = "토큰을 통해 자신의 [정보 조회 API + 피드 + 끓인 팟] 모두를 제공하는 API로 마이페이지 전체의 정보를 제공하는 API입니다. dataType = pot / feed / (null : pot + feed)" + summary = "사용자별 피드 조회 API", + description = "userId에 해당하는 사용자의 시리즈 코멘트와 피드를 반환합니다. 피드는 커서 기반 페이지네이션을 지원합니다." ) @ApiErrorCodeExamples({ ErrorStatus.USER_NOT_FOUND, - ErrorStatus.USER_ALREADY_WITHDRAWN, + ErrorStatus.USER_ALREADY_WITHDRAWN }) - public ResponseEntity> usersMypages( - @RequestParam(name = "dataType", required = false) String dataType){ - UserMyPageResponseDto userDetails = userCommandService.getMypages(dataType); - return ResponseEntity.ok(ApiResponse.onSuccess(userDetails)); + public ResponseEntity> getFeedsByUserId( + @Parameter(description = "사용자 ID", example = "1") + @PathVariable("userId") Long userId, + + @Parameter(description = "커서", example = "100", required = false) + @RequestParam(value = "cursor", required = false) Long cursor, + + @Parameter(description = "페이지 크기", example = "10") + @RequestParam(value = "size", defaultValue = "10") int size + ) { + UserMyPageResponseDto mypage = feedQueryService.getFeedsByUserId(userId, cursor, size); + return ResponseEntity.ok(ApiResponse.onSuccess(mypage)); } - //삭제 예정 - @GetMapping("/{userId}/mypages") @Operation( - summary = "사용자별 마이페이지 조회 API", - description = "userId를 통해 사용자의 [정보 조회 API + 피드 + 끓인 팟] 모두를 제공하는 API로 마이페이지 전체의 정보를 제공하는 API입니다.\n"+"dataType = pot / feed / (null : pot + feed)" + summary = "나의 피드 조회 API", + description = "로그인한 사용자의 시리즈 코멘트와 피드를 반환합니다. 피드는 커서 기반 페이지네이션을 지원합니다." ) + @GetMapping("/feeds") @ApiErrorCodeExamples({ ErrorStatus.USER_NOT_FOUND, - ErrorStatus.USER_ALREADY_WITHDRAWN, - ErrorStatus._BAD_REQUEST + ErrorStatus.USER_ALREADY_WITHDRAWN }) - public ResponseEntity> getUserMypage( - @PathVariable("userId") Long userId, - @RequestParam(name = "dataType", required = false) String dataType) { - UserMyPageResponseDto response = userCommandService.getUserMypage(userId, dataType); - return ResponseEntity.ok(ApiResponse.onSuccess(response)); + public ResponseEntity> getFeeds( + @RequestParam(name = "cursor", required = false) Long cursor, + @RequestParam(name = "size", defaultValue = "10") int size + ) { + UserMyPageResponseDto mypage = feedQueryService.getFeeds(cursor, size); + return ResponseEntity.ok(ApiResponse.onSuccess(mypage)); } + } diff --git a/src/main/java/stackpot/stackpot/user/converter/UserMypageConverter.java b/src/main/java/stackpot/stackpot/user/converter/UserMypageConverter.java index e5f12210..b13f460d 100644 --- a/src/main/java/stackpot/stackpot/user/converter/UserMypageConverter.java +++ b/src/main/java/stackpot/stackpot/user/converter/UserMypageConverter.java @@ -23,16 +23,13 @@ @Component @RequiredArgsConstructor public class UserMypageConverter { - private final PotMemberRepository potMemberRepository; private final FeedConverter feedConverter; - private final MyPotConverter myPotConverter; - private final PotMemberBadgeRepository potMemberBadgeRepository; private final FeedLikeRepository feedLikeRepository; private final FeedSaveRepository feedSaveRepository; - public UserMyPageResponseDto toDto(User user, List completedPots, List feeds) { + public UserMyPageResponseDto toDto(User user, List feeds) { // 현재 유저가 좋아요 누른 피드 ID 목록 List likedFeedIds = feedLikeRepository.findFeedIdsByUserId(user.getId()); @@ -40,47 +37,16 @@ public UserMyPageResponseDto toDto(User user, List completedPots, List savedFeedIds = feedSaveRepository.findFeedIdsByUserId(user.getId()); + // 시리즈 코멘트 List seriesComments = user.getSeriesList().stream() .map(Series::getComment) .collect(Collectors.toList()); + return UserMyPageResponseDto.builder() .id(user.getId()) - .nickname(user.getNickname() + Role.toVegetable(String.valueOf(user.getRole()))) - .role(user.getRole()) - .userTemperature(user.getUserTemperature()) - .userIntroduction(user.getUserIntroduction()) .seriesComments(seriesComments) - .completedPots(completedPots.stream() - .map(pot -> { - List roleCounts = potMemberRepository.findRoleCountsByPotId(pot.getPotId()); - Map roleCountsMap = roleCounts.stream() - .collect(Collectors.toMap( - roleCount -> ((Role) roleCount[0]).name(), - roleCount -> ((Long) roleCount[1]).intValue() - )); - - String formattedMembers = roleCountsMap.entrySet().stream() - .map(entry -> Role.toKoreanName(entry.getKey()) + "(" + entry.getValue() + ")") - .collect(Collectors.joining(", ")); - Role userPotRole = pot.getUser().getId().equals(user.getId()) ? - pot.getUser().getRole() : - potMemberRepository.findRoleByUserId(pot.getPotId(), user.getId()) - .orElse(pot.getUser().getRole()); - - List myBadges = potMemberBadgeRepository - .findByPotMember_Pot_PotIdAndPotMember_User_Id(pot.getPotId(), user.getId()) - .stream() - .map(potMemberBadge -> new BadgeDto( - potMemberBadge.getBadge().getBadgeId(), - potMemberBadge.getBadge().getName() - )) - .collect(Collectors.toList()); - - return myPotConverter.toCompletedPotBadgeResponseDto(pot, formattedMembers, userPotRole, myBadges); - }) - .collect(Collectors.toList())) .feeds(feeds.stream() .map(feed -> { @@ -94,4 +60,5 @@ public UserMyPageResponseDto toDto(User user, List completedPots, List completedPots; - @Schema(description = "시리즈 이름") private List seriesComments; diff --git a/src/main/java/stackpot/stackpot/user/entity/enums/Role.java b/src/main/java/stackpot/stackpot/user/entity/enums/Role.java index 8743e772..dc356dc1 100644 --- a/src/main/java/stackpot/stackpot/user/entity/enums/Role.java +++ b/src/main/java/stackpot/stackpot/user/entity/enums/Role.java @@ -4,11 +4,11 @@ @Getter public enum Role { - DEFAULT("씨앗", "씨앗"), BACKEND("양파", "백엔드"), FRONTEND("버섯", "프론트엔드"), DESIGN("브로콜리", "디자인"), PLANNING("당근", "기획"), + DEFAULT("새싹", "새싹"), UNKNOWN("UNKNOWN", "알 수 없음"); private final String vegetable; diff --git a/src/main/java/stackpot/stackpot/user/service/UserCommandService.java b/src/main/java/stackpot/stackpot/user/service/UserCommandService.java index 75435b39..d917bf36 100644 --- a/src/main/java/stackpot/stackpot/user/service/UserCommandService.java +++ b/src/main/java/stackpot/stackpot/user/service/UserCommandService.java @@ -15,9 +15,9 @@ public interface UserCommandService { UserResponseDto.UserInfoDto getMyUsers(); UserResponseDto.UserInfoDto getUsers(Long UserId); - UserMyPageResponseDto getMypages(String dataType); + UserMyPageResponseDto getMypages(); - UserMyPageResponseDto getUserMypage(Long userId, String dataType); + UserMyPageResponseDto getUserMypage(Long userId); UserResponseDto.Userdto updateUserProfile(UserUpdateRequestDto requestDto); diff --git a/src/main/java/stackpot/stackpot/user/service/UserCommandServiceImpl.java b/src/main/java/stackpot/stackpot/user/service/UserCommandServiceImpl.java index 949342ab..e9f27bca 100644 --- a/src/main/java/stackpot/stackpot/user/service/UserCommandServiceImpl.java +++ b/src/main/java/stackpot/stackpot/user/service/UserCommandServiceImpl.java @@ -166,45 +166,35 @@ public UserResponseDto.UserInfoDto getUsers(Long UserId) { } - public UserMyPageResponseDto getMypages(String dataType) { + public UserMyPageResponseDto getMypages() { User user = authService.getCurrentUser(); - //탈퇴한 사용자 - if(user.getRole() == Role.UNKNOWN){ - log.error("탈퇴한 유저에 대한 요청입니다. {}",user.getUserId()); + // 탈퇴한 사용자 + if (user.getRole() == Role.UNKNOWN) { + log.error("탈퇴한 유저에 대한 요청입니다. {}", user.getUserId()); throw new UserHandler(ErrorStatus.USER_ALREADY_WITHDRAWN); } - return getMypageByUser(user.getId(), dataType); + return getMypageByUser(user.getId()); } - public UserMyPageResponseDto getUserMypage(Long userId, String dataType) { - return getMypageByUser(userId, dataType); + public UserMyPageResponseDto getUserMypage(Long userId) { + return getMypageByUser(userId); } - private UserMyPageResponseDto getMypageByUser(Long userId, String dataType) { - List completedPots = List.of(); - List feeds = List.of(); - + private UserMyPageResponseDto getMypageByUser(Long userId) { User user = userRepository.findById(userId) .orElseThrow(() -> new UserHandler(ErrorStatus.USER_NOT_FOUND)); - if(user.getRole() == Role.UNKNOWN){ + if (user.getRole() == Role.UNKNOWN) { throw new UserHandler(ErrorStatus.USER_ALREADY_WITHDRAWN); } - if (dataType == null || dataType.isBlank()) { - completedPots = potRepository.findByUserIdAndPotStatus(userId, "COMPLETED"); - feeds = feedRepository.findByUser_Id(userId); - } else if ("pot".equalsIgnoreCase(dataType)) { - completedPots = potRepository.findByUserIdAndPotStatus(userId, "COMPLETED"); - } else if ("feed".equalsIgnoreCase(dataType)) { - feeds = feedRepository.findByUser_Id(userId); - } else { - log.error("pot, feed의 요청이 잘 못 되었습니다."); - throw new GeneralException(ErrorStatus._BAD_REQUEST); - } - return userMypageConverter.toDto(user, completedPots, feeds); + // Feed만 조회 + List feeds = feedRepository.findByUser_Id(userId); + + + return userMypageConverter.toDto(user, feeds); }