2.5 KiB
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→ 성공
- 컨트롤러 응답 타입을