Java와 Spring 프레임워크 기반의 애플리케이션 개발 시 엑셀 파일의 읽기 및 쓰기 기능은 비즈니스 로직에서 필수적인 요소 중 하나다.
대량의 데이터를 시각화하거나 사용자가 업로드한 데이터를 시스템에 반영할 때 다양한 라이브러리가 활용된다.
Spring 엑셀 관련 라이브러리에 대해 각각 비교해보겠따.
1. Apache POI
Apache POI는 매~~~우 흔히 사용되는 표준같은 라이브러리다. 역사가 깊음..ㅋ
마이크로소프트 오피스 파일 형식을 다루는 오픈소스 프로젝트로, 엑셀뿐만 아니라 워드, 파워포인트 등 다양한 문서를 지원한다.
특징 및 장점 이 라이브러리는 엑셀의 거의 모든 기능을 제어할 수 있는 저수준 API를 제공한다.
셀의 스타일, 폰트, 수식, 병합 등 세밀한 디자인 조정이 가능하다. 또한 HSSF(구형 .xls)와 XSSF(신형 .xlsx) 형식을 모두 지원하며, 대용량 처리를 위한 SXSSF(Streaming XSSF) 방식도 제공한다.
단점 기본적인 XSSF 방식은 엑셀 파일을 읽거나 쓸 때 전체 데이터를 메모리에 로드한다.
이로 인해 데이터 양이 많아질수록 OutOfMemoryError가 발생할 위험이 크다.
또한 코드가 상당히 복잡하고 장황하여 유지보수가 어려울 수 있다.
//XSSF 쓰기 예제
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("Sheet1");
Row row = sheet.createRow(0);
Cell cell = row.createCell(0);
cell.setCellValue("Hello POI");
try (FileOutputStream fileOut = new FileOutputStream("poi_example.xlsx")) {
workbook.write(fileOut);
} finally {
workbook.close();
}
2. Excel Streaming Reader (xlsx-streamer)
Apache POI의 메모리 문제를 해결하기 위해 등장한 확장 라이브러리다. 주로 대용량 엑셀 파일을 읽을 때 사용한다.
특징 및 장점 POI의 편리한 인터페이스를 유지하면서도 데이터를 스트리밍 방식으로 읽어 메모리 점유율을 획기적으로 낮춘다. 임시 파일을 생성하여 데이터를 처리하므로 매우 큰 파일도 안전하게 읽을 수 있다. 기존 POI 코드를 크게 수정하지 않고 적용할 수 있다는 점이 매력적이다.
단점 데이터를 읽는 용도에 최적화되어 있어 쓰기 기능은 POI의 SXSSF를 그대로 사용해야 한다. 또한 임시 파일 관리 설정이 필요할 수 있다.
InputStream is = new FileInputStream(new File("large_file.xlsx"));
Workbook workbook = StreamingReader.builder()
.rowCacheSize(100) // 메모리에 보유할 행 수
.bufferSize(4096) // 버퍼 크기
.open(is); // 스트리밍으로 열기
for (Sheet sheet : workbook) {
for (Row r : sheet) {
for (Cell c : r) {
System.out.println(c.getStringCellValue());
}
}
}
3. EasyExcel
Alibaba에서 개발한 EasyExcel은 POI의 복잡함과 메모리 문제를 동시에 해결하기 위해 설계된 고성능 라이브러리다.
특징 및 장점 가장 큰 특징은 메모리 효율성이다. 파일을 한 줄씩 읽어 처리하기 때문에 수백만 건의 데이터도 적은 메모리로 처리할 수 있다. 또한 어노테이션 기반으로 자바 객체(DTO)와 엑셀 시트를 직접 매핑할 수 있어 코드가 매우 간결해진다. 대규모 엔터프라이즈 환경에서 데이터 배치 처리에 매우 유리하다.
단점 POI에 비해 세부적인 서식 지정이나 복잡한 엑셀 기능 구현에는 제약이 있을 수 있다. 또한 오픈소스 생태계가 특정 기업 위주로 돌아간다는 점이 고려 대상이다.
public class ExcelData {
@ExcelProperty("이름")
private String name;
@ExcelProperty("나이")
private int age;
}
// 데이터 리스트를 파일로 저장
EasyExcel.write("easy_example.xlsx", ExcelData.class)
.sheet("목록")
.doWrite(dataList);
4. FastExcel
FastExcel은 속도와 메모리 절약을 최우선 목표로 하는 가벼운 라이브러리다.
특징 및 장점 매우 빠른 처리 속도를 자랑한다. XML 스트리밍 방식을 사용하여 대용량 데이터를 생성할 때 POI보다 우수한 성능을 보여준다. 의존성이 적어 프로젝트를 가볍게 유지할 수 있다.
단점 기능이 다소 제한적이다. 엑셀의 시각적인 스타일링보다는 데이터 자체를 빠르게 생성하고 읽는 작업에 특화되어 있다.
코드 예제 (스트리밍 쓰기)
try (OutputStream os = new FileOutputStream("fast_example.xlsx")) {
Workbook wb = new Workbook(os, "MyApplication", "1.0");
Worksheet ws = wb.newWorksheet("Sheet 1");
ws.value(0, 0, "Fast Content");
wb.finish();
}
<상세 지표 비교 평가>
라이브러리별 주요 지표를 5점 만점의 별점으로 평가한 결과다.
| 읽기속도 | 쓰기속도 | 메모리 | 효율 | 기능성 | 안정도 | |
| Apache POI | ★☆☆☆☆ | ★☆☆☆☆ | ★☆☆☆☆ | ★★★★★ | ★★★★★ | ★★★★★ |
| Streaming Reader | ★★★★☆ | - | ★★★★☆ | ★★☆☆☆ | ★★★★☆ | ★★★☆☆ |
| EasyExcel | ★★★★★ | ★★★★★ | ★★★★★ | ★★★★☆ | ★★★★☆ | ★★★★☆ |
| FastExcel | ★★★★☆ | ★★★★★ | ★★★★★ | ★★☆☆☆ | ★★★☆☆ | ★★☆☆☆ |
<라이브러리 비교 요약>
| 주요 용도 | 난이도 | 특징 | |
| Apache POI | 복잡한 서식/소량 데이터 | 높음 | 모든 기능 제어 가능, 업계 표준 |
| Streaming Reader | 대용량 읽기 전용 | 보통 | POI 인터페이스 활용, OOM 방지 |
| EasyExcel | 대용량 읽기/쓰기 | 낮음 | 어노테이션 기반, 개발 속도 빠름 |
| FastExcel | 대용량 쓰기 특화 | 낮음 | 속도가 매우 빠름, 가벼운 의존성 |
결론.!!!! 프로젝트의 요구사항이 정교한 리포트 출력과 셀 병합, 복잡한 스타일링이라면 Apache POI가 가장 안전한 선택이다.
하지만 수만 건 이상의 데이터를 처리해야 한다면 EasyExcel이나 Streaming Reader를 사용하는 것이 서버 안정성 측면에서 필수적이다. 단순한 데이터 덤프 목적이라면 FastExcel이 가장 효율적인 대안이 된다. 서비스의 특성과 처리할 데이터의 규모를 먼저 파악한 뒤 적절한 도구를 선택하는 것이 중요하다.
'프로그래밍 > Spring Framework' 카테고리의 다른 글
| [Spring] 스프링 AOP이란? - 적용방법 | 관점지향 프로그래밍 | AOP 어노테이션 (0) | 2022.05.12 |
|---|---|
| [Spring] 의존성 주입, DI (Dependency Injection) 란? (0) | 2020.08.14 |
| [Spring] VO와 DTD의 차이란? (Value Object / Data Transfer Object) (0) | 2020.08.14 |
| [Spring] Mybatis 연동 시 오류 해결방법 (3) | 2020.07.26 |
| [Spring] 스프링 게시판 예제 (3) - DB연동 + View단 출력 (0) | 2020.07.25 |