playkeyboard
Published in

playkeyboard

소프트웨어 키보드는 어떻게 만들어야하는가

스마트폰에서 가장 많이 실행되는 앱 중 하나인 키보드는 별도의 소프트웨어로, 내장된 기본 키보드앱이 아닌 다른 서드파티 키보드앱을 설치하여 개성있게 꾸미거나 특별한 기능을 사용할 수도 있습니다. 키보드 앱은 그 용도와 작동방식이 다른 앱과는 완전히 다릅니다. 플레이키보드 출시 이후 4년간의 운영을 바탕으로 이런 특징을 가진 키보드 앱에 대해서 이야기 해보고자 합니다.

https://plkey.app/

더 작고, 더 많고, 더 효율적으로

키보드는 앱 화면에서 1/3 정도, 많아야 1/2밖에 차지하지 않습니다. 하지만 그 작은 화면에 무수히 많은 기능을 넣어야합니다. 액티비티처럼 백그라운드에 오래 있으면 리소스를 해제시켜서 메모리를 절약해주는 기능도 없습니다. 키보드는 수시로 사용하기 때문에 백그라운드에서 종료되지 않고 계속 남아있습니다. 그런데 메모리를 많이 차지하면 그만큼 기기 성능 저하의 원인이 됩니다. 즉 더 많은 기능을, 더 작은 화면에, 더 효율적으로 담아야한다는 의미가 됩니다.

제가 다른 회사에서 커머스 앱을 개발할 때는 성능이슈가 자주 발생하지는 않았습니다. 버그가 없는 코드, 이해하기 쉽고 유지보수가 쉬운 아키텍처에 더 관심을 갖고 제품을 개발했습니다. 하지만 키보드는 최고의 성능을 늘 유지해야합니다. 사용자들은 키보드 입력이 조금만 지연되어도 곧바로 불편함을 알아차립니다. 단어추천같은 기능이 CPU를 많이 사용하면 시스템에서 배터리를 많이 사용하는 앱이라며 경고하기도 합니다.

https://developer.android.com/studio/profile/record-traces?hl=ko

저희는 성능 개선에 Android Profiler를 적극 활용하고 있습니다. 특히나 Trace 기능을 애용합니다. 키보드 로딩 / 사용자 입력에 반응하는 부분에서 어떤 부분이 많은 시간을 차지하는지 모니터링합니다. 이후 주로 아래의 방식으로 성능을 개선합니다.

  1. 비동기로 처리할 수 있다면, 비동기로 처리한다(주로 데이터베이스 작업).
  2. 시간을 많이 차지하고 UI스레드에서만 가능한 뷰 생성은 최대한 지연해서 필요할 때 호출한다.
  3. 사용하지 않는 객체는 제거해주고, 객체간의 결합과 참조를 최대한 줄여서 GC에 의해 빠르게 메모리에서 제거되게한다.

또한 키보드 앱 특성상, 사소한 버그도 키보드를 사용하는데 불편함이 생긴다면 유저 이탈로 이어지는 치명적인 버그가 될 수 있습니다. 이러한 어려움 때문에 새로운 버전을 배포할 때마다 변경사항들을 꼼꼼히 체크하고, QA에 많은 시간을 투자합니다. 키보드는 개발자에게 늘 많은 고민과 역량을 요구한다고 생각합니다.

커스터마이징 욕구를 채워주기

사람들은 왜 굳이 기본 키보드가 아닌 별도의 키보드 앱을 깔아서 설치할까요? 사람마다 다르겠지만 크게 아래 두가지로 나눌 수 있을 것 같습니다.

  • 기본 키보드보다 더 나은 디자인
  • 기본 키보드보다 더 나은 기능

더 나은 디자인

플레이키보드는 사용자들의 디자인 욕구 만족을 위해 두가지 종류의 테마를 제공합니다. 하나는 키보드 속 캐릭터가 내가 말하는 내용에 반응하는 라이브 테마이고, 다른 하나는 캐릭터는 없지만 아기자기하고 귀여운 디자인의 디자인 테마입니다.

플레이키보드 사용자들의 구매 패턴과 사용 패턴을 조사하여 사용자 유형별로 어떤 테마를 선호하는지 분석하고 이를 신규 테마 출시에 활용하고 있습니다. 이러한 사용 패턴을 정확하게 분석할 수 있도록 수집 코드를 작성하는 것이 키보드 앱 개발자의 주요 역할 중 하나입니다(물론 민감한 정보는 수집해선 안되겠죠?).

더 나은 기능

플레이키보드는 다른 키보드에서 제공하는 기능들 뿐 아니라 제공하지 않는 특별한 기능들도 제공하고 있습니다. 대표적으로 라이브테마 이모티콘 전송이나 단축키가 있습니다.

이런 기능들은 사용자별로 완전히 다른 사용 패턴을 보이는데요, 어떤 사용자는 자주쓰는말 기능을 굉장히 중요하게 생각합니다. 자신이 좋아하는 BJ의 방송을 볼 때 채팅하면서 쓰거나, 직장에서 연락을 주고받을 때 매번 사용하는 비슷한 말을 전달할 때 너무나도 편리하게 사용한다고 하셨어요.

또 한국어 사용자들은 단축키를 이용해서 ㅋㅋㅋㅋ를 입력하는 기능을 정말 많이 사용하는데, 외국어 사용자들은 단축키보다는 이모지를 훨씬 많이 사용합니다. 안그래도 작은 화면, 사용하지 않는 기능이 덩그러니 있다면 사용자는 불편하겠죠? 자신이 더 자주쓰는 다른 기능으로 교체하고 싶을 것입니다.

앱 설정에 있는 수많은 커스터마이징 화면들

이런 다양한 욕구를 충족시키기 위해서 앱 내의 수많은 설정들이 존재합니다. 때문에 앱 내의 UI도 복잡해지고, 코드도 굉장히 복잡해지게 됩니다. 이런 일들을 최대한 단순하게, 버그 없이 해결해야하는게 키보드 개발자가 가져야할 필수 역량입니다.

UI 만들고 API 호출하고 끝이 아니다

키보드는 단순히 UI만 만들고 API만 호출해서 화면에 띄워주는 작업만 하지 않습니다. 사용자가 입력하는 한글키를 조합하는 오토마타를 개발해야하고, 오타가 발생하면 고쳐주고 사용자가 입력하는 내용을 예상해서 추천해주는 단어추천기능 역시 제공되어야합니다.

오토마타

중앙 레이아웃을 제외하면 한글 키보드만 무려 6종!

자판 종류가 적은 외국과는 달리 한국어는 쿼티, 단모음, 천지인, 나랏글처럼 정말 다양한 종류의 자판이 있습니다. 이런 자판을 선호하는 사용자들을 만족시켜주기 위해 모두 제공해야하지만 이를 개발하는건 쉽지 않습니다. 각 자판이 조합하는 방식이 달라 모두 따로 만들어야하기 때문입니다.

개발한 뒤 이것저것 입력해보며 오토마타를 테스트하는 것도 쉽지 않습니다. 때문에 이를 자동화하여 테스트에 들어가는 시간을 절약하기도 했습니다. 오토마타에 입력할 내용을 분해한 뒤 집어넣어서 나오는 결과값이 일치하는지 확인하는 식으로 테스트 과정에서 놓칠 수 있는 부분을 잡아낼 수 있었습니다.

단어추천

오타 ‘안넝하세요’ 를 고쳐주는 단어추천 기능

단어추천 알고리즘을 만들 때 아래와 같은 기준을 정해서 알고리즘들을 리서치했습니다.

  1. 사용자가 체감하지 못할 정도의 빠른 성능(100ms 이내)
  2. 메모리에서 차지하는 공간이 50MB 이내
  3. 단어 사전이 디스크에서 차지하는 공간이 20MB 이내
  4. CPU 점유율 10%를 넘기지 않는 적은 배터리 사용량

처음 후보에 올랐던 것은 SymSpell 알고리즘이었습니다. 이 알고리즘은 매우 빨랐지만 단점은 차지하는 메모리 용량이 모바일 환경에서는 너무 컸다는 사실입니다. 또 처음에 단어 사전을 로드하고 준비하는데 시간도 많이 소요됬습니다. 따라서 저희는 인접 Bigram Search라는 독자적인 알고리즘을 개발했고, 위의 4가지 요건을 만족시키면서 단어추천 알고리즘을 구현했습니다.

개발자들을 위한 문서화

플레이키보드는 한 명의 개발자가 계속해서 만든게 아닙니다. 여러 개발자들이 함께 노력한 결과물입니다. 키보드 서비스는 앱과는 달리 잘 통일된 아키텍처가 있지도 않고, stackoverflow에 질문하면 대답해주는 사람도 없습니다. 정말 알 수 없는 버그가 발생하면, 사용자에게 구체적인 문제 상황을 전달받고, 동일한 환경을 만들어서 각종 디버깅 도구를 이용해서 시간을 들여서 버그를 재현하고 수정했습니다.

저희가 경험했던 같은 실수, 같은 일를 다른 팀원이 반복하지 않기 위해서, 또 낯선 코드를 보고 당황하지 않고 빠르게 작업을 하기 위해서 내부에서 위키를 작성하고 개선해가고 있습니다.

키보드 개발은 낯설고 자료도 부족해서 어렵습니다. 동시에 다른 앱 개발자들이 잘 하지 않는 특별한 일을 한다는 생각에 자부심과 즐거움을 느끼기도 합니다.

--

--

기술과 콘텐츠로 즐거운 소통 경험을 만드는 사람들의 이야기

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
김희규

김희규

나는 최고의 선수다. 나를 최고라고 믿지 않는 사람은 최고가 될 수 없다.