IT 개발/Java

Java - 대용량 데이터 엑셀다운로드 하기

쵸비냥냥 2024. 7. 23. 15:25
반응형

 

 

어제 운영중인 서비스에서 관리자가 데이터 엑셀 다운로드 후 사이트가 멈췄다고 CS가 들어왔다.

 

관리자페이지가 서비스페이지와 함께 서버에서 돌아가고있기 때문에 바로 접속해보니 동일하게 하얀창만 뜨고 다른 반응이 없는 현상이 있었다.

 

서버에서 돌아가는건 정상으로 돌아가고있지만 흰 페이지 자체는 문제이다보니 급한대로 소스재배포로 정상화 시킨 후 원인분석을 해보았다.

1. 서버문제 아님(서버에서 에러가 있었으면 에러관련 로그들이 남아있었을건데 에러발생 예상시간에 남은 로그 없음)

2. 서비스로그는 엑셀다운로드에서 기록이 멈춰있었음..

 

 

 

 

유추해보건대.. 엑셀다운로드시 서버가 과부하로 뻗은거로 예상(사실 원인유추에만 하루종일걸린건 안비밀 ㅠ)....

이유1. 1개의 엑셀파일에 3개의 시트를 만드는데 한 시트당 6천~9천개의 데이터를 적재하는데 .. 대략으로만 봐도 데이터가 2만개가 넘어감..

이유2. 한번에 엑셀을 임시파일로 만드는 로직이 있음.. 여기서 과부하가 올것이라고 예상..

 

 

구글링은 '대용량 데이터 엑셀 다운로드' 라고 쳐보았고..

눈에띄는 페이지가 있었다..

https://jjjjqqq.tistory.com/58

 

Java 대용량 엑셀 다운로드 (SXSSF)

엑셀 용량이 크다면 SXSSF를 써야합니다 https://poi.apache.org/components/spreadsheet/ SXSSF is an API-compatible streaming extension of XSSF to be used when very large spreadsheets have to be produced, and heap space is limited. SXSSF achieves

jjjjqqq.tistory.com

 

현재 프로젝트에서는 poi의 XSSFWorkbook 이라는 패키지를 사용하고있었는데.. 

대신해서 

SXSSFWorkbook라는 패키지로 변경하면 대용량처리가 가능하다고 한다.

 

POI

아파치 소프트웨어 재단에서 만든 라이브러리로 Microsoft Office 파일을 자바 언어로 읽고 쓰는 기능 제공한다.
주로 Word, Excel, Power Point 파일을 지원한다.

 

POI라이브러리를 사용하여 Excel을 다루어보자.

 

Workbook 종류

HSSF : Excel 2007 하위버전(.xls) 파일 포맷을 사용할 때 사용
XSSF : Excel 2007 (.xlsx) 파일 포맷을 사용할 때 사용
SXSSF : 대용량 엑셀 파일을 출력할 때 사용

 

 

XSSF, SXSSF 차이

  • XSSF
    - 읽기, 쓰기가 가능하다.
    - 메모리에 파일데이터를 쌓아두고 사용하기 때문에 용량이 큰 경우 Out Of Memory 에러가 발생한다. 

  • SXSSF
    - 쓰기만 가능하다.
    - 임시파일을 중간중간 생성하여 메모리를 적게 사용하기 때문에 XSSF보다 매우 큰 엑셀 파일을 생성할 수 있다.
    - XSSF는 전체 행에 대한 컨트롤이 가능하지만 SXSSF는 지정된 행 (window size)에 관해서만 컨트롤이 가능해서 메모리를 적게 사용한다.

출처: https://fvor001.tistory.com/118 [Dev Log:티스토리]

 

이를 참고로 기존 XSSF 패키지를 SXSSF 패키지로 변경하였다.

 

임포트 변경해주고,

 

기존에 XSSF로 생성자 주었던 부분을 SXSSF로 변경하고

 

파일이 생성되는 부분에서 finally를 추가해서 임시파일을 비워줄수 있는 로직도 추가해주고,

autoSizeColumn은 SXSSFSheet로 캐스팅하여

 

기존에 XSSF에서 코드 수정을 몇줄만 해서 성능을 크게 올릴수 있었다.

 

기존 코드는 약 3만개의 데이터를 엑셀 다운로드까지 200초정도 걸렸었는데,

수정된 코드를 적용하여 엑셀 다운로드를 하니 20초 정도로 확 줄어들었다

반응형