피드로 돌아가기
올리브영 테크블로그Backend
원문 읽기
확장할 수 있는 데이터 추출 서비스 구축 경험 공유
파트너 플랫폼 스쿼드가 동기식 엑셀 다운로드를 Kafka 기반 비동기 이벤트 + Spring Batch Partitioning으로 전환해 브라우저 대기 시간 제거 및 다중 요청 서버 부하 분산
AI 요약
Context
대량의 데이터를 엑셀로 추출할 때 사용자가 브라우저에서 DB 응답을 기다려야 하는 동기식 구조로 인해 서버 자원 부족이 발생했다. 다수의 추출 요청이 동시에 들어올 경우 백엔드 서비스에 직접 부하가 누적되었으며, 브라우저 종료 시 다운로드가 중단되는 문제가 있었다.
Technical Solution
- API 애플리케이션에서 중복 요청 방지: 로드 제어 메커니즘 구현으로 초기 요청 필터링
- Kafka 메시지 브로커 도입: 엑셀 생성 이벤트를 비동기로 전달하여 API 서버와 배치 서버 간 느슨한 결합
- 엑셀 생성 서버 분리: 별도 Spring Batch 인스턴스로 Excel/JSON 파일 생성 처리를 백엔드에서 분리
- Spring Batch Partitioning 적용: 단일 Job 내에서 다수의 Secondary Step을 병렬 실행하여 데이터를 분할 처리 후 최종 파일 병합
- S3 저장 및 재다운로드: 생성된 엑셀을 S3에 업로드하여 언제든 재다운로드 가능하도록 설계
- JobExecutionListener 활용: beforeJob에서 임시 폴더 생성, afterJob에서 상태(성공/실패) 구분 이벤트 발행
- Kafka Consumer 기반 배치 트리거: @KafkaListener로 이벤트 소비 시 JobLauncher 실행 (스케줄 방식 대신 이벤트 방식 채택)
Impact
아티클에서 정량적 성능 지표(처리 시간 감소 %, 처리량 증가 수치, 서버 리소스 사용량 감소율)가 명시되지 않았습니다.
Key Takeaway
대용량 데이터 추출 기능은 동기식 구조에서 Kafka 기반 비동기 이벤트 + Spring Batch Partitioning 조합으로 전환하면, 사용자 대기 시간을 제거하고 API 서버의 부하를 분산할 수 있다. 배치 실행을 스케줄러 방식에서 이벤트 방식으로 전환할 때는 이벤트 설계 및 서버 분리 전략을 함께 고려해야 한다.
실천 포인트
엑셀/CSV 대량 추출 기능을 제공하는 백엔드 팀에서 사용자 대기 시간 제거와 동시 요청 안정성을 동시에 달성하려면, Kafka로 추출 요청을 비동기 이벤트화하고 Spring Batch의 Partitioning을 사용해 데이터를 병렬 처리한 후 S3에 저장하는 구조를 적용할 수 있다. 이 경우 브라우저 종료 후에도 백엔드에서 처리가 계속되며, 생성된 파일은 재다운로드 가능하다.