openlang

이름 조회에 NFC 키를 기본으로 써도 될까요?

자, 이름을 붙여 넣었는데 끝이 e 다음에 U+0301이에요. 다음 주에 같은 이름을 다시 쳤더니 이번엔 키보드가 U+00E9를 넣어 줘요. 저한테는 같은 이름이에요. 캐노니컬 등가이기도 하고요. 그래도 문자열로는 서로 달라요.

그래서 폼에서는 제출한 철자를 그대로 화면에 보여 주고, 조회용으로는 NFC 키를 만들 생각이에요. 화면에는 제가 쓴 철자가 나오고, 조회는 둘 중 어느 쪽으로 썼는지 신경 쓰지 않게 돼요. 대신 표현을 두 개 관리해야 하고, 각 작업이 어느 쪽을 읽는지 분명히 해야 해요. (참고로 TypeScript의 string 표기는 normalize("NFC")가 실행됐는지 알려 주지 않아요. 타입 이름일 뿐이에요.)

아직 확신이 없는 부분도 있어요. 이름이 같게 매칭될 때 서로 다른 계정일 수 있는지는 NFC가 정해 주지 않아요. 그건 제품이 정할 일이에요. 호환 정규화나 대소문자 접기도 또 다른 선택이고, 이 중 어느 것도 생김새만 비슷한 이름을 막지는 못해요.

신원 판단은 다른 곳에서 한다는 전제라면, 표시 이름 조회의 기본값으로 이 정도면 괜찮을까요? 화면은 사람이 쓴 철자를 지키되, 파생된 키 하나가 그 사람이 누구인지 조용히 정해 버리지는 않았으면 해요.

이어지는 대화 3

서로의 근거를 따라
  1. 고유 링크

    나누는 방식엔 동의해요. 조회는 정규화된 키만 받고, 제출된 원문은 그 옆에 같이 들고 가면 돼요.

    그런데 여기서 값이 없다는 건 어떤 뜻인가요? 폼에서 이름을 비워 둘 수 있다면 null은 입력하지 않았다는 뜻이어야 해요. 아직 정규화를 안 했다는 뜻까지 겸하면 안 돼요. 호출자 둘을 보면 차이가 보여요. 저장된 이름 화면은 제출한 그대로의 철자가 필요해요. 검색 호출자는 파생된 키가 필요해요. 두 계정이 같은 키를 가질 수 있다면 검색은 여러 결과를 돌려주거나 다른 식별자를 요구해야 해요. 물음표 없는 Kotlin String은 값이 있다는 것만 약속해요. NFC인지, 누구 이름인지는 말해 주지 않아요.

  2. 고유 링크

    이름을 입력해요. 제출해요. 그 자리에서 normalize("NFC")가 돌고 두 버전이 함께 넘어가요. 그러니 저장된 이름이 '아직 정규화 안 됨' 상태로 머무는 일이 없고, hollis 님의 null도 딱 한 가지 뜻만 지켜요.

    조회가 비동기라면 나중에 나오는 일치 목록은 그 자체로 별개의 결과예요. 이름의 새로운 의미가 아니에요. 그리고 그 목록에 계정이 둘 이상 들어갈 수 있게 되는 순간, 검색 호출자는 소유 확인이 아니라 고르는 화면이 돼요. 계정 식별자가 제값을 하는 건 바로 그때예요.

  3. 고유 링크

    Swift에서 "e\u{301}" == "\u{E9}"는 true인데, 저는 그게 좀 재밌어요. String의 동등성이 정규 등가(canonical equivalence) 기준이고 해시도 그걸 따르기 때문에, [String: Account]는 이미 두 표기를 키 하나로 취급해요. 문제가 해결된 것처럼 들리고, 일부는 실제로 해결돼요.

    그런데 저장된 문자열은 여전히 들어온 그대로고, 그 키가 데이터베이스나 다른 언어로 넘어가는 순간 다시 코드 단위로 비교돼요. 그래서 저는 그래도 NFC 키를 명시적으로 만들어서 원문 옆에 저장할 거예요.

같은 질문의 다른 갈래

  1. NFC 조회 키와 JCS 서명

    kim_dh가 앞서 올린 질문은 제출된 이름과 NFC 조회 키를 나눠서 봤는데, 서명이 끼면 더 복잡해져요. JSON 페이로드의 이름이 e 뒤에 U+0301을 붙인 형태이고, 그 문자열이 JCS 기반 서명에 들어가요. RFC…