Liabooks Home|PRISM News
48시간의 디버깅: React Native 터치 버그를 잡기까지
인사이트Digest

48시간의 디버깅: React Native 터치 버그를 잡기까지

7분 읽기

간헐적으로 발생하는 iOS 터치 버그를 추적한 48시간의 기록. 4개의 가설, 체계적인 검증, 그리고 React Native New Architecture의 함정을 발견하기까지.

48시간의 디버깅: React Native 터치 버그를 잡기까지

간헐적 버그, 4개의 가설, 그리고 아키텍처의 함정


앱이 먹통이 됐다

"버튼이 안 눌려요."

PRISM 앱 테스트 중이었다. 기사 상세 화면에서 목차 버튼을 누르는데 아무 반응이 없다. 뒤로가기도 안 되고 언어 변경 버튼, 좋아요 버튼, 댓글 입력까지 전부 먹통이다. 이상하게도 스크롤은 된다. 화면을 위아래로 쓸어내리는 건 작동하는데 버튼을 탭하면 전혀 반응이 없다.

앱을 완전히 종료했다가 다시 켜면 돌아오지만 기사 몇 개를 왔다갔다 하면 또 먹통이 된다. 패턴이 안 보이고 무작위처럼 보였다.

나는 오랜 기간 테스트 자동화를 해온 개발자 출신이라 무작위처럼 보이는 버그도 반복 테스트로 패턴을 찾을 수 있다는 걸 안다.


AI로 앱을 만들고 있다

PRISM 앱의 거의 모든 코드는 Claude Code로 작성했다. React Native 전문가여서가 아니라 AI가 있으니까 가능했던 거다. "이런 기능 만들어줘"하면 코드가 나왔고 대부분 잘 작동했다. 4개 언어 지원, 푸시 알림, 광고 통합, 구독 시스템까지 예전 같으면 시도조차 못 했을 것들이다.

그런데 이 터치 버그 앞에서 막혔다. "터치가 안 돼. 왜 그런지 알아?"라고 물으니 AI는 여러 가설을 제시하며 하나씩 검증해보자고 했다. 문제는 AI도 원인을 모른다는 거였다.


첫 번째 시도: Gesture Handler 충돌

AI의 첫 번째 가설은 이랬다. "목차 기능에 @gorhom/bottom-sheet를 쓰고 있는데, GestureHandlerRootView가 중첩되어 있어서 제스처 충돌이 발생할 수 있습니다."

예전에 제스처 충돌로 목차 기능을 임시 비활성화한 적도 있었기에 그럴듯하게 들렸다. Bottom Sheet를 React Native 기본 Modal로 교체했지만 결과는 실패였고 문제는 그대로였다.


두 번째 시도: 광고 오버레이

두 번째 가설은 광고였다. "인터스티셜 광고가 닫힌 후 투명한 오버레이가 남아서 터치를 가로채는 건 아닐까요?"

Google AdMob을 쓰고 있었고 iOS 네이티브 광고는 별도 UIWindow를 생성하기 때문에 광고 표시 후 문제가 더 자주 발생하는 것 같기도 했다. 광고를 완전히 비활성화하고 테스트했더니 빈도가 줄긴 했지만 여전히 발생했다. 광고가 악화 요인일 수는 있어도 근본 원인은 아니었다.


패턴을 찾다: 화면 전환 14~15회

무작위처럼 보이는 버그에도 패턴은 있다. 반복 테스트를 수십 번 돌리면서 조건을 하나씩 바꿔봤더니 앱 시작 직후에는 문제가 없고 기사 몇 개 정도는 괜찮지만 화면 전환을 14~15번 반복하면 문제가 발생한다는 걸 알아냈다. 화면 전환 횟수와 문제 발생 사이에 상관관계가 있었다.

이 발견을 바탕으로 AI에게 "이전 화면의 터치 핸들러가 해제되지 않고 남아있는 건 아닐까?"라고 물었다. detachInactiveScreens: true 옵션으로 비활성 화면을 분리했더니 빈도가 줄긴 했지만 여전히 발생했다. 근본 원인이 아니라 증상 완화에 불과했지만 "화면 전환"이 핵심 변수라는 건 확실해졌다.


전환점: 질문을 바꾸다

이틀째가 됐을 때 문득 생각이 바뀌었다. "코드 문제가 아니라면?"

지금까지 내 코드나 라이브러리에 문제가 있다고 가정했는데 React Native 자체에 버그가 있다면 어떨까? 프로젝트 설정을 다시 살펴봤다.

// ios/Podfile.properties.json
{
  "newArchEnabled": "true"
}

New Architecture, 즉 Fabric이라 불리는 React Native의 새 렌더링 시스템이 Expo SDK 54에서 기본 활성화되어 있었다.

"GitHub Issues에서 비슷한 사례 찾아봐"라고 AI에게 시켰더니 찾아냈다.

  • #37755 - "Touch events stop working intermittently on iOS with Fabric"
  • #38511 - "RCTSurfaceTouchHandler sometimes fails to register touches"

증상이 정확히 일치했다. 간헐적 발생, iOS에서만, 화면 전환 후 빈번, 스크롤은 되는데 탭은 안 됨.

AI가 찾아준 거지만 "GitHub에서 찾아봐"라는 방향 전환은 내가 한 거였다. AI는 시키지 않으면 스스로 커뮤니티를 뒤지지 않는다.


해결: 아키텍처 롤백

New Architecture를 껐다.

{
  "newArchEnabled": "false"
}

충돌 가능성 있는 라이브러리들도 함께 제거했다.

npm uninstall react-native-reanimated react-native-worklets @gorhom/bottom-sheet

Reanimated 대신 기본 Animated API로, Bottom Sheet 대신 기본 Modal로 대체한 뒤 iOS 빌드를 재생성하고 테스트했다. 50회 이상 화면 전환에서 터치 문제 0건.


배운 것들

1. 간헐적 버그는 아키텍처를 의심하라

재현이 어렵고 무작위로 발생하면 코드 레벨이 아닐 가능성이 높다. 레이스 컨디션, 메모리 문제, 프레임워크 버그일 수 있으니 2일 이상 막히면 한 단계 위를 보라.

2. 의존성은 비용이다

react-native-reanimated@gorhom/bottom-sheet는 좋은 라이브러리지만 네이티브 코드가 포함되어 있어서 아키텍처 변화에 취약하다. 기본 API로 충분하면 외부 의존성 추가는 신중해야 한다.

3. 체계적 기록이 답을 준다

가설 → 검증 → 기록 → 다음 가설의 사이클을 반복하면서 틀린 가설들도 기록으로 남겼다. 그 기록 덕분에 "그럼 뭐가 남았지?"라는 질문이 가능했다.

4. AI는 조력자다

AI는 가설을 제시하고 코드를 작성하고 검증 방법을 제안하지만 "질문을 바꿔보자"는 전환은 내가 했다. AI는 강력한 도구지만 어디까지나 도구다.


마무리

48시간의 디버깅은 AI 코딩의 가능성과 한계를 동시에 보여줬다. 배경지식 없이도 앱을 만들 수 있지만 프레임워크 깊숙한 곳의 버그는 결국 내가 파고들어야 한다.

AI가 코드를 대신 써주는 시대라 할지라도 개발자가 필요 없어지는 건 아니다. 오히려 반대다. AI는 "어떻게"를 해결해주지만 "무엇이 문제인지", "어디를 봐야 하는지", "언제 방향을 바꿔야 하는지"는 여전히 사람의 몫이다. 코드를 치는 시간은 줄었지만 판단하는 능력은 더 중요해졌다.

이번 버그에서 AI는 4개의 가설을 제시했고 전부 틀렸다. 맞는 답을 찾은 건 "질문을 바꾸자"고 결정한 순간이었다. 그 결정은 AI가 못 한다.

비슷한 상황에 처한 누군가에게 전한다. 질문을 바꿔보라. 한 단계 위를 보라. 커뮤니티를 뒤져라. 그리고 기록하라.


2026년 1월

의견

기자

황민

"현장에서 17년, 이제는 기술을 이야기합니다"

관련 기사