
넉넉해 보였던 목표
SyncGallery를 만들기 시작할 때 저희는 분명한 성능 목표를 정했습니다. 기기에 미디어 파일이 10만 개 있어도 앱이 빠르게 작동해야 한다는 것이었죠. 모든 알고리즘을 그 숫자를 염두에 두고 작성했고, 대략 그 정도 크기의 라이브러리로 테스트했습니다.
당시에는 10만 개면 넉넉해 보였습니다. 하루도 빠짐없이 매일 사진 30장을 찍어도 그 수에 이르려면 약 9년이 걸립니다. 휴대전화에 그보다 많은 파일을 두는 사람은 없을 거라고 확신했습니다.
사용자들이 틀렸음을 보여 주었습니다
첫 출시 직후, 그 가정이 얼마나 틀렸는지 알게 되었습니다. 실제 라이브러리는 저희가 정한 한계보다 훨씬 컸습니다. 수년 치 카메라 보관 사진, 예전 휴대전화와 컴퓨터에서 옮겨 온 사진, 대용량 메모리 카드에 저장된 가족 사진 전체가 있었습니다. 여전히 많은 Android 휴대전화가 512GB나 1TB 메모리 카드를 지원하며, 이는 원래 목표보다 몇 배나 큰 라이브러리를 담을 수 있는 공간입니다.
앱이 100,001번째 파일에서 갑자기 멈춘 것은 아닙니다. 성능 한계는 그렇게 친절하게 드러나지 않습니다. 대신 즉시 끝나야 할 작업이 눈에 띄게 오래 걸렸고, 라이브러리가 목표를 넘어 커질수록 사용 경험은 점점 나빠졌습니다. 가장 큰 라이브러리를 가진 사람들, 어쩌면 백업 앱이 가장 필요한 사람들에게 그것은 충분하지 않았습니다.
규모가 10배가 되면 무엇이 달라질까
파일 10만 개에서는 문제없던 많은 지름길이 100만 개에서는 문제가 됩니다. 패턴은 늘 같습니다. 라이브러리와 함께 비용이 조용히 커집니다.
- 모든 것을 메모리에 담아 두기. 항목 10만 개짜리 목록은 RAM에 넉넉히 들어갑니다. 그 10배 크기에 여러 화면과 캐시가 곱해지면 메모리 부족으로 화면이 끊기고, 최악의 경우 앱이 멈춥니다.
- 몇 개만 바뀌었는데 모든 파일을 다시 확인하기. 사진 몇 장이 들어왔다고 라이브러리 전체를 다시 살펴보는 일은 파일 10만 개에서는 거의 티가 나지 않습니다. 100만 개에서는 눈에 보이는 이득 없이 몇 분 동안 백그라운드 작업이 이어질 수 있습니다.
- 변경이 있을 때마다 화면 업데이트하기. 처리한 파일마다 한 번씩 업데이트하는 것은 작은 라이브러리에서는 알아차리기 어렵습니다. 변경이 수만 개씩 몰려오면 화면이 멈출 수 있습니다.
- 캐시가 끝없이 커지도록 두기. 크기 제한이 없는 캐시는 결국 속도를 높이려던 바로 그 화면과 자원을 다투게 됩니다.
이것들은 특이한 버그가 아닙니다. 규모가 한 자릿수 커지면 더 이상 통하지 않는 평범한 설계 결정입니다.
100만 개를 목표로 다시 만들기
저희는 목표를 파일 100만 개로 높이고, 그 숫자를 새로운 기준으로 삼아 앱 전체를 다시 살펴보았습니다. 이제 몇 가지 원칙이 저희가 만드는 모든 것을 이끕니다.
- 라이브러리가 커져도 메모리 사용량은 일정하게. 가장 무거운 목록 화면은 이제 모든 것을 메모리에 담아 두지 않고 데이터베이스에서 파일을 구간별로 불러옵니다. 큰 이미지 캐시에는 크기 제한이 있어 끝없이 커지지 않고 오래된 항목을 비웁니다. 이 작업은 화면별로 계속 진행 중입니다. 모든 곳에서 결승선을 통과했다는 뜻이 아니라, 이제 저희가 지키며 개발하는 원칙이라는 뜻입니다.
- 다시 읽지 말고 비교하기. 스캔은 모든 것을 다시 처리하지 않고 무엇이 바뀌었는지 추적합니다. 클라우드 서비스가 변경 피드를 제공하면 폴더 전체를 다시 나열하지 않고 그 변경 사항을 사용합니다.
- 화면이 라이브러리를 기다리게 하지 않기. 무거운 작업은 보이지 않는 곳에서 묶음 단위로 실행됩니다. 화면 업데이트를 합쳐서 처리하므로 변경 10,000건이 한꺼번에 들어와도 화면을 10,000번 다시 그리지 않습니다.
- 실제 라이브러리를 담은 실제 기기에서 측정하기. 추측 대신 프로파일링을 합니다. 가장 큰 개선은 측정하지 않았다면 결코 의심하지 않았을 곳에서 나왔습니다.
빠른 속도는 이정표가 아니라 습관입니다
가장 중요한 변화는 어느 한 가지 수정이 아니었습니다. 파일 100만 개라는 질문을 모든 새 기능을 평가하는 방식의 일부로 만든 것입니다. 라이브러리가 예상보다 10배 크다면 이 화면, 이 스캔, 이 캐시는 어떻게 될까?
저희가 어떤 숫자를 정하든 누군가는 그 숫자를 넘어설 것이고, 이번에는 미리 준비해 두고 싶습니다.
라이브러리가 아주 크다면, 이 작업은 바로 당신을 위해 한 것입니다. 사용하시는 컬렉션에서 SyncGallery가 느리게 느껴진다면 알려 주세요. 실제 라이브러리는 인위적인 벤치마크보다 훨씬 많은 것을 알려 줍니다.
SyncGallery 사용해 보기
클라우드 동기화를 직접 제어하는 Android용 갤러리 앱.
Google Play에서 다운로드