간략한 설명
- 메시지 대량 발송 시, 발송 내역에 대한 세부 조회 및 조회 건에 대한 엑셀 다운로드 성능 개선
- 기준 : 메시지 발송 건수
약 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을 쓰는 것이 바람직함