[Springboot] Spring 엑셀 읽기/쓰기 라이브러리 별 비교 - Apache POI, EasyExcel, FastExcel 비교 :: 매운코딩
300x250

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이 가장 효율적인 대안이 된다. 서비스의 특성과 처리할 데이터의 규모를 먼저 파악한 뒤 적절한 도구를 선택하는 것이 중요하다.

728x90
728x90

+ Recent posts