IT/Java

스프링 부트: 윈도우와 맥에서 한글 파일명 다운로드 문제 해결하기(2)

Dev. Sean 2024. 1. 25. 09:39
반응형

문제 상황은 이렇습니다.

파일 업로드 기능을 구현했을 때, MacOS에서는 한글 파일명이 정상적으로 데이터베이스에 저장되었지만, Windows에서는 한글 파일명이 자음과 모음이 분리되어 저장되는 현상이 발생했습니다.

이는 운영 체제 간 문자 인코딩 처리 방식의 차이 때문에 발생하는 일반적인 문제였습니다.

 

 

 

처음 시도한 해결책은 다음과 같은 방식이었습니다:

 

try {
    // 파일 데이터 조회
    ResponseFile list = fileService.getFile(attachId, fileId);
    ...
    // 파일명 UTF-8 인코딩 후, ISO-8859-1로 재인코딩
    String encodedFileName = new String(list.getOriginalName().getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1);
    ...
}

 

이 방법은 UTF-8 인코딩된 파일명을 ISO-8859-1로 재인코딩하는 것이었습니다.

그러나 이 접근법으로는 문제가 해결되지 않았습니다.

더욱이, 데이터베이스에 한글 파일명이 자음과 모음이 분리되어 저장되는 현상을 발견했습니다.

 

그 후, 다음과 같은 새로운 방법을 시도했습니다:

 

public RequestFile uploadFile(final MultipartFile multipartFile) {
    ...
    // 파일 이름을 NFC 형식으로 변환
    String originalNameNFC = Normalizer.normalize(multipartFile.getOriginalFilename(), Normalizer.Form.NFC);
    ...
}

 

이 방법에서 핵심은 파일명을 NFC(Normalization Form Canonical Composition) 형식으로 변환하는 것이었습니다.

NFC는 문자를 조합형으로 표현하는 방식으로, MacOS와 Windows 간의 인코딩 차이를 해결하는 데 매우 효과적이었습니다.

이를 통해 Windows에서도 한글 파일명이 자음과 모음이 분리되지 않고 정상적으로 처리될 수 있었습니다.

  1. 운영 체제 간 인코딩 차이의 이해: MacOS와 Windows는 내부적으로 다른 문자 인코딩 방식을 사용합니다. 이 차이를 이해하고 해결책을 모색하는 것이 중요합니다.
  2. NFC 변환의 중요성: 파일명을 NFC 형식으로 명시적으로 변환하는 것은 MacOS와 Windows 간의 인코딩 문제를 해결하는 효과적인 방법입니다.

 

반응형