구인사이트만들기: 엑셀 파일 다운로드 확장자 문제 및 날짜 처리 개선하기

궁금하면 500원·2024년 7월 28일

미생의 개발 이야기

목록 보기
11/60

엑셀 파일 다운로드 시 확장자 및 날짜 포맷 문제 해결하기

엑셀 파일 다운로드 기능을 구현하다가 두 가지 주요 문제에 직면했습니다.
첫째는 파일 이름에 이중 확장자 .xls.xls가 붙는 문제였고,
둘째는 날짜 포맷이 일관되지 않아 발생하는 문제였습니다.
이 포스팅에서는 이 두 가지 문제를 해결하는 방법과 과정에 대해 자세히 설명하겠습니다.

문제 1: 이중 파일 확장자 문제

문제 발생 원인: 파일 다운로드 시 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"

느낀 점

파일 이름 처리 로직을 개선함으로써, 사용자에게 정확한 파일 이름을 제공할 수 있었습니다.
또한, 파일 이름의 일관성을 유지할 수 있어, 사용자의 혼란을 줄일 수 있었습니다.

문제 2: 날짜 포맷 일관성 문제

문제 발생 원인

날짜를 파싱하고 포맷팅할 때 다양한 형식을 처리해야 했습니다. 입력된 날짜가 여러 형식 중 하나로 주어질 수 있으며, 이를 처리하지 않으면 잘못된 날짜가 생성될 수 있습니다.

해결 방법

다양한 날짜 형식을 처리할 수 있도록 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 파일 다운로드 관련 문제를 해결하는 과정에서,
파일 확장자와 날짜 포맷 처리의 중요성을 다시 한 번 느꼈습니다.
작은 코드 수정이지만, 사용자 경험과 데이터의 정확성을 크게 향상시킬 수 있었습니다.
이러한 문제를 미리 예상하고, 다양한 케이스를 고려하는 것이 중요하다는 교훈을 얻었습니다.

profile
에러가 나도 괜찮아 — 그건 내가 배우고 있다는 증거야.

0개의 댓글