Excel(XLSX) 구조와 순수 JDK로 읽기/쓰기
Excel(XLSX) 구조와 순수 JDK 로 읽기/쓰기
XLSX 파일이 "zip 안에 든 XML 묶음"이라는 사실을 직접 해부해서 확인하고, 외부 라이브러리 없이 JDK 의
ZipOutputStream과 StAX(XMLStreamReader)만으로 10만 행 다운로드 파일을 메모리 걱정 없이 만들고, 사용자가 올린 엑셀을 행 단위로 스트리밍 파싱해 검증하는 코드를 작성할 수 있게 됩니다.
1. 왜 배우는가
실무에서 엑셀 기능은 대부분 Apache POI 로 구현합니다. 그런데 왜 순수 JDK 로 먼저 해 보는가. 이유는 세 가지입니다.
첫째, POI 의 함정은 전부 XLSX 구조에서 나옵니다. 날짜가 45908.0 으로 읽히는 이유, 숫자 문자열과 숫자 셀이 다른 이유, 셀 스타일이 64,000 개 한계를 가진 이유, SXSSFWorkbook 이 되돌아갈 수 없는 이유. 이것들은 POI 의 버그가 아니라 XLSX 파일 형식 자체의 성질입니다. sheet1.xml 을 한 번 눈으로 보면 이 모든 것이 한 줄로 설명됩니다.
둘째, 폐쇄망에서는 jar 하나가 곧 반입 절차입니다. POI 는 의존 jar 가 10개가 넘고 용량이 15MB 를 넘습니다. "CSV 대신 엑셀로 내려주기만 하면 되는" 배치나 관리 도구에서는 순수 JDK 200줄이 반입 신청서보다 빠릅니다. JDK 에는 zip 과 XML 파서가 이미 들어 있습니다.
셋째, 스트리밍의 원리를 몸으로 익힙니다. 행을 쓰는 즉시 zip 엔트리로 흘려 보내면 100만 행이어도 힙은 일정합니다. 반대로 읽을 때 StAX 로 행 하나씩 콜백하면 힙에는 행 하나만 삽니다. 배치 레슨에서 배운 청크 처리와 같은 원리를 파일 형식 수준에서 다시 보는 것입니다.
이 레슨의 코드는 java-src/extension/01_excel_pure_jdk 에 있고, 만든 파일은 실제 Excel 과 LibreOffice 에서 열립니다. 다음 레슨(02 POI)은 같은 요구사항을 POI 로 다시 구현하므로, 두 레슨을 비교하면 "라이브러리가 대신 해 주는 일"이 무엇인지 정확히 보입니다.