카카오톡 발송⁠·⁠템플릿 통계 수집 서버

기간  — 

알림톡⁠·⁠친구톡⁠·⁠브랜드메시지 세 종류를 다룹니다. 통계 테이블은 사용자 ID 기준으로 역정규화해 조회 쿼리 성능을 높였습니다.

월 800만 건 이상의 발송 통계 수집

Java 17Spring Boot 3.5Spring BatchMyBatisMySQL

경과일마다 다른 통계

문제
카카오 API의 읽음⁠·⁠클릭 통계는 경과일(0⁠·⁠1⁠·⁠2일)⁠별로 따로 집계되어 들어왔습니다. 한 번에 합치면 값이 맞지 않아 데이터 정합성이 깨졌습니다.
해결
매일 카카오 API에서 집계된 통계 전체를 받아오게 했습니다. 읽음⁠·⁠클릭 값은 경과일별 3단계로 나눠 누적했습니다. 배치는 500건씩 DB에 써서 쓰기 성능을 높였습니다.

재수집 시 중복 적재

문제
배치 집계가 빠지는 경우에 대비해 수동 재수집 API를 만들자, 같은 데이터를 여러 번 누적할 수 있는 구조가 되었습니다.
해결
역정규화한 최종 테이블에서 변동 컬럼을 뺀 주요 컬럼으로 복합키를 구성했습니다. elapsed_mask 컬럼을 추가해 경과일 0⁠·⁠1⁠·⁠2를 비트 1⁠·⁠2⁠·⁠4로 표시했습니다. 누적할 때 이 비트를 확인해 같은 경과일 값을 두 번 더하지 않게 했습니다. 같은 데이터를 다시 수집해도 행이 중복되지 않아 통계의 정합성이 유지되었습니다.