Jetpack Compose TextField 삼성 키보드 문제 해결 과정에 대한 기록

삼성 키보드로 Jetpack Compose TextField를 사용할 시 발생했던 문제가 최근 해결이 되었다! 🚀🎉

Jetpack Compose TextField 삼성 키보드 문제 해결 과정에 대한 기록

삼성 키보드로 Jetpack Compose TextField를 사용할 시 발생했던 문제를 1년간 지켜봤다. 결론부터 말하자면 이 이슈가 최근에 해결이 되었다! 🚀🎉 (아직 배포된 사항은 아니다.)

  • 어떤 것이 문제였는지
  • 문제 해결을 위해 어떤 노력을 해왔는지
  • 어떻게 해결이 되었는지

지난 1년간의 기록을 공유 해본다.

해결된 모습. ‘가나’와 ‘다라’ 사이 ‘가나다라’를 입력하면 ‘가가가가나ㅏㅏㅏ다라’ 와 같이 입력된다.

타임라인

(1) HOLIX Android 배포, 그리고…

21년 7월 말, 심사를 통과하고 얼마 있지 않아 팀 내외부로부터 텍스트 수정 관련 이슈를 제보해주시는 분들이 생겼다.

현재는 ‘마스터’ 당시에는 ‘멘토’

제보해주신 고객님과 소통하여 문제를 재현해냈는데 삼성 키보드의 문제라는 것을 특정했다. 그리고 삼성 키보드의 다양한 옵션들을 활성화/비활성화 해보며 문제가 재현되는 조건을 찾을 수 있었다.

불행의 시작…

아래와 같은 조건에서 메시지 커서를 중간으로 옮겨 메시지를 수정하면 자음과 모음이 분리되었다.

  • 삼성 키보드
  • 문구 추천 on (기본값 on)
  • 텍스트 입력 composable (BasicTextField, Material 2,3 TextField)

안드로이드 기기 중 삼성 기종의 비율은 절대적이며, 문구 추천 옵션은 기본값이 활성인지라 대다수의 사용자는 문제를 겪을 것으로 예상 되었다. 일단 문구 추천을 끄는 임시 방편 해결책을 두고 빠르게 문제 해결을 시작했다.


(2) AndroidView + EditText를 통한 해결

개발 중인 서비스의 코어 액션은 메시지를 남기는 것이다. 카카오톡이나 업무 메신저등, 작성 중이던 메시지를 수정하는 일은 자주 발생하는 일이므로 빠른 수정이 필요했다. 다행히 나는 ExoPlayer, WebView 등을 사용하기 위해 AndroidView를 활용하는 법에 대해 어느 정도 학습이 되어 있었고, EditText를 사용하여 문제를 해결할 수 있을 것이라 기대했다.

가장 시급한 부분이 메시지 작성 컴포넌트인데, TextField의 Focus, AnnotatedString, VisualTransformation, onTextLayout등 Compose의 특성을 활용한 것을 Composable 내 AndroidView의 EditText를 통해서 달성해야했다. 😇

어려움이 있었지만, 약 일주일 정도 소요하여 기존의 메시지 입력 컴포넌트를 대체할 수 있는 수준으로 완성되었고, 새 앱 배포를 통해 시급한 문제를 해결했다. 🎉

그 후, 여러 요구사항을 만족할 수 있는 HolixTextField 를 구현하여 회원가입/로그인/검색 등 앱 내에 있는 모든 TextField를 대체했다.


(3) 이슈 해결을 위한 노력 — Issue Tracker

현재 시점에서는 어떨지 모르겠는데, 당시엔 Stack Overflow보다 Issue Tracker를 통해 유용한 정보를 더 많이 얻을 수 있었다.

Google Issue Tracker

문제를 인지한 21년 8월 초, 재현을 위한 간단한 코드와 함께 Issue를 작성했다. 제목에 Korean 이라는 좁은 scope의 단어가 포함되어서 그런지 높은 Priority는 받지 못하고 분류, hotlist 등 구글러가 아니면 볼 수 없는 업데이트만 종종 오고 있었다.

11월 쯤, 우연찮게 Compose 도입 사례에 대해 구글 분들과 세션을 가질 수 있었다. 이 이슈에 대해서는 발생한 기기 및 Android 버전 등 좀 더 세분화된 재현 조건이 필요할 수 있다 하셔서 정보를 추가 했지만 업데이트는 없었다.

그러던 중 해가 바뀌고 1월 말, 나의 소심한 Any updates? 에 반응을 한건지 드디어 담당자가 배정이 되었다. 곧바로 다른 이슈와 duplicated 마킹이 되어 함께 해결이 되었다는 업데이트가 떴다🙏 기쁜 마음에 해당 commit에 대한 Snapshot을 테스트 해봤지만, 여전히 문제는 발생하고 있었다.

이대로 해결이 되었다고 처리될 뻔 했지만, 나의 업데이트로 담당자가 duplicated 라벨을 제거하고 문제에 대한 재조사를 해줬다. 곧 타이밍이 문제 원인인 것 같다며 해결 방법까지 밝혔지만 확신할 수 없다는 답변과 함께 미완의 해결책만 남게 되었다.

(4) 이슈 해결을 위한 노력 — 삼성 멤버스

나는 삼성 키보드에서만 문제가 발생했기 때문에, 당연히 삼성 쪽 귀책 사유가 있을 거라 생각했다. 문제 발생 후 삼성 키보드 앱 내 문의 기능을 통해 로그와 문제 상황 설명을 보냈는데 첫 답변이 너무 실망스러웠다.

일단 문의에 대한 답변을 받은 시점은 1.0이 정식 출시된 상황 이었고, 삼성 키보드에서만 문제가 발생하는 상황에서

해결 방안은 없습니다. 양해바랍니다.

라는 식의 답변은 아직도 최악이었던 것 같다. 다시 정중하게 문의를 넣은 결과 이전보다 상세한 설명을 들을 수 있었다.

하지만, 위에 언급된 getTextBeforeCursor 로직은 라이브러리 내부 구현이라 내가 어떻게 해볼 여지가 없었고, IME (Input Method Editor)에 대한 이해 없이 잘 와닿는 답변은 아니었다. TextFieldValue값을 디버거로 찍어보고 최대한 라이브러리 수정없이 해결해보려 노력했으나 큰 성과는 없었다. 이런 힌트들은 Issue Tracker를 통해 구글에도 전달했다.


(5) 드디어 해결 🎉 1+1 당해버린 한국어(?)

나는 2주에 한번 있는 배포 노트, 그리고 그것을 넘어 현재 개발 중인 사안들 까지 종종 모니터링 하는 편이다. 안드로이드의 멋진 부분은 오픈 소스라는 것이다. 코드의 변경사항들은 아래와 같이 다양한 곳에서 확인할 수 있다.

이 중 나는 사용자 경험이 좀 더 좋은 Github를 활용했고, BasicTextField가 포함된 foundation 라이브러리의 commit들을 모니터링 했다. TextInputConnection 등등 관련된 class, function등의 이름이 적혀있을 때마다 두근 거리는 마음으로 변경사항을 확인했지만 관련이 없는 경우가 더 많았다.

그러던 중… 얼마 전인 22년 7월 28일, 이런 commit과 Issue Tracker의 내용을 확인했다.

Update state in TextInputService with plausible one immediately · androidx/androidx@b95da1b
Some IME requests surrounding text just after setting composing text or commit text. However, Jetpack Compose ask developers when IME set composing text or commit text via onValueChanged callback a…
Google Issue Tracker

일본어에서 키보드 관련 이슈가 있다는 것인데, 삼성 측에서 준 힌트 getTextBeforeCursor , 구글러가 확신하지 못했지만 원인으로 지목했던 timing 이슈 등 모든 부분에서 닮아 있었다.

바로 Snapshot Build를 테스트 하고자 CI에서 해당 변경사항에 대한 Build ID를 찾았다.

ci.android.com

그 결과…

  • BasicTextField (foundation-1.3.0-SNAPSHOT)
  • TextField (material-1.3.0-SNAPSHOT)
  • TextField(material3–1.0.0-SNAPSHOT)

모든 텍스트 입력 컴포넌트가 정상적으로 작동하는 것을 확인할 수 있었다. 🎉🎉🎉🎉🎉🎉🎉🎉

단, material이나 material3 내부는 foundation 1.2.0-rc02를 사용하게 되어있는데, 의존성 전이가 이루어진 것 같다. Snapshot 빌드의 특성에 따른 의존성 conflict인 것 같다.

마치며

Jetpack Compose, 도입 할만한가?

라는 질문을 들었을 때 선뜻 권하기 어려웠던게 TextField와 같이 기본적으로 잘 동작할 것으로 예상되는 부분에 문제가 있다는 것이었다. 나는 한국 사용자를 대상으로 하는 서비스가 Jetpack Compose를 도입하고자 할 때 겪을 큰 문제 중 하나가 해결되었다고 생각한다.

마음 놓고 Compose 사용하자!

많은 개발자들이 아래와 같은 이유로 여전히 이 이슈를 인지하지 못했을 수 있다고 생각한다.

  • 안드로이드 에뮬레이터를 테스트 기기로 사용하는 경우가 많다.
  • 테스트 시에는 오타를 내지 않아 수정할 일이 잘 없다.

실제 사용자가 겪을만한 큰 문제가 해결되었으니 마음 편히 개발하면 될 것 같다.👍

Issue Tracker를 잘 활용해보자

특히 View에서 되던 것들이 Compose에서 안되는 경우가 꽤 많은데, 이런 경우 보통 Feature Request 로 올라와있으니 Issue Tracker를 통해 가장 빠르고 정확한 업데이트를 받아보면 좋다. 최근 배포가 된 것 중 예시로는 includeFontPadding , Downloadable Font 등이 있다.

언제부터 쓸 수 있을까?

  • 글 작성 시점(22년 8월 5일) 기준 1.3.0-alpha02 버전은 여전히 문제가 발생하고 있다. 이 변경사항이 1.2.1에 포함될 지, 1.3.0-alpha03에 포함되어 나올지는 다음 릴리즈 날짜인 22년 8월 11일 목요일 새벽에 알 수 있을 것 같다. (HOLIX Jetpack Compose 커뮤니티에서는 이런 최신 정보에 대해 이야기 나누고 있다.)
Jetpack Compose 사용자 모임 | 홀릭스(HOLIX)
이미 Production에서 사용중인 개발자와 새로 공부하는 뉴비까지, 안드로이드의 새로운 UI 프레임워크에 대한 최신 정보를 얻으세요!

필자가 운영 중인 Jetpack Compose 커뮤니티

  • 미리 프로젝트에 적용해보고 싶다면 Build ID 8878537 를 사용해 아래 가이드에 따라 적용해보면 된다. (아마 최신 Build ID 를 이용해도 괜찮을 것이다.)
Jetpack Compose Snapshot 버전 사용하기
alpha 릴리즈를 넘어 개발 중인 버전을 사용 해보고 싶을 때가 있는데, 이런 상황에서 Jetpack Compose의 Snapshot 버전을 프로젝트에 적용하는 법에 대해 소개한다.
  • 간단히 문제를 체험해보고 싶다면 아래 Github repository를 통해 apk를 받아볼 수 있다.
GitHub - holixfactory/TextField-SamsungKeyboard-Problem: Compose TextField + 삼성 키보드 이슈에 대해 다룹니다.
Compose TextField + 삼성 키보드 이슈에 대해 다룹니다. Contribute to holixfactory/TextField-SamsungKeyboard-Problem development by creating an account on GitHub.