작성자: Mauricio Vergara (Product Marketing Manager), Thousand Ant. 기고문 포함
이 글의 원문은 여기서 확인하실 수 있습니다.
Lyft는 무엇보다도 우수한 앱 성능을 중시합니다. 탑승자 수천만 명과 운전자 수십만 명이 이용하는 승차 공유 서비스로서 영향력이 광범위한 만큼, 앱 속도 저하, 프레임 정지, 비정상 종료가 발생하면 수천 명이 넘는 사용자가 시간을 낭비하게 됩니다. 이처럼 사소한 문제로도 수많은 탑승자와 운전자를 경쟁사에 빼앗길 수 있습니다. 하지만 다행히도 Lyft의 개발팀은 앱 성능을 주시하던 중, 운전자의 Android 앱 시작 시간이 늘어난 것을 발견했습니다.
개발팀은 문제의 원인을 신속히 파악해 해결 방법을 알아내고 이를 위한 투자가 필요하다는 점을 경영진에 설명해야 했습니다. 그러려면 다음과 같은 어려운 질문들에 대한 답이 필요했습니다. ‘앱 성능의 병목 현상은 어디에서 발생하고 사용자 환경에 어떤 영향을 줄까? 개발팀은 이 문제를 얼마나 위급하게 여기고 대처해야 할까?’ 다행히 이들에게는 적절한 툴이 있었습니다. Android 기기에서 앱 안정성과 성능을 개선하기 위해 Google Play가 마련한 Android vitals를 사용해 어디에서 문제가 발생하는지 확인하고, 이 문제를 시급히 해결해야 하는 이유를 경영진에 전달했으며, 적은 리소스로 문제를 해결할 수 있었습니다. 지금부터 그 과정을 소개하겠습니다.
Lyft의 개발팀이 가장 먼저 해야 했던 일은 이것이 과연 경영진을 설득해 리소스를 투입할 만큼 시급한 문제인지 알아내는 것이었습니다. 앱 품질 개선을 위한 제안을 할 때 으레 그렇듯, Lyft Driver 앱의 시작 시간 단축 또한 제품 신기능 소개, 아키텍처 및 데이터 과학의 개선 등 개발 리소스가 필요한 다른 사안과 우선순위를 저울질해야 했습니다. 앱 품질에 투자하도록 경영진을 설득할 때 부딪히는 난관 중 하나는 성능 개선과 비즈니스 메트릭의 상관관계를 밝히기 어렵다는 점입니다.
개발팀은 상황을 정확히 파악하기 위해 Android vitals를 활용했습니다. Android vitals를 이용하면 ANR 오류, 배터리 소모, 렌더링, 앱 시작 시간과 같은 앱 성능 관련 데이터에 액세스하고, 메트릭별로 현재까지의 성능을 실제 기기에서 추적하며 같은 카테고리에 속한 다른 앱의 성능과 비교할 수 있습니다. Lyft 개발팀은 이 강력한 툴을 이용해 Lyft Driver 앱 시작 시간이 동일 카테고리의 다른 앱 10종보다 15~20% 느리다는 것을 발견하고, 이를 시급한 문제로 판단했습니다.
다음으로, 개발팀은 속도 저하가 비즈니스 목표와 사용자 환경에 미치는 영향을 감안해 프로젝트 범위를 설정해야 했습니다. Android vitals를 통해 승차 공유 분야의 경쟁사와 데이터를 직접적으로 비교한 후, 개발자 한 명이 한 달간 이 문제에 집중하면 앱 시작 시간이 상당히 단축될 것이라는 결론을 내렸습니다.
개발팀은 이처럼 풍부한 데이터와 우수한 앱 성능을 내세워 경영진을 설득했습니다. 사용자 경험 개선을 강조하고, 합리적이고 달성 가능한 목표 및 범위를 설정했으며, 정확한 경쟁사 비교 데이터를 제시한 결과, 프로젝트가 승인되었습니다.
Lyft는 Time to interact('완전히 표시하는 데 걸린 시간'이라고도 함)를 기본 시작 메트릭으로 사용합니다. 여기에 영향을 미치는 요인을 파악하기 위해, 개발팀은 앱 시작 시의 각 단계를 프로파일링하여 지연이 발생하는 원인을 찾았습니다. Lyft Driver 앱은 네 단계로 시작합니다. 1) 먼저, 앱 프로세스를 시작합니다. 2) Activity가 UI 렌더링을 시작합니다. 3) Bootstrap이 홈 화면을 렌더링하는 데 필요한 데이터를 네트워크에 요청합니다. 4) 마지막으로, Display가 운전자 인터페이스를 엽니다. 정밀한 프로파일링을 통해 세 번째 단계인 Bootstrap에서 속도 저하가 발생하는 것을 발견했습니다. 병목 현상의 원인을 파악한 후, 개발팀은 여러 단계에 걸쳐 문제를 해결했습니다.
먼저, 시작 경로에서 불필요한 네트워크 호출을 줄였습니다. 백엔드 서비스를 분석한 후 시작 경로에서 몇 가지 네트워크 호출을 안전한 방식으로 제거하고,. 가능한 경우에는 네트워크 호출을 비동기로 처리했습니다. 앱 시작 시 필수적인 데이터가 아니라면 데이터 없이도 시작 프로세스를 진행할 수 있도록 호출을 논블로킹(non-blocking)으로 변경하고 블로킹 네트워크 호출은 안전하게 백그라운드로 옮겼습니다. 마지막으로, 세션 간에 캐시 데이터를 저장하기로 했습니다.
사소한 변화처럼 보일 수 있지만, 앱 시작 시간은 놀랍게도 21% 단축되었고, 이에 따라 Lyft Driver의 운전자 세션은 5% 증가했습니다. 개발팀은 이에 그치지 않고 경영진의 승인을 얻어 모바일 전용 성능 워크스트림을 만들고 엔지니어를 더 투입했습니다. 프로젝트의 성공이 기업 전체에 알려지자 몇몇 관리자가 앱 품질에 투자하는 방법을 문의해 오기도 했습니다.
Lyft의 성공 사례를 통해 다른 기업에도 적용 가능한 여러 교훈을 얻었습니다.
앱과 함께 기업 또한 성장하면서, 우수한 앱 성능이 그 어느 때보다 중요해졌습니다. 개발자들은 앱을 가까이서 살피는 만큼 성능 문제를 누구보다도 먼저 인지하지만, 기업 전체에 문제를 알리기는 어려울 수 있습니다. 이때 Android vitals를 사용하면 개발자가 관찰한 사항을 데이터로 간단히 나타내면서 성능 관련 메트릭과 비즈니스 사례의 연관성을 한눈에 보여 줄 수 있습니다.
우수한 앱 성능을 위한 자체 프로젝트를 시작하려면 먼저 작은 성과부터 거두고 나서 이를 확대해 나가는 것이 좋습니다. 실행 가능한 프로젝트를 신중히 선택해야 적은 양의 리소스로도 의미 있는 결과를 얻을 수 있습니다.
비개발 부서도 개발팀과 함께 협업하여 앱 품질을 향상하도록, 사전에 자주 소통해야 합니다. 목표, 계획, 결과를 지속적으로 공유함으로써 모든 팀의 참여를 유도할 수 있습니다.
Android 생태계에는 Android vitals 외에도 앱 시작 시간과 전반적인 성능을 파악하고 개선하는 데 도움이 되는 툴이 많습니다. 또 다른 보완 툴인 Jetpack Macrobenchmark는 개발과 테스트 시 여러 메트릭에 대한 정보를 제공합니다. 실제 사용자 기기의 데이터를 제공하는 Android vitals와 달리, Macrobenchmark는 코드의 특정 영역을 로컬로 벤치마킹 및 테스트하며, 그 예시로 앱 시작 시간이 있습니다.
Jetpack 앱 시작 라이브러리는 앱 시작 시 구성 요소를 초기화하는 간단하고도 효과적인 방법을 제시합니다. 이 라이브러리를 사용하면 시작 시퀀스를 간소화하고 초기화 순서를 간단히 명시할 수 있습니다. 또한 도달범위 및 기기를 확인하면 사용자와 문제의 분포 상황을 파악하여 어떤 사양에 맞추어 앱을 설계할지, 어느 지역에 앱을 출시할지, 어떤 항목을 테스트할지 결정하기 쉬워집니다. 이 툴의 데이터를 통해 앱 품질 개선을 위한 우선순위를 정하고 무엇을 개선해야 사용자 대다수에게 큰 혜택이 돌아갈지 확인할 수 있습니다. 마지막으로 소개할 툴은 Perfetto로, 코드를 측정하고 시작 문제를 진단하는 데 사용하는 오픈소스 시스템 추적 툴입니다. 이런 여러 툴을 적절히 조합해 사용한다면 앱이 계속 원활히 실행되고, 사용자가 앱에 만족하며, 기업 전체가 앱 품질 개선의 중요성을 인지하게 될 것입니다.
여러분의 앱 성능을 개선하거나 Lyft에 합류하고자 하신다면, 여기에서 PO(Product Owner) 및 경영진을 위한 사례 연구 요약본을 확인해 보세요.