스프링프레임워크에서 POI로 대량 엑셀 파일 쉽게 다운로드하기



스프링프레임워크에서 POI로 대량 엑셀 파일 쉽게 다운로드하기

제가 직접 경험해 본 바에 따르면, 스프링프레임워크와 Apache POI를 이용한 대용량 엑셀 다운로드 방법에 대해 상세히 알려드립니다. 엑셀 파일로 데이터를 다운로드해야 하는 상황은 잦지만, 수십만 건에 달하는 대량의 데이터를 다루는 건 꽤나 까다로운 문제입니다. 여기에서는 이러한 문제를 해결하기 위한 접근 방법을 소개할게요. 여러분께도 많은 도움이 되리라 믿어요.

대용량 엑셀 다운로드의 주요 고려사항

대용량 엑셀 파일을 다운로드할 때는 여러 가지를 고려해야 해요. 직접 경험해 본 결과로는 다음과 같은 요소들을 주의 깊게 살펴봐야 해요.

 

👉 ✅ 상세정보 바로 확인 👈

 



  1. 엑셀 파일 포맷의 한계

대량의 데이터를 다룰 때, Excel 파일의 포맷은 상당히 중요해요. 보통 xls와 xlsx 두 가지가 많이 쓰이는데, 각각의 행 수 제한이 다릅니다.

  • xls: 최대 65,535행
  • xlsx: 최대 1,048,576행

따라서 데이터 양에 따라 적절한 포맷을 선택해야 해요. 어떤 포맷을 사용할지 고민되시나요?

2. 메모리 관리

엑셀 파일을 생성할 때 메모리에서 작업이 이루어지므로, 대량의 데이터를 한 번에 처리하게 되면 메모리 부족 상황에 직면할 수 있어요. 이를 방지하기 위해서 몇 가지 전략을 사용해야 할 필요성이 있어요. 메모리 관리가 정말 아쉬운 부분이었던 적도 많지 않나요?

3. 진행 상황 표시

엑셀 파일 다운로드 시 사용자가 얼마나 기다려야 하는지 알 수 없어 불편할 때가 많아요. 이때 jQuery UI를 사용하여 진행상황을 표시하면 사용자 경험이 향상됩니다. 사용자에게 좋은 경험을 주지 못했다면 정말 아쉬웠겠죠?

4. 라이브러리 사용

Apache POI 라이브러리의 SXSSFWorkbook은 메모리를 절약하면서도 대량의 데이터를 다룰 수 있도록 도와주어요. 하지만 사용 방법에 따라 여러 가지 제한 사항이 있으니 업데이트된 문서와 예제를 참고해야 해요.

스프링과 MyBatis를 활용한 구현 소개

스프링 프레임워크와 MyBatis 환경에서 대용량 엑셀 다운로드를 구현하는 방법을 설명할게요. 제가 직접 해본 경험에 기반하여 설명 드리니, 한 번 읽어보세요.

1. POI 라이브러리 의존성 추가

POI 라이브러리를 사용하기 위해서는 Maven의 pom.xml 파일에 의존성을 추가해야 해요. 아래와 같이 추가하면 됩니다.

xml
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.16</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.16</version>
</dependency>

2. MyBatis SQL 매핑 설정

다음으로 MyBatis를 통해 데이터베이스로부터 데이터를 조회할 때, fetchSize를 설정하여 메모리 관리를 신경 써야 해요. 이를 통해 한 번에 100행씩 데이터를 가져올 수 있도록 할 수 있는데요, 아래 코드처럼 설정해주세요.

xml
<select id="selectExcelList" fetchSize="100" resultType="boardVO">
SELECT NUM
, NAME
, TITLE
, CONTENT
, READ_COUNT
, WRITE_DATE
FROM TB_BOARD
WHERE TITLE LIKE '%'||#{word}||'%'
ORDER BY NUM DESC
</select>

3. 클라이언트 측 코드 작성

jQuery UI와 File Download 플러그인을 활용하여 사용자에게 진행 상황을 보여줄 수 있어요. 아래 코드를 참고해 주세요.

“`html

$(function() {
$(“#btn-excel”).on(“click”, function () {
var $preparingFileModal = $(“#preparing-file-modal”);
$preparingFileModal.dialog({ modal: true });
$(“#progressbar”).progressbar({value: false});
$.fileDownload(“/download/excel.do”, {
successCallback: function (url) {
$preparingFileModal.dialog(‘close’);
},
failCallback: function (responseHtml, url) {
$preparingFileModal.dialog(‘close’);
$(“#error-modal”).dialog({ modal: true });
}
});
return false;
});
});

“`

4. 엑셀 파일 생성 및 다운로드 제공

엑셀 파일 생성 과정에서 SXSSFWorkbook을 활용해야 합니다. 아래 코드 조각은 이 과정을 보여줘요.

“`java
@Autowired
private SqlSessionFactory sqlSessionFactory;

@Override
@Transactional
public void selectExcelList(HttpServletResponse response) {
try (SqlSession sqlSession = sqlSessionFactory.openSession();
SXSSFWorkbook wb = new SXSSFWorkbook(100)) {
Sheet sheet = wb.createSheet();

    sqlSession.select("selectExcelList", "게시물", new ResultHandler<BoardVO>() {
        @Override
        public void handleResult(ResultContext<? extends BoardVO> context) {
            BoardVO vo = context.getResultObject();
            Row row = sheet.createRow(context.getResultCount() - 1);
            row.createCell(0).setCellValue(vo.getNum().toString());
            row.createCell(1).setCellValue(vo.getTitle());
            row.createCell(2).setCellValue(vo.getContent());
        }
    });

    response.setHeader("Content-Disposition", "attachment; filename=\"data.xlsx\"");
    wb.write(response.getOutputStream());
} catch(Exception e) {
    // Error Handling
}

}
“`
이렇게 하면 엑셀 파일을 생성할 수 있답니다.

자주 묻는 질문 (FAQ)

대량의 엑셀 파일을 다운로드할 때 어떤 포맷을 선택해야 하나요?

xsl은 65,535행, xlsx는 1,048,576행까지 지원하니 데이터 양에 따라 결정하세요.

POI 라이브러리의 SXSSFWorkbook에 대해 좀 더 알고 싶어요.

SXSSFWorkbook은 메모리 사용량을 크게 줄일 수 있어요. 메모리에 최대 몇 행까지만 유지하고 나머지는 디스크에 저장됩니다.

대량 데이터를 처리하는 동안 메모리 부족이 발생했어요. 어떤 대책이 있을까요?

fetchSize를 적절히 설정하여 한 번에 불러오는 데이터 양을 줄이세요.

사용자 경험을 어떻게 개선할 수 있나요?

jQuery UI를 이용해 진행 상황을 표시하면 사용자에게 더 나은 경험을 제공할 수 있어요.

여기까지 정리해봤어요. 실제로 대량의 데이터를 엑셀로 다운로드할 때 고려해야 할 사항과 방법을 상세하게 설명했답니다. 이런 방식으로 구현하면 사용자가 보다 더 쉽게 데이터 다운로드를 할 수 있을 거예요.

태그: 스프링프레임워크, POI, 대량 엑셀 다운로드, MyBatis, SXSSFWorkbook, 데이터베이스, 엑셀 생성, 파일 다운로드, 사용자 경험, 메모리 관리, jQuery UI