#DevOps

토스의 디바이스 팜 만들기

토스의 디바이스 팜 만들기
01

Summary

Appium을 과감히 버리고, 10배 빠른 '자체 디바이스 팜' 구축한 토스의 비결

API 호출 한 번으로 수백 대의 실기기를 실시간 제어하는 '네뷸라'의 아키텍처 분석

토스가 사내에 흩어져 있던 테스트 기기를 하나로 묶고 원격 자동화를 실현한 사내 디바이스 팜 '네뷸라' 개발기입니다. 업계 표준으로 쓰이던 Appium의 고질적인 속도 저하와 무거운 세션 방식의 한계를 극복하기 위해, 토스 엔지니어들은 기기 제어 드라이버와 화면 스트리밍 기술을 직접 내재화하기로 결정했습니다. 이를 통해 대기 시간을 획기적으로 단축하고 실시간 웹 조작까지 가능케 한 여정을 자세히 소개합니다.

  • 01자체 Nebula Driver 개발로 Appium 대비 클릭 13.5배, 텍스트 입력 10배 속도 향상
  • 02기기 제어를 Stateless HTTP 호출 구조로 설계하여 기존 15~40초 수준의 세션 수립 지연 차단
  • 03Kafka 메시지 큐와 occupy/assign/release 분산 락 알고리즘 기반의 기기 점유 및 테스트 실행 오케스트레이션
  • 04안드로이드 가상 디스플레이(SurfaceControl)와 MediaCodec H.264 인코딩을 활용한 초저지연 실시간 미러링 직접 구현
  • 05토스 전용 한글/이모지 IME 탑재 및 사내 앱센터 사전 배포 빌드 즉시 연동 등 강력한 커스텀 편의성

RECOMMENDATION

모바일 앱 테스트 자동화 규모가 커지면서 기기 관리 비용과 테스트 실행 지연으로 고통받는 개발 조직에 강력히 추천합니다. 기존 오픈소스 범용 프레임워크의 한계를 정면으로 조명하고, 전사 플랫폼 관점에서 맞춤형 인프라를 직접 구축하여 얻을 수 있는 생산성 혁신의 레퍼런스를 제공합니다.

The Problem

기존 토스에서는 개발팀들이 각자 테스트용 스마트폰 실기기와 맥미니를 연결하여 개별적으로 디바이스 팜을 운영했습니다. 이로 인해 Appium 설정 오류, 기기 연결 끊김 현상 해결 등의 관리 공수가 팀마다 중복 발생하였고 자원이 격리되어 전사 차원의 효율적인 활용이 불가능했습니다.

The Solution

수백 대 규모의 실기기를 API 호출 한번으로 원격 제어할 수 있는 사내 디바이스 팜 '네뷸라(Nebula)'를 구축했습니다. Appium을 대체하는 자체 'Nebula Driver'를 개발하여 무상태(Stateless) HTTP 방식으로 기기를 상시 제어하고, Kafka와 분산 락을 통한 오케스트레이션 및 Android의 SurfaceControl/MediaCodec을 직접 활용한 실시간 화면 스트리밍을 구현했습니다.

The Result

동작 전 대기 시간(waitForIdle)을 제거하여 Appium 대비 엘리먼트 클릭 속도는 13.5배, 텍스트 입력 속도는 10배 향상되었습니다. 또한 세션 생성 시 발생하던 15~40초의 초기 지연을 제거하고, 기기 규모를 100대 이상으로 확장하는 데 성공했습니다.

Trade-off

속도 우선 정책을 위해 화면이 안정될 때까지 기다리는 대기 로직을 최소화했기 때문에, 화면 전환이 극도로 빠른 UI에서는 드라이버의 오작동 확률이 범용 도구 대비 증가할 가능성이 존재합니다. 아울러 완전 자체 개발 드라이버이기 때문에 향후 모바일 OS 버전 업그레이드 시 커뮤니티의 도움 없이 자체 유지보수 비용을 지속 지불해야 합니다.

03

Key Concepts

Concept · 01

Nebula Driver

토스가 기존 Appium의 속도와 세션 제약 문제를 해결하기 위해 UIAutomation과 XCTest 위에 직접 구현한 경량 드라이버입니다.

  • Appium의 화면 대기 필터를 제거하여 클릭 및 텍스트 입력의 응답 시간을 최소 10배 이상 단축했습니다.
  • Stateless HTTP 호출 프로토콜을 사용해 매번 세션을 맺는 고정 오버헤드를 완전히 걷어냈습니다.
Concept · 02

분산 락 (Distributed Lock)

여러 호스트나 비동기 워커가 공용 자원에 동시 접근할 때, 자원의 일관성을 지키기 위해 하나의 접근 주체에만 독점 사용권을 부여하는 제어 메커니즘입니다.

  • 오케스트레이션 서버에서 occupy, assign, release의 세 단계 과정을 통해 특정 실기기에 테스트 요청이 중복 할당되는 상황을 원천 방지합니다.
Concept · 03

실시간 화면 스트리밍 (Real-time Stream)

원격 서버실에 보관 중인 스마트폰의 화면 출력을 캡처 및 압축하여 실시간으로 개발자의 브라우저 화면에 전송하는 기술입니다.

  • 안드로이드 OS 내부의 SurfaceControl 디스플레이 스트림을 가로채어 MediaCodec 기반의 H.264 압축 비디오 형태로 고속 스트리밍합니다.