diff --git a/infrastructure/db/src/main/java/kr/ac/kookmin/stream/db/welfare/NoticeJpaRepository.java b/infrastructure/db/src/main/java/kr/ac/kookmin/stream/db/welfare/NoticeJpaRepository.java index 71bb2ed9..ee08183c 100644 --- a/infrastructure/db/src/main/java/kr/ac/kookmin/stream/db/welfare/NoticeJpaRepository.java +++ b/infrastructure/db/src/main/java/kr/ac/kookmin/stream/db/welfare/NoticeJpaRepository.java @@ -34,28 +34,23 @@ Page search( Pageable pageable ); - @Query(""" - SELECT n FROM NoticeJpaEntity n - WHERE n.isDeleted = false - AND (:category IS NULL OR n.category = :category) - ORDER BY n.pinned DESC, n.createdAt DESC, n.id DESC - """) - List findFirstSlice(@Param("category") NoticeCategory category, Pageable pageable); - + // 커서가 없으면(cursorId가 null) 첫 페이지, 있으면 그 다음부터 조회한다. 커서의 세 값(pinned, createdAt, id)은 함께 넘긴다. + // 정렬이 pinned DESC, createdAt DESC, id DESC라 "다음"은 정렬상 뒤쪽이다. boolean은 0/1로 바꿔 비교한다 @Query(""" SELECT n FROM NoticeJpaEntity n WHERE n.isDeleted = false AND (:category IS NULL OR n.category = :category) AND ( - (CASE WHEN n.pinned = true THEN 1 ELSE 0 END) < (CASE WHEN :cursorPinned = true THEN 1 ELSE 0 END) + :cursorId IS NULL + OR (CASE WHEN n.pinned = true THEN 1 ELSE 0 END) < (CASE WHEN :cursorPinned = true THEN 1 ELSE 0 END) OR (n.pinned = :cursorPinned AND n.createdAt < :cursorCreatedAt) OR (n.pinned = :cursorPinned AND n.createdAt = :cursorCreatedAt AND n.id < :cursorId) ) ORDER BY n.pinned DESC, n.createdAt DESC, n.id DESC """) - List findNextSlice( + List findSlice( @Param("category") NoticeCategory category, - @Param("cursorPinned") boolean cursorPinned, + @Param("cursorPinned") Boolean cursorPinned, @Param("cursorCreatedAt") LocalDateTime cursorCreatedAt, @Param("cursorId") Long cursorId, Pageable pageable diff --git a/infrastructure/db/src/main/java/kr/ac/kookmin/stream/db/welfare/NoticeRepositoryImpl.java b/infrastructure/db/src/main/java/kr/ac/kookmin/stream/db/welfare/NoticeRepositoryImpl.java index 119812f6..76d838e2 100644 --- a/infrastructure/db/src/main/java/kr/ac/kookmin/stream/db/welfare/NoticeRepositoryImpl.java +++ b/infrastructure/db/src/main/java/kr/ac/kookmin/stream/db/welfare/NoticeRepositoryImpl.java @@ -25,9 +25,13 @@ public class NoticeRepositoryImpl implements NoticeRepository { @Override public CursorSliceResult findAll(NoticeCategory category, NoticeCursor cursor, int size) { Pageable pageable = Pageable.ofSize(size + 1); - List entities = cursor == null - ? noticeJpaRepository.findFirstSlice(category, pageable) - : noticeJpaRepository.findNextSlice(category, cursor.pinned(), cursor.createdAt(), cursor.id(), pageable); + List entities = noticeJpaRepository.findSlice( + category, + cursor == null ? null : cursor.pinned(), + cursor == null ? null : cursor.createdAt(), + cursor == null ? null : cursor.id(), + pageable + ); return CursorSliceResult.ofSlice( entities, size, NoticeJpaEntity::toDomain, notice -> NoticeCursor.of(notice, category).format()