1. 초기 상태 (MySQL + JPA)

  • 테스트 환경: nGrinder
    • 사용자 198명
    • 1초에 조회 1개씩 요청
    • 테스트 시간: 5분
  • 테스트 결과:
    • 총 실행 횟수: 3,600번
    • 성공: 3,598번
    • 실패: 2건
    • 평균 테스트 시간: 14,133.28ms (매우 비효율적)
    • TPS 그래프의 편차가 심함
  • 문제 분석:
    • DB와의 통신에서 지연이 발생할 가능성이 높음
    • JPA를 사용하면서 최적화가 덜 되었을 가능성이 있음
  • 진단 방법:
    • p6spy를 활용하여 SQL 로그 분석
    • COUNT 쿼리에서 700ms가 소요되는 문제 발견
    • JPA의 페이지네이션 과정에서 발생하는 비효율적인 쿼리 확인
    • 아래 사진 : 타임스탬프 | sql 실행시간 | 실행된 sql작업 | 사용된 DB 커넥션 ID|DB 연결 정보

 

2. QueryDSL을 활용한 최적화

  • 개선 조치:
    • JPA 페이지네이션을 QueryDSL로 변경하여 최적화 진행
  • 테스트 환경 (동일한 조건으로 진행):
    • 테스트 시간: 5분
  • 테스트 결과:
    • 총 실행 횟수: 42,024번
    • 성공: 36,613번
    • 실패: 5,411건
    • 평균 테스트 시간: 246.18ms
  • 개선 점:
    • 실행 횟수가 증가하고 성공 횟수도 증가
    • 하지만 평균 테스트 시간이 여전히 높음

 

3. 엘라스틱 서치 도입

  • 개선 조치:
    • 검색 기능을 MySQL에서 엘라스틱 서치로 변경
  • 테스트 환경 (동일한 조건으로 진행):
    • 테스트 시간: 5분
  • 테스트 결과:
    • 총 실행 횟수: 57,058번
    • 성공: 40,912번
    • 실패: 16,146건
    • 평균 테스트 시간: 15.39ms
  • 분석:
    • 에러가 크게 증가했지만, TPS 그래프가 일정 시간마다 0으로 떨어지는 현상이 있었음
    • 엘라스틱 서치 자체의 문제라기보다는 다른 병목이 원인일 가능성이 있음
  • 개선 점:
    • 평균 테스트 시간이 15.39ms로 크게 감소하여 성능이 대폭 개선됨

 

+ Recent posts