이 글에는 개인적인 문제 해결과정이 같이 있습니다.
프로젝트를 진행하면서 업체 솔루션 없이 클라이언트에 Excel을 다운로드하는 기능이 필요했습니다. 요구사항은 크게 다음과 같습니다.
- 클라이언트는 요청한 조건에 따라 DB의 SELECT문을 통해 값을 가져와야 합니다.
1 .1. DB는 고객사 DB입니다.
- 요청한 Excel의 Template에 맞춰 데이터가 들어가야 합니다.
2 .1. Template은 정형화 되있습니다.
2 .2. Template은 30가지 이상이며, 유지보수과정에서 증가할 수 있습니다.
- 다운로드 한 파일은 개인정보 및 금융정보가 포함되어 있으므로, 사용자는 다운로드시 암호입력을 필수로 하고, 해당 파일은 설정된 암호를 요구합니다.
Java에서 Excel을 생성할 수 있는 라이브러리를 찾아본 결과, 안정성 측면에서 Apache POI
를 사용하기로 했습니다.
Apache POI
는Apache Software Foundation(아파치 소프트웨어 재단)
에서 운영하는 프로젝트이며 워드, 파워포인트, 엑셀과 같은 Microsoft Office 포맷을 읽고 쓰기위한 Java 라이브러리 입니다. - Wikipedia
Apache POI
는 HSSF
, XSSF
두가지 방식이 있습니다.
HSSF : MS 97~2003을 지원.
XSSF : MS 2007 이상을 지원.
다시 XSSF
는 XSSF
와 향상된 성능의 SXSSF
가 있습니다.
XSSF : 읽기, 쓰기가 가능하지만, 데이터 처리시 Memory Flush가 불가능.
SXSSF : 데이터 처리시 Memory를 flush할 수 있지만, 읽기가 불가능.
위와 같은 이슈가 있기 때문에, 요구사항을 해결하기 위해서 XSSF
, SXSSF
방식을 혼용해서 사용 예정입니다.
저는 Maven
을 사용할 예정입니다.
22.12.07 기준 최신버전을 가져왔습니다.
엑셀 암호화 시 오류가 있어서 구버전을 사용하겠습니다.
https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
웹에서 클라이언트가 Excel 다운로드를 요청한다고 가정해보겠습니다. 웹 화면에 버튼하나를 만들고, 요청을 보내겠습니다.
main.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="http://localhost:8080/download">
<p>
<input type="submit" value="download">
</p>
</form>
</body>
</html>
download 버튼을 누르면 Controller
의 /download
로 요청을 보내서 클라이언트에 Excel 파일을 다운로드 시키겠습니다.
클라이언트의 요청 및 응답을 처리하기위해 HttpServletRequest
와 HttpServletResponse
를 받겠습니다.
ExcelController.java
package com.example.poitest.controller;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import java.io.IOException;
@Controller
public class ExcelController {
@RequestMapping("download")
public void create(HttpServletRequest request, HttpServletResponse response)
throws IOException {
}
}