메시지 발송 내역 조회 및 엑셀 다운로드 성능 개선

탄이·2023년 9월 6일
0

간략한 설명

  • 메시지 대량 발송 시, 발송 내역에 대한 세부 조회 및 조회 건에 대한 엑셀 다운로드 성능 개선
  • 기준 : 메시지 발송 건수 약 6만 5천 건
  • 성과
    - 발송 내역 상세 조회 속도 4900% 개선 (100초 -> 2초)
    - 상세 조회 내역 엑셀 다운로드 속도 2100% 개선 (155초 -> 7초)
    + 속도 측정 방법 : 해당 로직 전,후에 System.currentTimeMillis()를 삽입한 뒤 산출
// 개선 전
INFO i.c.g.a.a.m.MassMessageFacade@findMessageHistoryDetailsExcel(130) - 메세지 로그 조회 소요시간 : 100.337초
INFO i.c.g.a.a.m.MassMessageFacade@findMessageHistoryDetailsExcel(135) - 엑셀 파싱 작업 소요시간 : 154.885초

// 개선 후
INFO i.c.g.a.a.m.MassMessageFacade@findMessageHistoryDetailsExcel(130) - 메세지 로그 조회 소요시간 : 1.504초
INFO i.c.g.a.a.m.MassMessageFacade@findMessageHistoryDetailsExcel(136) - 엑셀 파싱 작업 소요시간 : 6.817초

성능 저하 원인

  • 상세 내역 조회
    - 발송 상태에 대한 code와 description이 별도 테이블에 정의 돼 있음
    - 발송 상태에 대한 description을 내려주기 위해, 발송 건마다 이 테이블에 select 쿼리를 날림
    - 즉, 메시지 6만 5천 건을 조회한다면 6만 5천번 select 쿼리를 날리고 있는 상황
  • 메시지 발송 내역 상세 조회 엑셀 다운로드
    - 엑셀 파일 생성용 공통 Util이 존재했고, As-is는 이 util을 사용 중
    - 공통 Util은 쿼리해온 결과를 Map<String, Object>에 파일명, head, body를 각각 담아서 row별로 출력하는 방식
    - 각 cell에 적힐 데이터들은 모두 String으로 변환
    - 쿼리 결과를 두 번 변환하다보니(Map에 담고, 다시 꺼내서 엑셀로 출력) 대량 건을 작업할 때는 부적합

해결 방법

  • 상세 내역 조회
    - 발송 상태에 대한 정의 테이블은 DML이 드문 테이블이며 데이터가 많지 않음
    - 따라서, 발송 상태 코드에 맞는 description을 찾기 전 모든 값을 가져와(findAll()) Java단에서 일치하는 값을 찾아서 매칭
    - 그 결과 100초 -> 2초로 개선
  • 메시지 발송 내역 상세 조회 엑셀 다운로드
    - 공통 Util이 아닌, 쿼리해온 결과를 for-each 문을 사용해 바로 찍어주는 방식으로 변경
    - 그 결과 155초 -> 7초로 개선
    - 단, 해당 건처럼 대용량 데이터를 엑셀로 변환하는 경우를 제외하고는 엑셀 공통 Util을 쓰는 것이 바람직함
profile
백엔드 개발자의 로그

0개의 댓글