diff --git a/back/src/main/java/com/back/domain/post/controller/PostController.java b/back/src/main/java/com/back/domain/post/controller/PostController.java index d7ca00b..8d35a37 100644 --- a/back/src/main/java/com/back/domain/post/controller/PostController.java +++ b/back/src/main/java/com/back/domain/post/controller/PostController.java @@ -4,6 +4,7 @@ import com.back.domain.post.dto.PostRequest; import com.back.domain.post.dto.PostSearchCondition; import com.back.domain.post.dto.PostSummaryResponse; +import com.back.domain.post.enums.PostSortType; import com.back.domain.post.service.PostService; import com.back.domain.user.entity.User; import com.back.global.common.PageResponse; @@ -14,7 +15,9 @@ import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; @@ -52,9 +55,14 @@ public ResponseEntity createPost( public ResponseEntity> getPosts( @Parameter(description = "검색 조건") @ModelAttribute PostSearchCondition condition, @Parameter(description = "페이지 정보") Pageable pageable, + @RequestParam(defaultValue = "LATEST") PostSortType sortType, @AuthenticationPrincipal CustomUserDetails userDetails) { User user = (userDetails != null) ? userDetails.getUser() : null; - Page responses = postService.getPosts(user, condition, pageable); + + Sort sort = Sort.by(Sort.Direction.DESC, sortType.getProperty()); + Pageable sortedPageable = PageRequest.of(pageable.getPageNumber(), pageable.getPageSize(), sort); + + Page responses = postService.getPosts(user, condition, sortedPageable); return ResponseEntity.ok(PageResponse.of(responses)); } diff --git a/back/src/main/java/com/back/domain/post/enums/PostSortType.java b/back/src/main/java/com/back/domain/post/enums/PostSortType.java new file mode 100644 index 0000000..302638b --- /dev/null +++ b/back/src/main/java/com/back/domain/post/enums/PostSortType.java @@ -0,0 +1,15 @@ +package com.back.domain.post.enums; + +import lombok.Getter; + +@Getter +public enum PostSortType { + LATEST("createdDate"), + LIKES("likeCount"); + + private final String property; + + PostSortType(String property) { + this.property = property; + } +} \ No newline at end of file diff --git a/back/src/main/java/com/back/domain/post/repository/PostRepositoryCustomImpl.java b/back/src/main/java/com/back/domain/post/repository/PostRepositoryCustomImpl.java index 1e11e43..542ce66 100644 --- a/back/src/main/java/com/back/domain/post/repository/PostRepositoryCustomImpl.java +++ b/back/src/main/java/com/back/domain/post/repository/PostRepositoryCustomImpl.java @@ -4,12 +4,16 @@ import com.back.domain.post.entity.Post; import com.back.domain.post.enums.PostCategory; import com.back.domain.post.enums.SearchType; +import com.querydsl.core.types.Order; +import com.querydsl.core.types.OrderSpecifier; import com.querydsl.core.types.dsl.BooleanExpression; +import com.querydsl.core.types.dsl.PathBuilder; import com.querydsl.jpa.impl.JPAQuery; import com.querydsl.jpa.impl.JPAQueryFactory; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; import org.springframework.data.support.PageableExecutionUtils; import org.springframework.stereotype.Repository; import org.springframework.util.StringUtils; @@ -32,7 +36,7 @@ public Page searchPosts(PostSearchCondition condition, Pageable pageable) .where(getCategoryCondition(condition.category()), getSearchCondition(condition.keyword(), condition.searchType()), excludeHiddenIfSearch(condition.keyword(), condition.searchType())) - .orderBy(post.createdDate.desc()) + .orderBy(toOrderSpecifier(pageable)) .offset(pageable.getOffset()) .limit(pageable.getPageSize()) .fetch(); @@ -80,4 +84,23 @@ private BooleanExpression excludeHiddenIfSearch(String searchKeyword, SearchType } return post.hide.eq(false); } + + private OrderSpecifier[] toOrderSpecifier(Pageable pageable) { + if (pageable.getSort().isEmpty()) { + return new OrderSpecifier[]{post.createdDate.desc()}; + } + + return pageable.getSort().stream() + .map(order -> { + Order direction = order.isAscending() ? Order.ASC : Order.DESC; + String property = order.getProperty(); + + return switch (property) { + case "createdDate" -> new OrderSpecifier<>(direction, post.createdDate); + case "likeCount" -> new OrderSpecifier<>(direction, post.likeCount); + default -> new OrderSpecifier<>(direction, post.createdDate); + }; + }) + .toArray(OrderSpecifier[]::new); + } }