플레이키보드 출시 1주년 후기

1주일 지났지만 쓰는 플레이키보드 출시 1주년 기념 후기
대표님이 쓰라고 해서 쓰는 거 맞습니다

작년 8월에 나만의 라이브 테마 만들기를 출시하고 9월에 구글 플레이 다운로드 10만을 찍었습니다. 학교다니고 종강하고 돌아오니 3달만에 20만을 넘었고 다시 1달만에 30만, 이제는 올해 1분기 100만을 목표로 하고 있네요

지금 이순간에도 전세계에서 만 명이 넘는 사람들이 실시간으로 플키를 사용하고있고, 하루에 수천건의 다운로드가 발생하고 있습니다. 거의 한국인 사용자만큼 외국인 사용자가 있어서. 매일 전세계 언어로 욕과 칭찬을 받고있습니다. 또 덕분에 이번 설 연휴에는 아랍어와 태국어, 베트남어를 간단하게라도 배워보려고 합니다… 얘네 키보드를 만들어야 하거든요 ㅂㄷㅂㄷ;;;

Image for post
Image for post
Image for post
Image for post
Image for post
Image for post

중간중간 학교다니며 쉬긴 지만 일을 시작한 지는 15개월이나 됬네요. 플키는 현재까지 약 2천번의 커밋과 13만줄이 넘는 코드가 쌓였습니다. 제가 방학때만 일을 했는대도 1년동안 쌓은 커밋만 500개가 넘더군요. ㄷㄷ;;

기록만 보면 출시 전 ~ 출시 초에 작업한 양이 가장 많았습니다. 지금은 유지보수도 많이 해서 그런 것 같아요. 개발자니까 개발자로서 출시후 1년동안 개발하면서 느낀 걸 써볼까 합니다.

1. 유지보수

유지보수는 남의 일인 줄로만 알았지만 출시 후 각종 버그들과 끊임없는 신기능 요구가 쏟아졌고 저는 이걸 해결해야만 했습니다. 하지만 미래를 고려하지 않은 설계는 버그를 고치면 또다른 버그가 생기고 신기능을 추가하면 기존의 기능이 맛이가는 행복한 나날들을 겪으면서 저는 리팩토링이라는 한가지 업무가 추가로 달라붙게 되었죠. 처음엔 MVP, MVVC를 시도해보다가 이후 Clean Android Architecture 등을 배우며 디자인 패턴에 대해서도 다시 배우기 시작했습니다. 때마침 학교에서 관련 과목을 배운 것도 도움이 됬습니다.

아직도 이것저것 실험중이지만 몇가지 원칙은 생겼습니다. 한 클래스는 한 가지 역할만 하고, 단순한 기능의 단위로 함수와 클래스를 나눠서 코드의 재사용성을 높이는 것이 확실히 버그를 줄이고 가독성과 생산성을 크게 향상시켜줍니다.

또 안드로이드 앱에서 안드로이드 종속성을 제거하려고 했던 시도들이 생각보다 큰 효과를 봤습니다. 어차피 안드로이드 앱인데 종속성있으면 뭐 어떤가 생각이 들었습니다. 하지만 몇가지 신기능을 개발하면서 작업의 생산성과 효율성을 높이기 위해 테스트 가능한 코드를 작성해야 했고, 이 과정에서 종속성이 제거된 모듈을 데스크톱 JVM에서 테스트하고 안드로이드로 이식하게 되었습니다.

현재 개발중인 새로운 기능도 이런 방식으로 개발중인데 정말 효율이 좋습니다(암드로이드 ㅠㅠ). 그런데 종속성을 완전히 분리하겠다고 처음부터 Pure Java로 가게되면 패턴에 익숙하지 않은 상황에선 내가 이걸 왜 하는지 하며 의미없는 추상 클래스/메서드만 죽어라 만들고 있을 수 있습니다. 학습곡선이 꽤나 높아요(아직도 잘 모르겠음), 조금씩 공통적인 부분을 일반화하면서 접근하는게 이상적인 것 같습니다.

이런 부분들을 고려하다보니 일을 시작할 때 바로 키보드를 두드리기보단 잠시 고민하는 시간이 많아졌습니다. 확실한 근거는 없지만 체감하는 버그발생률도 낮아진 것 같고, 예전에 만든 함수나 클래스를 수정없이 그대로 활용해서 빠르게 개발하는 경우도 많아진 것 같습니다.

물론 플키 코드는 아직도 문제가 많습니다. 제가 만든 이상한 패턴, MVC, MVVC, MVP, 클린 아키텍쳐 등 온갖 패턴들이 뒤섞여있거든요. 이것들을 통일시키는게 나중에 다른 사람과 협업할 때도 중요할텐데, 어느 세월에 해야할 지 고민입니다. 그리고 전설로만 전해지는 자동화 테스트, 유닛 테스트가 플키에게도 적용될 날이 올까요…?

2. 데이터 분석

플키는 사용자가 입력하는 내용은 수집하지 않습니다. 하지만 서비스 향상을 위해 다른 사용정보는 수집하고 있습니다. 예를 들어 사람들은 어떤 언어와 어떤 키보드 자판(쿼티? 천지인?)을 사용하는지, 신기능이 출시되면(예: 테마 만들기) 사람들이 얼마나 유입되고 신기능을 사용하는지, 어떤 테마가 인기가 많은지, 어느 나라에서 어느 시간대에 사람들이 키보드를 많이 사용하는지 등이죠.

처음에 Firebase Analytics를 도입하고 초창기에는 어디에다가 분석을 달아야 할지, 또 쌓인 데이터는 어떻게 분석하고 활용해야 하는건지 몰라서 갑갑했습니다만, 지금은 어느정도 인사이트가 생겼습니다. 일부 수치는 외부 홍보 등에 사용하기도 하고, 또 새로운 기능을 추가하거나 변경할 때 기존의 어떤 기능이 인기가 없으니 수정하거나 뺄 지 결정할 때 사용하기도 합니다.

하루에만 수백만개, 한달에 억단위로 이벤트가 날라오고 그 대부분이 쌓여서 방치되지만 정 — — 말 중요한 이벤트들에는 추적을 달고 분석하고있습니다. 언젠가 여유가 되면 분석툴을 직접 만들어서 분석해보고 싶네요. 분석 능력이 생기면 또다른 인사이트를 얻을 수 있겠죠?

3. UX, 비동기, 예쁜 코드

안드로이드같은 GUI프로그램은 UI스레드에서 동작합니다. 특히 키보드같은 경우 터치에 빠르게 반응해야하고, 이런 UX를 위해 비동기 코드를 굉장히 많이 사용하게 되며 멀티스레드 관리에 큰 신경을 써야합니다. 이 멀티스레드 관리를 못해서 라이브테마 코드를 3번을 갈아엎었습니다.

버그가 나는 것만큼 화나는게 비동기를 인라인 클래스로 처리하다보면 코드가 탭탭탭탭하면서 점점 오른쪽으로 가는 탭 지옥이 펼쳐지더니 내 코드를 차마 남에게 보여줄 수 없을 정도가 되어갑니다. 그렇다고 비동기 코드를 짤 때마다 AsyncTask를 새로 클래스 만들기도 짜증나죠.

보통 RxJava+Lambda를 많이 사용하시는 것 같은데 저는 코틀린을 배워서 코루틴을 사용해서 이런 문제를 많이 해결했습니다. 또 앞서 여러 패턴과 기능 분리, 코틀린 언어의 특성을 이용해서 재사용 가능한 비동기 모듈을 작성했습니다. 이를 통해 대부분의 코드를 동기로 작성해도 짧은 코드 몇줄만으로 비동기 처리를 가능하게 했습니다.

라이브 테마를 포함 수많은 기능이 지원되는 플키는 꽤나 무거운 편이고, 내부에서 처리하는 로직도 많지만 상당수를 비동기에 의존해서 느린 터치 등의 이슈는 잘 발생하지 않는 편입니다. 이런 것들이 만족스러운 UX를 만들 수 있던 것 같습니다. 근데 사실 요즘 핸드폰 성능이 좋아서 그런 것 같아요 ㅎ;;

4. 앞으로?

앞으로의 1년을 위해서 해야할 일들을 조금 적어봅니다.

다양한 패턴이 혼재한 난잡한 코드들로 인해 고통밭을 순간이 언젠가는 올 것 같습니다. 기능을 수정하거나 버그가 발생했을 때 조금씩 바꾸어나가고는 있지만 앞으로 얼마나 더 세월이 걸릴지…

라이브테마는 큰 메모리를 사용하지 않고 최적화가 되어있지만 아직 그래도 동남아 쪽에서는 저사양 기기를 많이 사용하다보니 메모리가 부족해서 튕기는 경우가 있습니다. 플키는 LRU캐시를 구현해서 라이브테마를 미리 로드했다가 빠르게 애니메이션을 재생하는데, 기기 사양에 맞춰 캐시나 이미지 품질관리 등의 방식을 적용해서 유연한 메모리 관리 시스템을 도입해야 할 것 같습니다.

플키의 새로운 기능을 위해 데이터 마이닝과 딥러닝을 공부중입니다. 아니 무슨 키보드에 인공지능이냐 싶은데… 구X, 네X버, 삼X 등의 대기업 키보드를 따라잡고 더 나은 서비스가 되려는 걸 목표로 하니 끝이 없네여 ㅠ

그리고 같이 일하는 팀원들 정말 능력있고 일하면서 많이 배워가는 것 같습니다. 앞으로도 지금처럼 갔으면 좋겠습니다.

Image for post
Image for post

플키와 비트바이트에 관심이 있으시면 https://plkey.app/ 에 들려보시기 바랍니다. 또 새로운 멤버는 언제나 환영인 걸로 알고 있습니다(특히 UI/UX 디자이너 환☆영). 이걸 다 읽으시는 분이 얼마나 될진 모르겠지만 관심있으시면 연락주세요.

여러분 새해 복 많이 받으세요.

Written by

2020.12.8 ~ 2022.6.9 군복무중 Serving in the South Korean Military Service

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