EEltaCrew
홈 › 블로그

TV 페어링 코드 창에서 사용자가 떠난 이유: 6자리 코드와 한글 자판

게시 2026-10-06실측 기준 2026-10-05읽는 시간 약 4분elta · EltaCrew

TV 리모컨 앱의 페어링 오류를 고친 뒤 오히려 「코드 입력 창에서 취소」가 9% 에서 19% 로 늘었습니다. GA4 실패 사유를 열어 보고, 코드 입력칸 하나가 한글 자판으로 열리던 것을 찾은 과정과 고친 방법을 정리합니다.

고쳤더니 다른 숫자가 올랐다

안드로이드 TV·셋톱박스를 Wi-Fi 로 조작하는 리모컨 앱을 운영하고 있습니다. 처음 붙을 때 TV 화면에 6자리 코드가 뜨고, 휴대폰에 그 코드를 넣어야 짝이 맺어집니다.

10월 2일 1.2.17 에서 「페어링이 필요한 TV 를 연결 실패로 판정하던」 버그를 고쳤습니다. 효과는 바로 보였습니다. GA4 에서 연결을 시도한 사용자 가운데 connect_error 로 끝난 비율이 U+TV 앱 기준 38% 에서 7% 로 내려갔습니다(게시 전 7일 vs 게시 후 3일, 아직 업데이트 안 한 사용자 섞임).

그런데 같은 표에서 code_cancel, 즉 코드 입력 창에서 취소하고 나간 비율이 9% 에서 19% 로 올라 있었습니다.

숫자부터 해석

두 숫자는 연결돼 있습니다. 예전엔 코드 창까지 가지도 못하고 연결 실패로 끝나던 사람들이, 버그가 고쳐지자 이제 코드 창까지 옵니다. connect_error 가 31%p 줄고 code_cancel 이 10%p 늘었으니, 새로 코드 창에 온 사람 셋 중 하나쯤이 거기서 그만둔 셈입니다.

그러니 질문은 「코드 창에서 왜 막히나」 였습니다.

코드는 6자리 16진수

이 앱은 페어링 때 코드 길이를 6으로 요청합니다. 우리가 확인한 기기(크롬캐스트)에서 코드는 4A2F1C 같은 16진수였습니다. 한 자리가 숫자일 확률은 10/16 이라서, 여섯 자리가 전부 숫자일 확률은 (10/16)^6 ≈ 6% 입니다. 코드의 약 94% 에 A~F 영문자가 하나 이상 섞여 있습니다.

코드 입력칸은 이렇게 돼 있었습니다.

<EditText
    android:inputType="textCapCharacters|textNoSuggestions" />

일반 글자 입력칸입니다. 이 경우 키보드는 사용자가 마지막에 쓰던 언어로 열립니다. 같은 문제를 10월 2일 다른 앱(새로 만든 TV 리모컨 앱)에서 먼저 지적받았습니다. 「6자리 입력 화면에 키보드가 한글로 뜬다」 는 것이었습니다. 한국 사용자는 대부분 마지막 언어가 한글이라, TV 에 뜬 A 를 누르면 칸에는 ㅁ 이 들어갑니다. 언어 전환 키를 찾지 못하면 코드를 끝까지 넣을 방법이 없습니다.

새 앱은 그날 고쳤는데, 같은 화면을 가진 기존 리모컨 앱 4개에는 옮기지 않은 상태였습니다.

고친 것 세 가지

1. 영문 자판으로 열기

<EditText
    android:inputType="textVisiblePassword|textCapCharacters|textNoSuggestions" />

비밀번호 계열 입력칸은 키보드가 영문 자판으로 여는 경우가 많습니다. visiblePassword 라 글자는 가려지지 않습니다. 다만 이것이 모든 키보드에서 영문으로 열리는지는 아직 실기기로 다 확인하지 못했습니다.

2. 그래도 한글이 들어오면 같은 자리 영문으로 읽기

두벌식 자판에서 ㅁ 은 A 자리, ㅊ 은 C 자리입니다. 그래서 입력칸에 한글이 들어오면 같은 키의 영문으로 바꿔서 칸에 보여 주고 그 값으로 확인합니다. 한글은 자모가 합쳐져 음절이 되므로(C + B = 츄) 음절은 초성·중성·종성으로 풀어서 바꿉니다.

// 츄 → ㅊ + ㅠ → c + b
int v = c - 0xAC00;
int cho = v / (21 * 28), jung = (v % (21 * 28)) / 28, jong = v % 28;

천지인 같은 다른 배열에서는 맞지 않지만, 그때는 「코드가 맞지 않습니다」 로 다시 입력받을 뿐이라 지금보다 나빠지지 않습니다.

3. 「TV 에 코드가 안 보여요 · 코드 다시 띄우기」 버튼

코드가 TV 에 아예 안 보이는 경우도 있습니다. TV 가 다른 외부입력에 가 있으면 셋톱 화면의 코드를 볼 수 없습니다. 예전엔 이때 할 수 있는 게 취소뿐이었습니다. 이제는 버튼 하나로 페어링 세션을 새로 열어 코드를 다시 띄웁니다.

다음에 볼 숫자

이번 수정과 함께 취소할 때 어디까지 입력했는지를 기록하도록 했습니다.

값 뜻
empty 한 글자도 안 넣고 취소 — 코드가 안 보였거나 몰랐음
partial 몇 글자 넣다 취소 — 입력이 막혔을 가능성
full 다 넣고 취소
after_wrong 틀린 코드 안내를 본 뒤 취소
again 코드 다시 띄우기

1.2.18 은 10월 6일에 올렸습니다. 일주일 뒤 이 값으로 「자판 문제였는지, 코드가 안 보이는 문제였는지」 를 나눠 보고 이어서 적겠습니다.

정리

이 글에 나온 앱은 U+TV 리모컨(Google Play) 입니다.

AndroidEditText키보드GA4TV 리모컨

함께 읽기

dispatchDetachedFromWindow NullPointerException: 스택에 내 코드가 없는 안드로이드 크래시 추적기스택 트레이스에 프레임워크 코드만 찍히는 NullPointerException 을 MdViewer 에서 만났습니다. onDetachedFromWindow 안에서 형제 뷰를 뗀 한 줄이 원인이었고, 부모 ViewGroup 이 자식 배열을 도는 방식 때문에 생긴 문제였습니다. 재현, 원인, 고친 방법을 정리합니다.안드로이드에서 .md 파일 여는 법: AI 가 준 마크다운이 기호 범벅으로 보일 때ChatGPT·Claude·Codex 가 만들어 준 .md 파일, 옵시디언 노트, 깃허브 README 를 폰에서 열면 #·*·| 가 그대로 보입니다. 마크다운을 폰에서 제대로 읽는 방법과, 표·체크리스트·수식이 깨지는 이유, 직접 뷰어를 만들며 확인한 점을 씁니다.R8 을 켜고 빌드는 통과했는데 앱이 깨졌다: 15개 앱에서 실제로 걸린 런타임 함정 5가지Play 의 2027년 코드 최적화 요건에 맞춰 앱 15개에 R8 을 켰습니다. 빌드는 전부 통과했지만 7개 중 2개가 실행 중에 깨졌습니다. Gson 역직렬화, getIdentifier 리소스 조회, Room _Impl, 디버그 빌드의 무효화 등 크래시 로그에 안 잡히는 유형을 정리합니다.