openlang

한 글자 제한, UTF-16 길이일까 문자소 개수일까

코드 어시스턴트가 레이블 필드의 text.length <= 1을 그래핌 개수 검사로 바꿨는데, 이게 버그를 고친 건지 요구 사항을 슬쩍 바꾼 건지 모르겠어요.

제공된 실행 결과는 Node v24.18.0, ICU 78.3, Unicode 17.0 환경이에요. A, é, 🇰🇷의 UTF16 개수는 각각 1, 2, 4이고, 그래핌 개수는 셋 다 1이에요. 그러니 예전 단위 검사는 A만 통과시키고 새 검사는 셋 다 통과시켜요. 입력 세 개를 런타임 하나에서 본 결과라서 Unicode18 적합성까지 읽어 내지는 않을게요.

string 타입 표기가 세는 규칙을 대신 골라 주지는 않아요. 테스트는 UTF16 저장 단위로 제한할지, 사용자가 보는 그래핌으로 제한할지 정해야 하고, 레이블 필드 문구도 고른 쪽에 맞아야 해요. 지금은 예전 코드도 새 코드도 원래 의도가 뭐였는지 알려 주지 않네요.

이어지는 대화 2

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

    어느 쪽이든 테스트에 고정점이 하나 생깁니다. 규칙이 UTF16 단위를 제한한다면 é는 이 한 단위 검사에서 계속 실패해야 합니다. 그래핌을 제한한다면 é는 통과해야 합니다. 입력은 하나인데 기대 결과는 두 가지이니, 테스트는 그중 하나로 정해야 합니다.

  2. 고유 링크

    자, 도움말에는 “한 글자”라고 적혀 있어요. 여기에 é를 붙여 넣고 제출했더니 너무 길대요. 제공된 결과를 보면 단위 검사가 왜 그렇게 판단했는지는 알겠어요. 근데 그 메시지가 제품이 한 약속에 맞는지는 실행 결과로는 알 수 없잖아요.

    문구랑 규칙은 같이 정해요. 제한이 사용자가 보는 글자 기준이라면 어떤 그래핌 분할 규칙을 쓰는지 적어 두고, 테스트는 예시 세 개가 모두 통과하는 쪽으로 기대해야 해요. 기본 그래핌 분할도 언어나 맥락에 따라 조정될 수 있으니까 “사람 눈에 보이는 것”을 어떻게 해석했는지도 밝혀야 하고요. 사실은 저장 공간 제한이라면 도움말에 그냥 저장 공간이라고 쓰면 돼요.

    덧붙이자면, 제출된 상태에 개수와 단위를 같이 실어 두면 오류 분기에서 실제로 돌아간 검사를 그대로 설명할 수 있어요. TypeScript로 그 상태에 이름을 붙이면 UI가 결정을 따라가기 쉬워져요. 다만 텍스트를 검증해 주지도, 맞는 결정을 골라 주지도 않아요.