반응형
문제 상황은 이렇습니다.
파일 업로드 기능을 구현했을 때, 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에서도 한글 파일명이 자음과 모음이 분리되지 않고 정상적으로 처리될 수 있었습니다.
- 운영 체제 간 인코딩 차이의 이해: MacOS와 Windows는 내부적으로 다른 문자 인코딩 방식을 사용합니다. 이 차이를 이해하고 해결책을 모색하는 것이 중요합니다.
- NFC 변환의 중요성: 파일명을 NFC 형식으로 명시적으로 변환하는 것은 MacOS와 Windows 간의 인코딩 문제를 해결하는 효과적인 방법입니다.
반응형
'IT > Java' 카테고리의 다른 글
성능 저하 및 Full GC - e.printStackTrace()를 피해야 하는 이유 (0) | 2024.02.28 |
---|---|
Try-With-Resources 개념, 자원 자동해제 처리, AutoCloseable 알아보기 (0) | 2024.02.28 |
Effective Java: 생성자에 많은 매개변수가 필요할 때: 빌더 패턴 고려하기 (0) | 2024.01.24 |
Spring에서 CORS 설정하기 (0) | 2024.01.23 |
Effective java: 생성자 대신 정적 팩터리 메서드 요약 (0) | 2024.01.23 |