Skip to content

Commit b1ae5e2

Browse files
committed
[Feat]: 게시글 좋아요순 정렬 조건 추가
1 parent 945efbb commit b1ae5e2

File tree

3 files changed

+48
-2
lines changed

3 files changed

+48
-2
lines changed

back/src/main/java/com/back/domain/post/controller/PostController.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.back.domain.post.dto.PostRequest;
55
import com.back.domain.post.dto.PostSearchCondition;
66
import com.back.domain.post.dto.PostSummaryResponse;
7+
import com.back.domain.post.enums.PostSortType;
78
import com.back.domain.post.service.PostService;
89
import com.back.domain.user.entity.User;
910
import com.back.global.common.PageResponse;
@@ -14,7 +15,9 @@
1415
import jakarta.validation.Valid;
1516
import lombok.RequiredArgsConstructor;
1617
import org.springframework.data.domain.Page;
18+
import org.springframework.data.domain.PageRequest;
1719
import org.springframework.data.domain.Pageable;
20+
import org.springframework.data.domain.Sort;
1821
import org.springframework.http.HttpStatus;
1922
import org.springframework.http.ResponseEntity;
2023
import org.springframework.security.core.annotation.AuthenticationPrincipal;
@@ -52,9 +55,14 @@ public ResponseEntity<PostDetailResponse> createPost(
5255
public ResponseEntity<PageResponse<PostSummaryResponse>> getPosts(
5356
@Parameter(description = "검색 조건") @ModelAttribute PostSearchCondition condition,
5457
@Parameter(description = "페이지 정보") Pageable pageable,
58+
@RequestParam(defaultValue = "LATEST") PostSortType sortType,
5559
@AuthenticationPrincipal CustomUserDetails userDetails) {
5660
User user = (userDetails != null) ? userDetails.getUser() : null;
57-
Page<PostSummaryResponse> responses = postService.getPosts(user, condition, pageable);
61+
62+
Sort sort = Sort.by(Sort.Direction.DESC, sortType.getProperty());
63+
Pageable sortedPageable = PageRequest.of(pageable.getPageNumber(), pageable.getPageSize(), sort);
64+
65+
Page<PostSummaryResponse> responses = postService.getPosts(user, condition, sortedPageable);
5866
return ResponseEntity.ok(PageResponse.of(responses));
5967
}
6068

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.back.domain.post.enums;
2+
3+
import lombok.Getter;
4+
5+
@Getter
6+
public enum PostSortType {
7+
LATEST("createdDate"),
8+
LIKES("likeCount");
9+
10+
private final String property;
11+
12+
PostSortType(String property) {
13+
this.property = property;
14+
}
15+
}

back/src/main/java/com/back/domain/post/repository/PostRepositoryCustomImpl.java

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,16 @@
44
import com.back.domain.post.entity.Post;
55
import com.back.domain.post.enums.PostCategory;
66
import com.back.domain.post.enums.SearchType;
7+
import com.querydsl.core.types.Order;
8+
import com.querydsl.core.types.OrderSpecifier;
79
import com.querydsl.core.types.dsl.BooleanExpression;
10+
import com.querydsl.core.types.dsl.PathBuilder;
811
import com.querydsl.jpa.impl.JPAQuery;
912
import com.querydsl.jpa.impl.JPAQueryFactory;
1013
import lombok.RequiredArgsConstructor;
1114
import org.springframework.data.domain.Page;
1215
import org.springframework.data.domain.Pageable;
16+
import org.springframework.data.domain.Sort;
1317
import org.springframework.data.support.PageableExecutionUtils;
1418
import org.springframework.stereotype.Repository;
1519
import org.springframework.util.StringUtils;
@@ -32,7 +36,7 @@ public Page<Post> searchPosts(PostSearchCondition condition, Pageable pageable)
3236
.where(getCategoryCondition(condition.category()),
3337
getSearchCondition(condition.keyword(), condition.searchType()),
3438
excludeHiddenIfSearch(condition.keyword(), condition.searchType()))
35-
.orderBy(post.createdDate.desc())
39+
.orderBy(toOrderSpecifier(pageable))
3640
.offset(pageable.getOffset())
3741
.limit(pageable.getPageSize())
3842
.fetch();
@@ -80,4 +84,23 @@ private BooleanExpression excludeHiddenIfSearch(String searchKeyword, SearchType
8084
}
8185
return post.hide.eq(false);
8286
}
87+
88+
private OrderSpecifier<?>[] toOrderSpecifier(Pageable pageable) {
89+
if (pageable.getSort().isEmpty()) {
90+
return new OrderSpecifier[]{post.createdDate.desc()};
91+
}
92+
93+
return pageable.getSort().stream()
94+
.map(order -> {
95+
Order direction = order.isAscending() ? Order.ASC : Order.DESC;
96+
String property = order.getProperty();
97+
98+
return switch (property) {
99+
case "createdDate" -> new OrderSpecifier<>(direction, post.createdDate);
100+
case "likeCount" -> new OrderSpecifier<>(direction, post.likeCount);
101+
default -> new OrderSpecifier<>(direction, post.createdDate);
102+
};
103+
})
104+
.toArray(OrderSpecifier[]::new);
105+
}
83106
}

0 commit comments

Comments
 (0)