배경
RN 0.77로 올라가면서 iOS 측의 빌드 함정이 한꺼번에 터졌습니다. Codegen 산출물이 캐시와 충돌해 빌드가 반복 실패하고, DerivedData를 매번 손으로 비워야 했으며, AppIcon은 알파 채널 때문에 App Store 업로드가 거부되는 상태였습니다.
증상마다 사람이 클릭으로 푸는 절차가 4종 존재했지만 정작 누가 어떤 순서로 무엇을 클릭해야 하는지는 머릿속에만 있었습니다. “내 맥에서만 되는” 빌드는 사실 한 사람의 머릿속에서만 되는 빌드였습니다.
접근
4종 빌드 함정을 각각 셸 한 파일로 고정시켰습니다. fix_codegen.sh는 ios/build/generated만 선택적으로 삭제하고 pod install을 자동 실행합니다(전체 build/ 삭제로 시간 낭비하지 않도록). fix_xcode_build.sh는 DerivedData를 일괄 비웁니다.
AppIcon 알파 채널 문제는 fix_icon_transparency.sh에서 sips --composite로 흰 배경을 합성해 통과시켰고, 아이콘 생성은 generate_ios_icons.sh에서 1024pt 원본을 받아 20pt까지 10종을 자동 생성하게 만들었습니다.
빌드는 “사람이 기억하는 절차”가 아니라 “스크립트로 고정된 시퀀스”여야 한다 — 이걸 인정한 순간부터 빌드 시간보다 디버깅 시간이 더 줄었습니다.
마지막으로 package.json에 build:ios:archive → export → upload → testflight 체인을 만들었습니다. xcrun altool로 App Store Connect 업로드까지 한 줄 커맨드 안에 들어가게 됐고, 같은 시점에 발생한 안드로이드 크래시와 앱 멈춤 이슈도 묶어 정리해 양 플랫폼을 같이 안정화했습니다.
결과
- 빌드 실패 시 사람이 클릭으로 푸는 4종 절차 → 1 커맨드 셸 스크립트로 고정 (
fix_codegen.sh/fix_xcode_build.sh/fix_icon_transparency.sh/generate_ios_icons.sh). - AppIcon 알파 채널으로 인한 App Store 업로드 거부 → 통과. 11개 아이콘 PNG + Info.plist 동시 반영.
- TestFlight 업로드를
npm run build:ios:testflight한 줄로 수행 가능 (아카이브 → IPA → altool 체인). - 동일 시점 안드로이드/iOS 안정화 묶음 처리로 두 플랫폼이 같은 날 다시 빌드 가능한 상태에 도달.
배운 점
프론트엔드 작업을 화면 안에만 가두지 않는 게 결과적으로 가장 빠른 길이었습니다. iOS 빌드·코드젠·아이콘·TestFlight 업로드를 내 책임 범위 바깥으로 미루는 순간, “왜 안 되는지 모르겠다”가 매주 반복되는 작업이 됩니다. 셸 4개와 npm 스크립트 4개로 그 반복을 끊은 게 어떤 기능 추가보다 더 큰 시간을 돌려줬습니다.