
특정 단말에서만 발생하는 결함 ― AI와의 대화를 통해 '재현 조건'에 도달하기까지
요약
특정 Android 단말에서 발생하는 초대 링크 결함을 해결하기 위해 Claude Code를 활용하여 가설을 세우고 검증하는 과정을 다룹니다. AI의 가설을 맹신하기보다 실제 유저 데이터와 대조하며 문제의 원인을 찾아가는 CRE의 실무 경험을 공유합니다.
핵심 포인트
- Claude Code를 디버깅을 위한 대화 상대(벽치기)로 활용
- AI가 제시한 가설(App Links, Task Stack)을 실기 검증으로 검토
- AI의 가설과 실제 유저 피드백(캡처 등)을 대조하는 과정의 중요성
안녕하세요! 「가족 앨범 미테네」(이하 미테네)에서 CRE(Customer Reliability Engineering)를 담당하고 있는 사사타츠입니다.
미테네는 아이의 사진이나 동영상을 가족과 공유하고, 성장의 기록을 되돌아볼 수 있는 서비스입니다.
서론
문의 사항으로 보고되었음에도 불구하고, 수중에서는 재현되지 않는다. CRE를 하다 보면 가끔 이런 결함을 마주하게 됩니다.
본 기사에서는 특정 Android 단말(대부분 Galaxy Z Fold7이었습니다)에서만 발생하던 초대 링크의 결함을, AI와의 대화(벽치기) 및 실기 검증을 통해 어떻게 밝혀냈는지 소개합니다.
유저의 목소리
문의 내용은 다음과 같았습니다.
초대 링크를 탭하면 초대 화면이 아니라, 앱의 톱(TOP) 화면이 열려버린다
초대 링크는 미테네에 가족을 초대하기 위한 중요한 동선입니다. 초대 링크를 탭하면 초대 화면이 열리고, 거기서 앨범에 참여할 수 있다. 본래는 그런 흐름으로 되어 있습니다.
그런데 이번에는 그 첫걸음에서 걸려 넘어지고 말았습니다. 모처럼 "미테네의 사진·동영상을 공유하고 싶으니까 초대해야지"라고 생각해주신 유저의 경험을 입구에서 망치고 있습니다. 이것은 어떻게든 해결하고 싶다고 생각했습니다.
그렇게 되면 우선 궁금한 것은 "무엇이 원인일까?" 하는 점이었습니다. 원인만 알 수 있다면 근본적인 개수로 이어질 수 있고, 그것이 어렵더라도 "이렇게 하면 초대 화면을 열 수 있습니다"라는 안내를 유저에게 전달할 수 있기 때문입니다.
재현하기까지의 시행착오
그렇게 생각하며 원인을 찾기 시작했지만, 여기서 큰 벽에 부딪혔습니다. Galaxy Z Fold7 검증기를 준비하여 몇 번을 시도해도, 초대 링크를 탭하면 순조롭게 앨범에 참여할 수 있었고 아무런 문제도 일어나지 않았습니다.
AI가 제시한 가설
이러한 조사에서는 Claude Code를 대화 상대(벽치기 상대)로 삼는 경우가 많습니다.
문의 내용과 Galaxy Z Fold7에서만 발생하고 있다는 점을 전달하고, 초대 링크 주변의 구현에 대해서는 Claude Code에게 관련 부분을 조사하게 한 뒤, "왜 이런 동작이 되는지, 생각할 수 있는 원인을 알려달라"고 물었더니 몇 가지 가설을 제시해 주었습니다.
예를 들어 처음 나온 것은 "App Links[1] 검증 실패"였습니다.
이를 듣고 우선 생각한 것은 "Galaxy Z Fold7 단말의 앱 설정(링크를 브라우저로 여는 설정 등)이 문제를 일으키는 것은 아닐까?" 하는 가능성이었습니다. 하지만 실제로 검증기 설정을 변경하여 브라우저로 여는 설정으로 해보아도, 초대 링크를 통해 브라우저가 열리고, 거기서 앱이 실행되어 초대 화면으로 전환되었습니다.
게다가 만약 이것이 원인이라면 Galaxy Z Fold7 유저뿐만 아니라 더 넓은 범위의 유저에게 영향이 나타나야 합니다. 이번 보고가 Galaxy Z Fold7에 편중되어 있다는 점과도 맞지 않습니다. 이러한 이유로 "App Links의 문제는 아닌 것 같다"고 판단하여 일단 제쳐두었습니다.
다만 돌이켜보면 조금 더 심플하게 구분할 수 있었던 이야기였습니다. 유저로부터 받은 캡처에서는 브라우저가 아니라 앱이 기동되어 앱 TOP이 표시되고 있다는 것을 명확히 확인할 수 있었습니다. App Links 검증이 실패했다면 링크는 브라우저에서 열려야 하므로, "앱은 기동되고 있다 = App Links는 기능하고 있다"라고 더 빠른 단계에서 깨달을 수 있었을 것입니다. AI의 가설을 맹신하지 않고, 유저가 보여주고 있는 사실과 대조하는 것이 중요하다는 것을 느낍니다.
주목한 것은 다른 가설이었습니다.
태스크 스택(Task Stack)의 경합이 원인일지도 모른다. 이미 앱이 기동되어 있는 상태에서 외부로부터 딥링크(Deep Link)가 들어왔을 때, Activity의 실행 모드(launchMode)나 태스크의 상태에 따라 딥링크의 Intent가 예상대로 기존 Activity에 전달되지 않아, 결과적으로 앱 TOP이 열리는 경우가 있다.
이 가설은 "가능성이 있을지도 모르겠다"고 느껴졌습니다. 앱 TOP이 열리는 것은 딥링크가 본래의 전환 대상(초대 화면)에 제대로 전달되지 않기 때문이 아닐까. 그렇게 생각하니 관찰된 사실과 가설의 설명이 맞아떨어졌습니다.
한 번은 재현했지만・・
"최근 사용한 앱" 목록에서 미테네를 한 번 삭제한 뒤, 초대 링크를 탭하면 어떻게 될까요? 만약 정상적으로 동작한다면 태스크 스택의 경합이 원인일 가능성이 높습니다.
이 가설에는 간단히 시도해 볼 수 있는 검증 방법도 함께 제시되어 있었기에, 즉시 검증기인 Galaxy Z Fold7으로 테스트해 보았습니다.
처음 시도했을 때는, '최근 사용한 앱'에 미테네가 남아 있는 상태에서 초대 링크를 탭하면 앱 TOP이 열리는 현상을 재현할 수 있었습니다!
'됐다, 이걸로 원인을 파악할 수 있겠어'라고 생각했지만, 그 후 몇 번이나 같은 절차로 시도해 보아도 더 이상 재현되지 않았습니다. '어라…… 방금 건 기분 탓이었나?' 하며 홀린 듯한 기분이 들었습니다.
또 하나 신경 쓰이는 점이 있었습니다. '최근 사용한 앱에 미테네가 남아 있는 상태에서 초대 링크를 탭한다'는 것은 미테네를 사용하는 유저들에게 매우 흔한 상황입니다. 만약 매번 이 버그가 발생한다면, Galaxy Z Fold7의 극히 일부 유저에게만 국한된다는 점을 설명할 수 없습니다.
'무언가 다른 조건이 있는 게 아닐까'
그렇게 느껴져, 한 단계 더 깊이 파고들어 보기로 했습니다.
재현 조건을 찾아내다
다시 한번 Galaxy Z Fold7이라는 단말에 주목해 보면, 다른 Android 단말과의 가장 큰 차이점은 '접을 수 있다는 것'입니다. 닫힌 상태에서는 커버 디스플레이로, 펼친 상태에서는 내부의 큰 디스플레이로 조작하는 구조로 되어 있으며, 어느 상태에서든 초대 링크를 탭하여 열 수 있습니다.
'혹시, 접고 펴는 것이 관계되어 있을 가능성도...?'
그렇게 가설을 세우고, 개폐 패턴을 바꿔가며 검증해 보았습니다. 참고로, 아래 표의 '직전 앱 이용 시'는 미테네가 '최근 사용한 앱' 목록에 남아 있을 때의, 그 직전 개폐 상태를 의미합니다.
| 직전 앱 이용 시 | 초대 링크 탭 시 | 결과 |
|---|---|---|
| 닫힌 상태 | 닫힌 상태 | 초대 화면이 열림 |
| ... |
미테네가 '최근 사용한 앱'에 남아 있을 때의 개폐 상태와, 초대 링크를 탭했을 때의 개폐 상태가 다르면 초대 화면이 열리지 않고 앱 TOP이 열려 버린다.
이것이 이번의 재현 조건이었습니다. 몇 번을 시도해도 재현되었습니다.
나아가, 추가로 확인된 사실이 있었습니다.
- 사전에 '최근 사용한 앱' 목록에서 미테네를 지워 두면 버그가 발생하지 않는다.
- 일단 앱 TOP이 열려 버려도, 다시 한번 초대 링크를 탭하면 초대 화면이 열린다.
이것들은 처음에 Claude Code가 제시해 준 태스크 스택 (Task Stack)의 경합이라는 가설과도 일치하는 동작으로, '아, 그런 거였구나!' 하고 단번에 이해가 되었습니다.
무슨 일이 일어나고 있었나
저는 네이티브 앱 개발이 본업이 아니기 때문에, 아래 내용은 조사하여 얻은 저 나름의 이해입니다. 코드베이스나 Activity의 동작까지 깊이 파고들어 검증한 것은 아니므로, 현시점에서의 가설로 읽어 주시기 바랍니다.
가설: configuration change (설정 변경)가 트리거
Galaxy Z Fold7과 같은 폴더블 단말은 접고 펼 때마다 화면 크기가 변합니다. Android에서는 이를 'configuration change (설정 변경)'로 취급하며, 이로 인해 Activity가 재생성되거나 태스크 스택 상의 Activity 상태가 예상과 어긋나는 경우가 있습니다.
미테네 앱을 백그라운드에서 실행한 채로 단말을 접거나 펼면, 이 configuration change가 발생합니다. 그 상태에서 초대 링크를 탭하면, 앱의 실행 이력과 태스크 스택의 상태가 경합하여 딥링크 (Deep Link)가 예상한 경로로 처리되지 않고, 초대 화면이 아닌 앱 TOP이 열려 버립니다. 이것이 현시점에서 가장 납득이 가는 가설입니다.
관찰 결과와 대조
다음의 관찰 결과는 태스크 스택의 상태가 경합하여 앱 TOP이 열려 버린다는 위의 가설과도 일치합니다.
- 단말의 개폐 상태가 변하는 타이밍에만 재현된다 (두 번째 탭에서는 정상 동작한다).
- 최근 사용한 앱에서 미테네를 지워 두면 정상 동작한다.
태스크 스택의 상태가 한 번 리셋되면 예상대로 동작하게 될 것이기 때문입니다. 특히 '두 번째 탭에서 정상 동작한다'는 것은, 첫 번째 탭 처리 시 미처 처리되지 않았던 configuration change가 그 시점에 소화되어 태스크 상태가 깨끗해지기 때문이라고 추측하고 있습니다.
덧붙여, 이번 현상은 Galaxy Z Fold7에서의 보고가 대부분이었으나, Galaxy S25 Ultra에서도 1건의 동일한 문의를 받았습니다 (이 건은 화면 회전 등의 configuration change (구성 변경)가 연관된 것이 아닐까 추측하고 있지만, 사용자 측의 실제 조작까지는 확인하지 못했습니다). Galaxy Z Fold7 특유의 문제라기보다는, configuration change가 연관되는 상황 전반에서 발생할 수 있는 동작이 아닐까 하는 것이 현시점에서의 견해입니다.
후일담
이번에 발견한 재현 조건을 바탕으로, 당장의 사용자 안내로는 "최근 사용한 앱 목록에서 'みてね'를 한 번 삭제한 후, 다시 한번 초대 링크를 탭해 보세요"라고 안내하고 있습니다.
실제로 이 안내를 받은 일부 사용자분들로부터 "무사히 초대 화면이 열렸습니다!"라는 연락을 받을 수 있었고, 안도의 한숨을 내쉴 수 있었습니다. "みてね의 사진·동영상을 공유하고 싶어서 초대해야지"라고 생각해주신 사용자의 경험을 입구에서부터 망치지 않을 수 있었다는 점에, CRE로서 매우 기쁜 마음이 들었습니다.
AI와의 벽치기(Wall-hitting)에서 효과를 본 3가지 고안
Android의 태스크 스택 (Task Stack)이나 configuration change에 대해 제가 아주 해박한 것은 아닙니다. 그럼에도 이번 조사가 진전될 수 있었던 것은, AI와의 상호작용과 수동 검증을 조합하여 다음과 같은 고안을 거듭했기 때문이라고 생각합니다.
전제 정보를 정확하게 전달하기: 수동으로 재현되지 않는 결함일수록, AI에게 얼마나 정확하게 전제 정보를 전달할 수 있는지가 중요합니다. 전달해야 할 내용으로는 예를 들어 다음과 같은 것들이 있습니다.
- 사용자가 보내주신 캡처나 문의 내용 (1차 정보)
- "브라우저가 아니라 앱이 실행되고 있다", "앱 TOP 화면이 열려 있다"
AI 자동 생성 콘텐츠
본 콘텐츠는 Zenn AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기