inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

6주 완성! 백엔드 이력서 차별화 전략 4가지 - 똑같은 이력서 속에서 돋보이는 법

조회속도 개선에서 더 개선하는 방법이 궁금합니다.

2

문영훈

작성한 질문수 5

0

안녕하세요. 인덱스를 활용한 조회 성능 개선을 공부하던 중 궁금한 점이 생겨 질문드립니다.

현재 저는 OFFSET 기반 pagination을 사용하는 서비스를 개발하고 있으며, 다음과 같은 환경에서 성능 테스트를 진행했습니다.


1. 문제 상황

초기에는 OFFSET 제한 없이 마지막 페이지까지 이동 가능하도록 구현했습니다.
하지만 데이터가 1,000만 건 수준으로 증가하자, 깊은 페이지로 갈수록 조회 속도가 급격히 느려지는 문제를 확인했습니다.


2. 고민 및 제약

일반적으로 이 문제는 Keyset Pagination(커서 기반)으로 해결하라고 많이 알려져 있습니다.

하지만 제 서비스는
👉네비게이션 바를 통한 페이지 직접 이동 (ex. 1, 10, 100 페이지 클릭)
이 필요하기 때문에 Keyset 방식만으로는 요구사항을 만족시키기 어렵다고 판단했습니다.


3. 적용한 개선 방법

다음과 같은 방식으로 성능 개선을 진행했습니다.


4. 성능 개선 결과

[Page 10]
avg: 1.4s  → 700ms
p95: 4.5s  → 1.8s

[Page 100]
avg: 17s   → 1.18s
p95: 24s   → 3.3s

[Page 1000]
avg: 32.1s → 1.7s
p95: 59s   → 4.27s

SQL 쿼리는 분석결과
약 1700MS -> 70MS 까지 단축한 것 같습니다.

5. 추가 제약사항


6. 현재 고민

위와 같이 개선했지만,
👉 여전히 성능이 충분하지 않다고 느끼고 있습니다.

특히 궁금한 점은 다음과 같습니다.


7. 질문

  1. OFFSET 기반 pagination을 유지하면서
    👉추가로 성능을 개선할 수 있는 방법이 있을까요?

  2. 다음과 같은 방법들을 고려했는데, 방향성이 맞는지 궁금합니다.

    • RDS를 2개를 사용하여 조회 성능 데이터를 각각 2개의 db가 처리하도록 한다?

    • Keyset + OFFSET 혼합 방식
      (

      일반적인 페이지 이동은 Keyset Pagination을 사용하고,
      사용자가 특정 페이지를 직접 입력하거나 점프하는 경우에만
      제한적으로 OFFSET 기반 조회를 사용하는 혼합 방식)

    • RDS 스펙 업그레이드

  3. 또한 에펨코리아(https://www.fmkorea.com/)와 같은 대형 커뮤니티는 제가 원하는 페이지 네이션 방식을 사용하면서 깊은페이지(최대 1만)도 지원하고

    • 동시접속자 수십만

    • 페이지 수천~수만

    • 대량 데이터
      환경에서도 빠른 조회 성능을 유지하는데

    👉이러한 서비스들은 어떤 방식으로 pagination 및 조회 성능을 처리하는지 궁금합니다.

java spring mysql redis 이력서

답변 1

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. 문영훈님.

인덱스를 활용한 pagination 성능 개선에 대해 심도 있는 질문을 주셨네요. OFFSET 기반 pagination에서 성능을 더욱 향상시키는 방법을 고민하고 계신데요, 질문하신 내용을 토대로 몇 가지 방법과 개선 방향을 제안드리겠습니다.

OFFSET 기반 Pagination 성능 개선 방안

  1. Keyset Pagination 혼합 사용:

    • 이미 제안하신 Keyset + OFFSET 결합 방식은 매우 유용할 수 있습니다. 일반적으로 Keyset 방식이 성능이 뛰어나고, OFFSET은 사용자 편의에 도움이 됩니다. 각 상황에 맞게 두 방식을 조합하면 성능과 편의성 간 균형을 맞출 수 있습니다.
  2. 데이터베이스 파티셔닝 및 복제:

    • 파티셔닝(Partitioning)을 적용하거나 RDS를 복제하여 읽기 전용 DB로 사용하는 방법도 고려해 볼 만합니다. 데이터 분산을 통해 각각의 DB에 매우 높은 성능을 요구하는 요청을 분배할 수 있습니다.
  3. 캐싱 시스템 강화:

    • 로그인 사용자에게도 캐싱 성능 향상을 시도해볼 수 있습니다. 사용자별 중요한 데이터는 적절한 TTL(Time To Live)과 일관성 정책을 설정해 캐싱하면 좋습니다. Redis의 활용을 검토해 보시기 바랍니다.
  4. 지표 기반 개선:

    • 현재 성능 개선 수치와 사용량을 계속해서 모니터링하세요. 성능이 저하되는 페이지나 기능을 빠르게 인식할 수 있는 지표 체계를 구축하여 실시간으로 대응할 필요가 있습니다.
  5. 기타 제안:

    • 더욱 강력한 쿼리 최적화를 고려하고, 필요한 경우 인덱싱을 재검토하세요. Django ORM과 같은 고성능 데이터베이스 도구를 사용하여 쿼리 성능을 최대한 향상시킬 수 있습니다.

대형 커뮤니티의 Pagination 최적화 사례

대형 커뮤니티들은 보통 데이터베이스 상의 구조를 최적화하고, 고성능 캐싱 시스템을 사용하며, 확장 가능한 데이터베이스 디자인을 통해 성능을 최적화합니다. 대표적으로 데이터베이스 샤딩 및 레디스 캐시를 활용해 대규모 트래픽을 효율적으로 처리합니다.

관련된 질문과 답변이 있어 유사한 사례를 다룬 게시물을 참고하시길 추천드립니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해 드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

Build 관련 문제 (테스트 관련 문제)

0

36

1

인덱스 관련 질문 있습니다.

0

62

2

비관적 락 구현 방식 문의 건

0

64

2

외부 api 처리 방안에 대하여 궁금한 점이 있습니다.

0

87

2

네임드 락 사용 시 커넥션 풀을 분리하는 방법에 대한 질문

0

78

2

이벤트) 백엔드 기술면접 실전문제집

0

99

2

로컬에서 테스트 한 결과를 이력서에 써도 괜찮을까요?

0

128

2

데드락 발생 시, 외래 키를 제거하는 방법 관련 질문

0

83

2

Redis 캐싱을 도입하는데 db조회와 성능이 차이가 거의 없습니다.

0

108

2

k6 부하테스트 중인데 개선 전 성능이 너무 안나와서 고민

0

118

2

강의와 성능수치 비교

0

101

2

13강 강의 뒷부분의 과제 안내부분은 어디있나요?

0

49

2

이벤트 참가자 수 증가 후, save 메서드 호출 코드 질문

0

64

2

[수업 자료 질문] Cache Aside의 특징 문의

0

82

2

[수업자료 문의] RedisTemplate으로 SETNX 시 리턴값 문의

0

79

2

블로그에 학습 내용 정리 포스트를 올려도괜찮나요?

0

107

2

멀티스레드 상황인데 currentParticipants 가 AtomicInteger가 아닌 이유?

0

86

3

클라우드 환경 배포시 부하 테스트 방식에 대하여

0

136

2

k6 dashboad 안나오는 상

0

111

2

2-4 도커 빌드 에러가 계속 납니다.

0

296

2

AWS EC2에 도커 컨테이너가 동작하지 않을 때 확인 해야하는 것

0

113

2

성능 측정시

0

107

2

API 별 실행 쿼리 모니터링 구현 질문 있습니다.

0

81

2

이력서 작성에 대한 질문

0

108

2