티스토리 뷰
1. Apache POI 라이브러리 사용
Apache POI는 엑셀 파일(.xlsx)을 읽고 쓰는 기능을 제공하는 라이브러리로, 엑셀 파일에서 셀 데이터를 읽거나 새로운 셀을 생성하는 등의 작업을 매우 쉽게 처리할 수 있다. 아래는 Gradle을 사용하여 POI 라이브러리를 프로젝트에 추가하는 방법이다.
// POI 라이브러리 추가
implementation 'org.apache.poi:poi-ooxml:5.3.0'
implementation 'org.apache.commons:commons-compress:1.27.1'
이 라이브러리는 엑셀 파일의 다양한 포맷, 스타일을 지원하며, 셀의 데이터 형식을 유연하게 설정할 수 있다.
2. 엑셀 양식 생성
엑셀 파일 생성 과정에서 각 열(Column)의 기본적인 데이터 형식을 설정하는 부분이 중요하다. 특히 전화번호나 날짜 같은 데이터를 처리할 때는 해당 셀의 스타일을 적절히 설정하여 일관성을 유지해야 한다.
public byte[] generateExcelTemplate() {
try (Workbook workbook = new XSSFWorkbook()) {
Sheet sheet = workbook.createSheet("SampleSheet");
sheet.setDefaultColumnWidth(28);
// 첫 번째 행에 헤더 추가
createHeaderRow(sheet, "Name", "Phone", "Birthdate");
// 각 셀 스타일 설정
setCellStyleText(workbook, sheet, 1); // 전화번호를 텍스트로 설정
setCellStyleDate(workbook, sheet, 2); // 날짜를 날짜 형식으로 설정
// 샘플 데이터 추가
String[] sampleData = {"John Doe", "01012345678", "1990-01-01"};
createSampleData(sheet, sampleData);
return convertWorkbookToByteArray(workbook);
} catch (IOException e) {
throw new ApplicationException(ApplicationError.FILE_DOWNLOAD_ERROR);
}
}
위 코드에서는 Apache POI를 이용해 새로운 엑셀 파일을 생성하고, 기본적인 헤더와 샘플 데이터를 추가하는 과정을 보여준다. 이때 각 셀의 스타일을 설정하여 텍스트와 날짜 형식이 적절하게 반영되도록 하였다.
3. 셀 스타일 설정
전화번호와 같은 데이터를 처리할 때는 해당 셀을 문자열 형식으로 지정해야 숫자가 변형되지 않고 그대로 저장된다. 마찬가지로, 날짜는 날짜 형식으로 지정하여 일관된 포맷으로 관리된다.
private void setCellStyleText(Workbook workbook, Sheet sheet, int index) {
XSSFCellStyle style = (XSSFCellStyle) workbook.createCellStyle();
XSSFDataFormat xssfDataFormat = (XSSFDataFormat) workbook.createDataFormat();
style.setDataFormat(xssfDataFormat.getFormat("@"));
sheet.setDefaultColumnStyle(index, style); // 텍스트 형식으로 지정
}
private void setCellStyleDate(Workbook workbook, Sheet sheet, int index) {
XSSFCellStyle style = (XSSFCellStyle) workbook.createCellStyle();
XSSFDataFormat xssfDataFormat = (XSSFDataFormat) workbook.createDataFormat();
style.setDataFormat(xssfDataFormat.getFormat("yyyy-MM-dd"));
sheet.setDefaultColumnStyle(index, style); // 날짜 형식으로 지정
}
4. 엑셀 데이터 처리
업로드된 엑셀 파일에서 데이터를 읽어 들이는 과정은 Apache POI를 사용하여 각 셀의 값을 읽고, 이를 String 형식으로 변환하여 처리한다. 각 셀의 타입을 확인하고, 텍스트, 숫자, 날짜 등의 형식에 따라 처리하는 로직이 필요하다.
private String getCellValue(Cell cell) {
if (cell == null) {
return "";
}
switch (cell.getCellType()) {
case STRING:
return cell.getStringCellValue();
case NUMERIC:
if (DateUtil.isCellDateFormatted(cell)) {
return cell.getDateCellValue().toInstant()
.atZone(ZoneId.systemDefault())
.toLocalDate().toString(); // 날짜 형식 처리
} else {
return String.format("%.0f", cell.getNumericCellValue()); // 숫자 형식 처리
}
case BOOLEAN:
return Boolean.toString(cell.getBooleanCellValue());
case FORMULA:
return cell.getCellFormula();
default:
return "";
}
}
위 메소드는 셀에 저장된 데이터를 확인하고, 문자열, 숫자, 날짜 등 여러 형식으로 변환하여 값을 리턴하는 역할을 한다. 예를 들어, 날짜 형식 셀은 LocalDate로 변환하여 일관된 형식으로 사용할 수 있게 한다.
5. 데이터 검증 로직
엑셀 파일에서 읽어 들인 데이터는 반드시 검증 과정을 거쳐야 한다. 전화번호 형식, 중복 여부, 필수 데이터 확인 등 다양한 검증을 통해 잘못된 데이터가 저장되지 않도록 처리할 수 있다.
private void validatePhone(String phone, boolean exists) {
if (!phone.matches("010\\d{8}")) { // 전화번호 형식 확인
throw new ApplicationException(ApplicationError.INVALID_PHONE_NUMBER);
}
if (exists) { // 중복 여부 확인
throw new ApplicationException(ApplicationError.DUPLICATE_PHONE);
}
}
위 코드에서는 전화번호가 '010'으로 시작하고 총 11자리 숫자인지 확인한 후, 중복된 데이터가 있는지 체크한다. 검증에 실패할 경우 예외를 던져 사용자에게 오류를 알린다.
6. 엑셀 파일을 바이트 배열로 변환
엑셀 파일을 HTTP 응답으로 보내기 위해서는 바이트 배열로 변환해야 한다. 이 과정은 ByteArrayOutputStream을 이용하여 엑셀 파일을 메모리로 쓰고, 이를 바이트 배열로 변환하는 방식으로 처리된다.
private byte[] convertWorkbookToByteArray(Workbook workbook) throws IOException {
try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
workbook.write(outputStream);
return outputStream.toByteArray(); // 바이트 배열로 변환
}
}
위 메소드를 통해 생성된 엑셀 파일을 다운로드 시에 사용할 수 있는 형식으로 변환하여 반환한다.
'Spring' 카테고리의 다른 글
프로젝트에서 사용한 주요 JPA : Entity, Mapping, 논리적 삭제 (0) | 2024.09.30 |
---|---|
예외 처리와 로깅 설정 (0) | 2024.09.30 |
데이터 접근 1. JdbcTemplate (0) | 2024.07.10 |
API 예외처리 (0) | 2024.07.01 |
Spring MVC (0) | 2024.06.28 |