DevJong12

[이슈] 파일 업로드시 OriginalFilename에 대한 고찰 본문

Java,Spring/Java

[이슈] 파일 업로드시 OriginalFilename에 대한 고찰

Jong12 2024. 1. 27. 17:06
728x90

목차

     

    1️⃣ 개요

    파일의 명칭에 대해서, 내가 간단하게 개발을 진행할 때 OriginalFileName에 대해서 저장을 하지 않았었다. 

    많은 웹사이트를 쓰면서 원본 파일명을 다시 돌려받은 경우가 거의 없다 보니, 신경을 쓰지 않았었으나 이와 관련되어 문제가 발생하여서 기록을 남겨보게 되었다.

     

    환경은 JDK 17, Spring 3.2.0을 사용하였다.


    2️⃣ 이슈내용

    Window나 Mac에서 파일을 업로드를 하게 될 경우 들어오는 Multipart의 경우에는 별다른 문제없이 OriginalFileName이 기록이 되었으나, 이걸 DataBase에서 Query를 통해 OriginalFileName이 들어가있는 Column을 Like문으로 검색을 할 때 검색이 되지 않는 문제가 발생하였으며, 검색이 되지 않는 파일들은 모두 한글이라는게 공통점이었다.

     

    아래의 이미지는 발생 증상이다. 두번째와 세번째는 쿼리가 같아보일 수 있으나, 유니코드의 타입이 다른 쿼리이다.


    3️⃣ 이슈 발생 코드

    아래와 같이 이루어져 있으며, OriginalFileName을 넣을때 getAttach의 getOriginalFilename()을 사용해서 파일명을 넣는 것을 확인 할 수 있다.

     

    불필요해 보일 수 있는 Annotation은 모두 제거를 하였다.


    4️⃣ 발생 원인 및 해결방법

    유니코드에는 크게 NFC와 NFD가 존재하며, 운영체제마다 서로 다른 게 원인으로 판단되었으며, 해당 포스트에서 유니코드나 NFC, NFD까지 다루지는 않을 것이기 때문에  더 알아보고 싶은 경우에는 따로 검색하는 것을 권장한다.

    • NFC : Window와 Linux계열에서 사용
    • NFD : Mac에서 주로 사용

    추가적으로, Mac에서 Window로 파일을 이동하는 등 할때 문자열이 분리가 되는 이유도 이 유니코드가 다르기 때문이었다.

     

     

    해결방안으로는 OriginalFileName을 NFC로 변환한 이후에 변환된 문자열을 DB에 삽입해 주면 된다.


    5️⃣ 해결된 코드

    Entity나 DTO, Data등의 클래스는 무의미하기 때문에, ServiceLayer만 업로드를 한다.

     

    OriginalFileName을 업로드 할 때 Normalizer로 감싼뒤, NFC로 변환을 하고 업로드를 하도록 하면된다.


    6️⃣ 해결된 결과물

    이슈내용과 동일한 쿼리이며, 두번째가 직접 입력한 문구이고 세먼째 쿼리가 NFC로 이뤄진 문자열의 쿼리이다.

    Like문이 정상적으로 실행되는 걸 볼 수 있다.


    7️⃣ 글을 마치며

    원본 파일명을 검색할 수 있는 기능을 만들어 달라는 요청을 받다보니 처음 생각해보게 된 문제였는데, 쿼리가 제대로 실행이 안될때 매우 당황했었다..

    그래도 나름 재밌었던 부분이었다. 코드는 아래의 Repository에서 확인이 가능하다.

     

    https://github.com/donsonioc2010/sample-spring-project

     

    GitHub - donsonioc2010/sample-spring-project: 기능구현만 하는 스프링 프로젝트

    기능구현만 하는 스프링 프로젝트. Contribute to donsonioc2010/sample-spring-project development by creating an account on GitHub.

    github.com

     

    728x90
    Comments