
엑셀 파일 다운로드 기능을 구현하다가 두 가지 주요 문제에 직면했습니다.
첫째는 파일 이름에 이중 확장자 .xls.xls가 붙는 문제였고,
둘째는 날짜 포맷이 일관되지 않아 발생하는 문제였습니다.
이 포스팅에서는 이 두 가지 문제를 해결하는 방법과 과정에 대해 자세히 설명하겠습니다.
문제 발생 원인: 파일 다운로드 시 filename 매개변수에 .xls 확장자를 붙이려 했으나,
fileName에 이미 .xls가 포함된 경우 .xls.xls.xls와 같은 잘못된 확장자가 생성되었습니다.
이는 파일 이름을 생성할 때 기본적으로 .xls 확장자를 붙이기 때문입니다.
AbstractExcelView 클래스의 buildExcelDocument 메서드를 수정하여 파일 이름에 이미
.xls가 포함된 경우 이를 중복해서 추가하지 않도록 합니다.
파일 이름에 .xls 확장자가 포함되지 않으면 이를 추가하도록 로직을 수정합니다.
val fileName = (model["fileName"] as String?) ?: "${title}_${LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))}.xls"
기존 코드에서는 fileName에 .xls를 단순히 추가했지만, 수정된 코드는 이미
.xls가 포함된 경우 중복되지 않도록 조건을 추가했습니다.
val fileName = (model["fileName"] as String?)?.let {
if (it.endsWith(".xls")) it else "$it.xls"
} ?: "${title}_${LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))}.xls"
파일 이름 처리 로직을 개선함으로써, 사용자에게 정확한 파일 이름을 제공할 수 있었습니다.
또한, 파일 이름의 일관성을 유지할 수 있어, 사용자의 혼란을 줄일 수 있었습니다.
날짜를 파싱하고 포맷팅할 때 다양한 형식을 처리해야 했습니다. 입력된 날짜가 여러 형식 중 하나로 주어질 수 있으며, 이를 처리하지 않으면 잘못된 날짜가 생성될 수 있습니다.
다양한 날짜 형식을 처리할 수 있도록 parseDate 메서드를 수정했습니다.
날짜와 날짜-시간 형식을 모두 지원하도록 여러 DateTimeFormatter를 사용했습니다.
날짜 파싱 관련 코드가 없거나 단일 포맷만 지원
private fun parseDate(dateStr: String): String {
val localDateFormats = listOf(
DateTimeFormatter.ofPattern("yyyyMMdd"), // "20240801"
DateTimeFormatter.ofPattern("yyyy-MM-dd") // "2024-08-01"
)
val localDateTimeFormats = listOf(
DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss"), // "2024-08-01T19:29:54"
DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSXXX") // "2024-08-01T19:29:54.082+09:00"
)
for (format in localDateFormats) {
try {
val date = LocalDate.parse(dateStr, format)
return date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))
} catch (e: DateTimeParseException) {
// Continue to next format
}
}
for (format in localDateTimeFormats) {
try {
val dateTime = LocalDateTime.parse(dateStr, format)
return dateTime.toLocalDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))
} catch (e: DateTimeParseException) {
// Continue to next format
}
}
logger.warn("Date parsing failed for value: $dateStr")
return "Invalid Date"
}
다양한 날짜 포맷을 지원함으로써, 사용자로부터 입력되는 다양한 형식의 날짜를
처리할 수 있었습니다.
이로 인해 애플리케이션의 유연성이 높아졌습니다.
Excel 파일 다운로드 관련 문제를 해결하는 과정에서,
파일 확장자와 날짜 포맷 처리의 중요성을 다시 한 번 느꼈습니다.
작은 코드 수정이지만, 사용자 경험과 데이터의 정확성을 크게 향상시킬 수 있었습니다.
이러한 문제를 미리 예상하고, 다양한 케이스를 고려하는 것이 중요하다는 교훈을 얻었습니다.