시스템 로그 페이지 조회 성능 최적화

2024. 4. 4. 12:12·프로그래밍

개발 과정에서 성능 최적화는 매우 중요한 과제 중 하나입니다. 특히, 대용량 데이터 처리 시, 데이터 조회 성능은 사용자 경험에 직접적인 영향을 미칩니다. 본 포스트에서는 시스템 로그 페이지 조회 성능을 개선한 사례를 공유하고자 합니다.

 

문제 상황

라이브 환경에서 시스템 로그 페이지 조회 시, 약 8.10초가 소요되는 문제가 발생했습니다. 조회 대상 데이터는 약 76,040건이었습니다.

 

문제 분석

ListView를 사용하는 클래스에서 전체 시스템 로그 데이터 갯수를 조회하는 과정에서 성능 저하가 발생했습니다. 특히, get_context_data 메서드에서 len(self.get_queryset())을 호출할 때 전체 테이블 데이터에 대한 조회 쿼리가 발생했습니다.

def get_context_data(self, **kwargs):
    ...
    context['objects_count'] = len(self.get_queryset())
    ...

데이터베이스 로그를 확인해보니, limit 없이 system_log 테이블에 대한 전체 데이터 조회 쿼리가 두 번 전송되었습니다. 이로 인해 성능 저하가 발생했습니다.

 

len(self.get_queryset()) 대신 context['paginator'].count를 사용하는 방식으로 변경하여, Paginator 클래스의 count 속성을 사용했습니다. 이 방식은 전체 데이터 수를 조회할 때 데이터베이스에 쿼리를 날리지 않고, Paginator가 이미 계산한 결과를 사용합니다.

 

또한, get_queryset() 메서드에서 queryset에 대한 반복 처리 시, 쿼리셋이 평가되어 전체 데이터 조회 쿼리가 발생했습니다.

def get_queryset(self):
    ...
    for query in queryset:
        query.convert_log_data()
    return queryset

 

이를 context의 object_list를 사용해 처리하도록 변경함으로써, ListView에서 지정한 paginated_by 값만큼만 처리되도록 개선했습니다. 이는 불필요한 전체 데이터 조회를 방지하고 성능을 향상시킵니다.

개선 결과

개선 전

  • 소요 시간: 약 1분

개선 후

  • 소요 시간: 0.7 밀리초

결론

이번 최적화 과정을 통해 데이터 조회 성능이 크게 향상되었습니다. Django의 Paginator 클래스와 쿼리셋의 평가 시점을 이해하고 적절히 활용함으로써, 대규모 데이터 처리 시 성능을 개선할 수 있음을 확인했습니다.

참고 자료

  • Django QuerySets
  • Django DB Optimization
  • Django QuerySets Evaluation
  • Django Paginator

 

 

'프로그래밍' 카테고리의 다른 글

6초에서 0.2초로: 레거시 API 성능 개선 이야기  (0) 2024.12.14
번역 API 개선기: 번역 가능 언어 추가 요청을 받으며 배운 점  (0) 2024.12.03
F-Lab 자바 백엔드 코스 멘토링 후기  (2) 2023.12.03
MSW?  (3) 2023.11.23
REST API란?  (0) 2023.09.06
'프로그래밍' 카테고리의 다른 글
  • 6초에서 0.2초로: 레거시 API 성능 개선 이야기
  • 번역 API 개선기: 번역 가능 언어 추가 요청을 받으며 배운 점
  • F-Lab 자바 백엔드 코스 멘토링 후기
  • MSW?
황심지
황심지
  • 황심지
    꾸준함이 진리다
    황심지
  • 전체
    오늘
    어제
    • 분류 전체보기 (51)
      • 프로그래밍 (12)
        • 운영체제 (0)
        • Spring (4)
        • Java (10)
        • SQL (0)
        • HTTP (2)
        • 회고 (2)
        • Network (0)
        • 프로젝트 (12)
        • Infra (2)
        • 데이터베이스 (3)
        • TIL (1)
        • 파이썬 (2)
      • 운동 (0)
        • 거인화 루틴 일지 (0)
        • 과부하 훈련 일지 (0)
        • 운동 관련 이모저모 (0)
  • 블로그 메뉴

    • 홈
    • 방명록
    • 글쓰기
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    chatops
    개인회고록
    position argument
    패스트캠퍼스
    개인성장
    세션
    Java
    1년회고록
    2023년회고
    에프랩 후기 자바 백엔드 부트캠프
    배포 방식
    직장인자기계발
    CAP 이론
    페이징 최적화
    쿼리 성능
    spring
    F-Lab 후기
    패캠챌린지
    python
    django orm
    webflux
    그런 RESTAPI로 괜찮은가?
    대용량 트래픽
    에프랩 후기 자바 백엔드
    직장인인강
    CAP Theorem
    에프랩 후기
    패스트캠퍼스후기
    한번에끝내는코딩테스트369Java편초격차패키지Online
    레디스 세션
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
황심지
시스템 로그 페이지 조회 성능 최적화
상단으로

티스토리툴바