자바에서 엑셀 다운로드 기능을 위해 자주 사용되는 방식으로 JXLS, SXSSF 방식이 있다.
JXLS 란?
- JXLS는 JAVA 오픈소스 라이브러리이다.
- JXLS는 개발자가 미리 만들어 놓은 엑셀 템플릿을 기반으로 데이터를 삽입하여 엑셀 문서를 생성한다.
- JXLS 라이브러리에서 제공해주는 명령어들을 이용해 엑셀 템플릿 파일을 만들고, 자바에서 엑셀에 삽입할 데이터 모델의 속성명와 엑셀 템플릿 파일 내의 속성명을 일치시켜주면 엑셀에 데이터 모델의 속성들이 반복적으로 쓰여진다.
- JXLS은 데이터를 메모리에 계속 들고 있기 때문에 엑셀에 삽입할 데이터가 많으면 속도가 점점 저하되고, 서버에서 Out Of Memory 에러(Java heap space)가 발생할 수 있다.
SXSSF 란?
- SXSSF는 Apache POI 프로젝트에서 제공하는 엑셀 스트리밍 API 중 하나이다.
- XSSF(Excel Streaming User Model)는 메모리에 저장된 데이터를 사용하여 엑셀 문서를 생성하는 API이고, SXSSF(Streaming User Model for Excel)는 대용량 데이터를 처리할 수 있는 엑셀 스트리밍 API이다.
- XSSF에서는 메모리에 모든 데이터를 저장하기 때문에, 대용량 데이터를 처리할 경우 Out Of Memory 에러가 발생할 수 있다. JXLS도 데이터를 메모리에 계속 저장하고 있기 때문에, 대용량 데이터의 경우 Out Of Memry 에러가 발생할 수 있다.
- 반면, SXSSF는 데이터를 더 작은 단위인 레코드 단위로 쪼개어 처리하므로, 대용량 데이터를 처리할 때도 메모리 사용량이 적어서 성능적인 이점이 있다. 또한, SXSSF에서는 Workbook을 생성할 때 메모리 내의 임시 파일을 사용하여 대용량 데이터를 처리하므로, 파일로 저장하기 전에도 데이터가 일부분씩 쓰여지며, 이후에는 임시 파일에서 데이터를 읽어와서 파일에 저장한다.
- 따라서, SXSSF는 대용량 데이터를 처리할 때 유용하다.
- SXSSF는 JXLS처럼 엑셀 템플릿을 사용하지 않고, JAVA에서 Workbook, Sheet, Row, Cell 등의 클래스를 이용해 엑셀 형식을 만든다. 따라서, JAVA에서 Excel Row생성, 각 Cell에 값 주입 등을 일일이 해줘야 하는 번거로움이 있다.
JXLS vs SXSSF
JXLS | SXSSF | |
장점 | - 엑셀 템플릿을 이용하기 때문에 복잡한 레이아웃 구현에 용이 | - 메모리 사용량을 최소화하여 대용량 엑셀 생성에 용이 - JXLS보다 엑셀 생성 속도가 빠름. 행 10만 개 기준 5배 빠름 |
단점 | - 엑셀 파일 만들 때 데이터가 대용량일 시, Out Of Memory 에러 발생할 수 있음 - SXSSF보다 엑셀 생성 속도가 느림. 행 10만 개 기준 5배 정도 차이남 |
- 엑셀 템플릿을 사용하지 않아 복잡한 레이아웃 구현에 번거로움이 있음 |
JXLS는 엑셀 생성 속도는 느리지만, 레이아웃이 복잡한 경우에 용이하고, 데이터 크기가 작을 때 효율적이다
SXSSF는 대용량의 데이터 엑셀 파일을 만들 때, 레이아웃이 간단할 때 효율적이다.
내 업무에서는 엑셀 파일 한 개 당 평균적으로 행의 개수가 1개일 정도로 데이터 크기가 적었다. 행의 개수가 1개일 때 JXLS는 엑셀이 만들어지는 속도가 179ms, SXSSF는 107ms로 데이터 양이 많을 때보단 속도 차이가 크지 않았다. 따라서, 엑셀 템플릿을 사용하는 JXLS 라이브러리를 사용했다.
참고 자료
JXLS, POI JAVA에서 Excel 사용하는 구현 방법 및 종류 비교
개발을 하다 보면 종종 운영에서 엑셀 다운로드 기능에 대한 요구가 있는데, 이번에 Java에서 엑셀 다운로드를 구현하는 방법에 대해 알아보겠습니다. Java에서 엑셀 다운로드 기능을 위해 자주
ddoriya.tistory.com
https://techblog.woowahan.com/2698/
아 엑셀다운로드 개발,,, 쉽고 빠르게 하고 싶다 (feat. 엑셀 다운로드 모듈 개발기) | 우아한형제
{{item.name}} 1. 들어가며 안녕하세요! 정산시스템팀 병아리 개발자 최태현입니다. 최근에 엑셀 다운로드 개발을 편하게 할 수 있는 모듈을 만들게 되었습니다. 제가 엑셀 다운로드 모듈을 만들게
techblog.woowahan.com
'기타 > Open Source' 카테고리의 다른 글
JXLS을 이용해 엑셀 파일 만들기 (0) | 2023.04.02 |
---|---|
Apache Superset에서 권한 설정 (0) | 2023.02.06 |
Apache Superset에서 Dataset을 이용해 Chart 생성 (0) | 2023.02.06 |
Apache Superset에서 MySQL DB 연동 및 Dataset 생성 (0) | 2023.02.06 |
Apache Superset 설치 (0) | 2023.02.06 |