IOS에서 올려주는 NFD 방식을 NFC로 마이그레이션하기 with. PostgreSQL, Java, Kotlin
개요
간단한 검색 기능을 넣어놨는데... iOS에서 올린 데이터가 검색이 안된다는 이슈가 올라왔다. 그래서 DB를 뒤적거려보니... 아래와 같이 저장되어 있었다.
사실 처음부터 데이터가 이렇게 저장되고 있다는건 알고 있긴했다. 그런데, 문자열 기반 검색이 아닌 단순 조회에서는 신기하게 제대로 출력되서 큰 걱정은 안하고 있었다. 그런데 문자열 기반 검색이 안되기 때문에 조치가 필요했다.
가장 쉬운 방법은 쿼리에서 데이터 마이그레이션을 하고, 클라이언트에서 NFC 방식으로 업로드하는 것을 유도하는 것이다. 그런데, 클라이언트가 바로 패치를 못하는 경우가 있다. 이 때는 서버에서 단독으로 조치를 해줘야한다. 해결 방법을 하나씩 알아보자.
1. PostgresSQL에서 NFD방식을 NFC로 마이그레이션하기
특정 버전 이상의 PostgresSQL에서 normalize 함수를 제공해주기 때문에 쉽게 처리할 수 있다.
UPDATE example_table
SET name = normalize(name, NFC)
WHERE name != normalize(name, NFC);
https://www.postgresql.org/docs/current/functions-string.html에서 normalize를 검색해보면 유니코드 normalize 방식이 작성되어 있다.
2. 서비스 로직에서 NFC 방식으로 변경
여기서 PostgresSQL 13버전 이하를 쓰고 있다면 normalize를 함수를 사용할 수 없다. 그렇다면 서비스 로직에서 해결해야하는데 다음과 같이 해결할 수 있다. 역시 간단하다.
val normalizedName = Normalizer.normalize(originalName, Normalizer.Form.NFC)
위와 같이 NFC 방식으로 변환하는 java.text.Normalizer 클래스가 있다. java/kotlin에서는 그냥 이렇게 변경해서 사용하면 된다.
마치며
나는 처음 겪는 문제였는데, 오래전부터 iOS 유저들이 겪었던 문제였나보다.. NFD NFC를 검색해보면 구글 디벨로퍼 사이트에 올라온 글이 가장 먼저 뜬다.
이전 회사에서도 클라이언트 중에 iOS가 있었는데 서버에서 별다른 조치를 취하지 않았었다. 그땐 클라이언트 쪽에서 잘 처리했었던 것 같다.