728x90
반응형
데이터는 있다. 이제 엑셀을 받아서 어떻게 만들지에 대한 고민이 필요하다.
아키텍처와 기술 스택
- 라이브러리 선택 : Apache POI
- 대용량 처리에 특화된 SCSSF(Streaming Usermode API)
- 복잡한 서식(병합된 셀, 스타일, 수식)은 Apache POI에서 세밀한 제어가 가능
- 대용량 처리 및 성능 최적화 전략
- Paging 처리 Slice / Page 1,00건으로 끊어서 엑셀을 사용
- Style 재사용 : 스타일 (폰트, 배경색, 테두리 등)은 미리 생성해두고 재사용
- 비동기 생성 및 응답 프로세스
- 요청 접수: 사용자가 엑셀 생성을 요청하면 서버는 즉시 작업 ID(Task ID)를 응답하고 요청을 큐(Redis, RabbitMQ 등)에 넣는다.
- 백그라운드 처리: 별도의 스레드나 Worker가 큐에서 요청을 꺼내 엑셀을 생성
- 파일 저장: 생성이 완료된 파일을 서버 메모리가 아닌 AWS S3 같은 오브젝트 스토리지에 업로드
- 알림 및 다운로드:
- 방법 A (Polling): 클라이언트가 주기적으로 Task ID 상태를 확인하여 완료되면 다운로드 링크를 노출
- 방법 B (Push): 완료 시 WebSocket이나 알림을 통해 사용자에게 알린다.
- 수식(Formula) 활용 및 자동 계산
- 수식 적용: cell.setCellFormula("SUM(A1:A10)")와 같이 직접 엑셀 함수를 주입할 수 있음
- 장점: 백엔드에서 복잡한 합계 로직을 일일이 계산하지 않아도 엑셀이 열릴 때 자동으로 계산됨
- 주의사항: * 라이브러리에서 수식을 설정해도, 엑셀 파일 생성 직후에는 값이 비어있을 수 있음
- workbook.getCreationHelper().createFormulaEvaluator().evaluateAll()을 호출하면 생성 시점에 미리 계산된 값을 채울 수 있지만, 데이터가 너무 많으면 성능 저하의 원인이 됨. 보통은 사용자가 파일을 열 때 계산되도록 둠
엑셀 관리는 어떻게 할 것 인가?
템플릿 방식 (Template-based)
- 디자인(폰트, 색상, 테두리, 고정 텍스트)을 코드로 다 짜지 말고, 미리 만들어둔 엑셀 파일(.xlsx)을 템플릿으로 사용하는 방식
- 방법: 리소스 폴더(src/main/resources/templates/excel)에 표준 양식 파일을 저장
- 프로세스:
- 템플릿 파일을 읽어 메모리(SXSSF)에 로드
- 데이터가 들어갈 시작 셀(Row, Column) 위치를 지정
- 데이터를 순회하며 해당 셀에 값만 채워 넣는다.
- 추천 도구 (Jxls): 만약 Apache POI로 위치를 지정하는 것조차 번거롭다면 Jxls 라이브러리를 고려. 엑셀 파일 안에 ${worker.name} 같은 태그를 적어두면 데이터 객체와 매핑하여 자동으로 그려줌
전체 프로세스 흐름
전체 프로세스 흐름 (Architecture)
- Client: 월별 엑셀 생성 API 호출.
- Server (Controller): excel_export_task 테이블에 QUEUED 상태로 레코드 생성 후 즉시 task_id 반환.
- Server (Background/Worker): * 비동기(@Async 또는 Event)로 작업 시작.
- 상태를 PROCESSING으로 변경.
- DB에서 월별 데이터 조회 (Paging 처리).
- 엑셀 템플릿 로드 후 데이터 기입.
- S3 등 스토리지에 업로드.
- Server (Finish): DB 상태를 COMPLETED로 변경하고 file_url 업데이트.
- Client (Polling/Notice): 사용자는 목록 화면에서 "진행 중" 확인 후, 완료되면 "다운로드" 버튼 클릭.
- 파일 보관 기간: 생성된 엑셀 파일은 무한정 쌓아두지 말고, S3 Lifecycle 정책을 통해 7일이나 30일 뒤 자동 삭제되도록 설정하는 것이 효율적
- 중복 요청 방지: 동일한 사용자가 같은 월의 엑셀을 짧은 시간에 여러 번 요청하면 서버 부하가 커집니다. status가 PROCESSING인 동일 조건의 작업이 있다면 추가 요청을 막거나 기존 작업을 안내하는 로직이 필요
생각
- POI 를 사용하여 세밀한 엑셀을 만들고자 했지만, 템플릿 방식을 활용하는게 관리자에게도 편할 것 같다.
- Jxls 에 대해 알아본다.
- 이와 별개로 비동기로 엑셀을 생성하는 로직을 작성한다. 큐가 없으니 일단 DB를 활용하도록 한다.
728x90
반응형