Plain Bagel



회사소개          팀 문화         채용공고         베이글로그


일하는 이야기

신규 기능 비하인드


Cardy에 Dynamic feature module을 사용해보았습니다.





안녕하세요. 플레인베이글에서 Cardy를 개발하고 있는 안드로이드 개발자 이용우입니다.


Cardy는...
이미지를 누르면 상세 페이지로 이동합니다.

Cardy는 영어를 외국어로 학습해야 하는(ESL) 초/중급 사용자가 가장 쉽고 빠르게 완벽한 영어 문장을 말할 수 있게 해줍니다. 매일 사용자 개인에게 적합한 레슨과 문제를 제공하여, 강의 교재를 따로 구매하지 않고도 효과적인 방법으로 유창한 영어를 구사할 수 있도록 돕고 있습니다.

동남아시아, 인도 등 소프트 런칭 국가들에서 선풍적인 초기 반응을 이끌어 낸 Cardy는 점차 진출 국가와 지원 언어를 확장하고 있습니다.


😵 영어로 영어를 배우라고요?
Cardy의 기존 문제 풀이 화면

Cardy는 얼마 전까지 학습에 사용되는 연습 문제들을 모두 영어로만 제공하고 있었습니다. 런칭 초기에는 영어로 된 앱 사용 환경에 익숙한 인도 사용자들을 타겟했기 때문에 다국어 지원이 크게 요구되지 않았습니다.

본격적으로 인도 외 국가로 영역을 넓히려고 보니, 영어로 영어를 배울 수 없는 학습자 또한 고려해야 했습니다.


💪 다국적 지원 가보자고!
우선, 다양한 환경에 있는 Cardy 학습자들의 학습 경험을 개선하기 위해, 문제에 번역문을 지원하기로 했습니다. 기존 사용자들은 회원가입 시 온보딩 과정에서 언어를 선택하여, 단어 뜻을 이해하고 패턴 사용법을 이해할 때 해당 언어를 사용할 수 있었습니다.

우리는 이번 개선을 통해 다양한 환경에서 조금 더 맞춤화된 Cardy를 사용할 수 있게 하고자, 사용자의 환경 정보에 따라 언어 선택 순서를 변경 및 자동 선택 기능 지원하게 되었습니다.


💬 사용자별 선호 언어 우선순위는 어떻게 정하지?
단순 디바이스 설정값으로 판단하는 경우에는 권한이 필요하거나 일시적으로 정보를 받을 수 없는 경우가 존재합니다. 또한 기기 설정값은 쉽게 변경할 수 있기에 Cardy 팀은 기기 설정값으로 사용자 언어 우선순위를 결정하는 것은 신뢰성이 떨어진다고 생각했습니다. 무엇보다 우리는 센서나 네트워크를 사용하지 않으면서 사용자의 환경 정보를 판단할 수 있는 방법이 필요했습니다.

네, 그래서 우리는 Dynamic Feature Module을 사용하게 되었습니다.


Dynamic Feature Module?
Dynamic Feature Module을 사용하면, Google Play가 자동으로 분할되어 존재하는 APK 이외에 앱 개발자가 기획적이거나 기술적인 이유로 특정 기능을 분리하여 필요에 따라 설치/삭제할 수 있습니다.


☝🏻 App Bundle에 필요한 기능만 담아봅시다
Play store에 앱 번들로 게시된 앱은 사용자가 설치할 때 기기에 맞는 APK들로 조합되어 다운로드 및 설치가 이뤄집니다.

앱 번들 이전에는 하나의 앱이 하나의 APK로 구성되었지만, 앱 번들이 등장한 이후에는 사용자 환경에 맞는 APK들로 하나의 앱을 구성할 수 있게 됐습니다. 이제 APK는 하나의 모듈이라 봐도 무방하겠네요. 😊

🗃️ Cardy 앱 번들 구성
   1. Base APK(모듈)
   2. 디바이스별 언어나 화면 밀도에 따른 설정 APK(모듈)
   3. 동적 기능을 위한 APK(모듈)

위와 같이 앱 번들을 구성하면, 불필요한 리소스를 다운로드 하지 않아도 됩니다. 앱의 크기가 줄어드니 사용자의 부담을 줄여줄 수 있습니다. 앱 다운로드 속도도 모든 리소스를 포함할 때보다 훨씬 줄어들 테구요.


Cardy는 dynamic features 모듈 아래에 지원하고자 하는 국가를 선정하고, 위와 같이 국가별로 AndroidManifest.xml 을 생성해주었습니다.


✌🏻 사용자가 필요로 하는 기능만 전달해요
우리는 Dynamic feature module을 통해 국가별로 필요한 기능을 담은 모듈을 완성했습니다.

맞춤 전송(Play Feature Delivery)을 이용해 사용자의 국가를 기반으로 맞춤화된 앱을 전달하기로 했습니다.

💁 맞춤 전송에는 다음과 같은 방식이 있습니다.

  1. Install-time delivery
    기본 기능을 제공하는 Base Apk와 함께 설치하는 방식입니다.
    첫 사용 이후 상황에서 필요로 하지 않는 기능을 제공할 때 사용하면 좋습니다.
    예를 들어, 신규 기능 튜토리얼을 모듈로 분리하여 만들고, 사용자가 튜토리얼을 완료하면 해당 모듈을 삭제하여 앱의 용량 줄이는 데에 쓰일 수 있습니다.

  2. On demand delivery
    특정 기능이 필요한 시점에 Google Play에 요청하여 기능을 다운로드하는 방식입니다.
    앱의 마이너한 기능을 부분 제공할 때 사용하면 좋습니다.
    쇼핑몰 앱의 경우 사용자 대부분이 해당 앱으로 구매하는 기능을 주로 사용할 것입니다. 하지만, 사용자가 직접 중고 옷을 올려서 판매하는 기능을 보조 기능으로 넣는다면, On demand delivery를 통해 해당 기능을 이용하는 사용자에게만 별도로 제공하면 보다 효율적으로 앱을 제공할 수 있습니다.

  3. Instant delivery
    Apk를 설치하지 않고 바로 실행하는 방식입니다.

  4. Conditional delivery ✅
    특정 하드웨어나 설치된 국가에 따른 조건을 통해 설치 여부 설정할 수 있습니다.
    예를 들어 증강 현실(AR)을 지원하는 기기에서만 사용 가능한 기능을 모듈에 담아 제공할 수 있죠.
    기기 기능을 기반으로 조건 지정하려면, 다음과 필요한 조건을 해당 기능을 담을 AndroidManifest.xml 에 작성해주면 됩니다.

AndroidManifest.xml


Cardy에서 사용자의 국가를 기반으로 사용자의 앱 경험을 개인화 해야 했기 때문에, 아래와 같이 설치 시 국가 코드를 기반으로 앱을 구성하였습니다.  
AndroidManifest.xml - 국가 코드가 ES인 경우만 해당 모듈 추가하도록 합니다.



/app 에서 앱에 어떤 모듈이 있는지 알려면?
국가별로 분리된 모듈을 앱 모듈에서는 어떻게 파악할 수 있을까요?

간단하게는  SplitInstallManager.installedModules 를 이용하면, 설치된 모듈을 모두 가져올 수 있습니다.

Cardy에서는 사용자가 어떤 module을 갖고 있는지 파악하여, 그것을 앱에서 정의한 class LangCode 로 값을 받기 위해 다음과 같이 kotlin 확장함수를 생성하여 사용하고 있습니다.
fun SplitInstallManager.getModuleLangCode(context: Context): LangCode - 현재 설치된 모듈에 따라 언어 코드를 확인한다.


🥳  나에게 익숙한 언어로 영어를 배워요!
스페인어 사용자의 앱 사용화면

Dynamic feature module 와 Play feature delivery를 통해 국가별로 선호 언어 우선순위를 정하여, 사용자가 가장 편하게 사용할 수 있는 언어로 Cardy를 사용할 수 있게 되었습니다.

연습문제 내에 번역문을 제공한 버전에서 이전 기간 대비 첫 번째 레슨을 완료하는 신규 사용자의 비율이 무려 39% 상승했습니다. 📈
Cardy의 D+1 재방문율이 6%p 향상하는 긍정적인 반응 또한 확인할 수 있었습니다!





참고사항

• https://developer.android.com/topic/google-play-instant/overview
• https://developer.android.com/guide/app-bundle/instant-delivery • https://developer.android.com/guide/playcore/feature-delivery
• https://developer.android.com/guide/playcore/feature-delivery/conditional


이용우 | 개발 팀
“with (plainBagel) { .. }”



.



지금 플레인베이글의 멋진 동료가 되어주세요!

채용공고 바로가기︎︎︎






서울시 강남구 도산대로 210 의화빌딩 2F 플레인베이글
2F, 210, Dosan-daero, Gangnam-gu, Seoul, Republic of Korea
©플레인베이글



지금 플레인베이글은 채용 중!

채용공고 바로가기︎︎︎






서울시 강남구 도산대로 210 의화빌딩 2F 플레인베이글
2F, 210, Dosan-daero, Gangnam-gu, Seoul, Republic of Korea
©플레인베이글