Files
sodalive-backend-spring-boot/docs/20260305_정산엑셀스트리밍전환.md

2.5 KiB

관리자 정산 엑셀 스트리밍 전환 작업 계획

  • 기존 정산 엑셀 다운로드 API의 요청/응답 계약(엔드포인트, 쿼리 파라미터, 헤더)을 유지한다.
  • AdminCalculateController의 엑셀 응답 타입을 StreamingResponseBody 기반으로 전환한다.
  • AdminCalculateService의 엑셀 생성 방식을 XSSFWorkbook + ByteArrayOutputStream에서 SXSSFWorkbook + 스트리밍 write로 전환한다.
  • AdminChannelDonationCalculateController의 날짜별/크리에이터별 엑셀 응답을 StreamingResponseBody 기반으로 전환한다.
  • AdminChannelDonationCalculateService의 날짜별/크리에이터별 엑셀 생성을 SXSSFWorkbook 스트리밍 방식으로 전환한다.
  • 관련 테스트를 스트리밍 응답 기준으로 수정한다.
  • lsp_diagnostics, 테스트, 빌드를 실행하고 결과를 검증 기록에 남긴다.

검증 기록

1차 구현

  • 무엇을: 관리자 정산 엑셀 다운로드 API 전체(라이브/콘텐츠/콘텐츠후원/커뮤니티/크리에이터별 3종/채널후원 날짜별/채널후원 크리에이터별)의 서버 내부 생성/전송 방식을 스트리밍으로 전환했다.
  • 왜: 기존 XSSFWorkbook + ByteArrayOutputStream + InputStreamResource 방식은 전체 워크북과 바이트 배열을 메모리에 유지해 대용량 다운로드 시 피크 메모리 사용량이 커지기 때문이다.
  • 어떻게:
    • 컨트롤러 응답 타입을 ResponseEntity<StreamingResponseBody>로 변경하고, 기존 파일명 인코딩/Content-Disposition/xlsx MIME 타입은 유지했다.
    • 서비스 반환 타입을 StreamingResponseBody로 변경하고 SXSSFWorkbook(100)로 row window 기반 생성 후 outputStream에 직접 write하도록 변경했다.
    • 스트리밍 완료 시 workbook.dispose()workbook.close()를 호출해 임시 파일/리소스 해제를 보장했다.
    • 채널후원 컨트롤러/서비스(날짜별, 크리에이터별)에도 동일 패턴을 적용했다.
    • 테스트를 스트리밍 응답 기준으로 수정했다.
      • 컨트롤러 테스트: InputStreamResource 검증 -> StreamingResponseBody 검증
      • 서비스 테스트: readAllBytes() -> StreamingResponseBody.writeTo(ByteArrayOutputStream) 검증
    • 실행 결과:
      • lsp_diagnostics (수정된 .kt 파일) → Kotlin LSP 미설정으로 진단 불가
      • ./gradlew test --tests "*AdminChannelDonationCalculate*" → 성공
      • ./gradlew build → 성공