Skip to content

refactor: 피드 페이지네이션을 offset기반에서 cursor방식으로 전환#371

Merged
mangsuyo merged 8 commits intomangsuyofrom
refactor/feed-cursor-based#369
Oct 23, 2025
Merged

refactor: 피드 페이지네이션을 offset기반에서 cursor방식으로 전환#371
mangsuyo merged 8 commits intomangsuyofrom
refactor/feed-cursor-based#369

Conversation

@mangsuyo
Copy link
Copy Markdown
Member

📌 관련 이슈

피드 페이징 조회를 offset 기반에서 cursor 방식으로 전환 #369

🛠️ 작업 내용

  1. Offset 기반 페이지네이션을 Cursor 기반으로 전환
    • 기존의 page, size를 사용하는 Offset 기반 페이징을 lastId 파라미터를 사용하는 Cursor 기반 페이징으로 변경했습니다.
  2. 동적 쿼리(QueryDSL)를 사용한 커서 로직 구현
    • WHERE 절에 복잡한 커서 조건을 동적으로 생성하는 쿼리 로직을 구현하여 (university, category, pinned, createdDate, id) 값을 기준으로 다음 데이터를 효율적으로 조회합니다.
  3. 성능 최적화를 위한 복합 인덱스를 생성
    • 새로운 페이징 방식의 성능을 극대화하기 위해 (university, category, pinned DESC, createdDate DESC, id DESC) 순서의 복합 인덱스를 데이터베이스에 생성하여 쿼리 속도를 개선했습니다.

🚀 성능 비교 (더미 데이터 100만 건 기준)

구분 조건 응답 시간 비고
Offset 기반 (기존) 99,999번째 페이지 조회 6.68초 깊은 페이지로 갈수록 성능이 급격히 저하됩니다.
Cursor 기반 (변경) lastId=10 기준 조회 482ms 페이지 위치와 관계없이 일정한 성능을 유지합니다.

Offset 기반이 6.68초 걸리던 작업을 Cursor 기반은 482ms로 처리하며 약 14배의 성능 개선 효과를 보였습니다.
(Offset과 Cursor 방식 모두 최적화된 인덱스를 생성한 후의 결과입니다.)

🤔 인덱스 도입의 트레이드 오프

  • 단점: 인덱스 용량 증가

    • 기존 Offset 방식은 별도 인덱스가 필요 없었으나, Cursor 방식은 (university, category, pinned, createdDate, id) 복합 인덱스를 추가해야 합니다.
    • 이 인덱스는 42.63MB의 추가 저장 공간을 사용하지만,
      기존 인덱스(PRIMARY 95.64MB, student_id 36.58MB 등)와 비교했을 때 합리적인 수준의 투자로 판단됩니다.
  • 장점: 압도적인 성능 및 데이터 정합성

    • 인덱스 용량 증가의 단점을 상쇄하고도 남을 만큼, 페이지 위치와 관계없이 일정하고 빠른 조회 성능을 보장합니다.
    • 실시간으로 데이터가 추가/삭제되어도 데이터 중복이나 누락이 발생하지 않아 높은 데이터 정합성을 유지할 수 있습니다.

@mangsuyo mangsuyo self-assigned this Sep 13, 2025
@mangsuyo mangsuyo added the 🔨 Refactor 코드 리팩토링 label Sep 13, 2025
@mangsuyo mangsuyo changed the title Refactor/feed cursor based#369 refactor: 피드 페이지네이션을 offset기반에서 cursor방식으로 전환 Sep 13, 2025
@mangsuyo mangsuyo changed the base branch from dev to mangsuyo October 22, 2025 11:22
@mangsuyo mangsuyo marked this pull request as ready for review October 22, 2025 11:22
@mangsuyo mangsuyo merged commit 8b18c82 into mangsuyo Oct 23, 2025
1 check failed
@mangsuyo mangsuyo deleted the refactor/feed-cursor-based#369 branch October 23, 2025 00:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🔨 Refactor 코드 리팩토링

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant