Skip to content

v0.0.3

Choose a tag to compare

@LESANF LESANF released this 15 Sep 02:54
· 88 commits to master since this release
e524685

Warning

여전히 PoC 입니다. 0.0.x 는 API·구조 안정성을 약속하지 않습니다.

0.0.2 가 "빌드는 된다" 를 확인한 릴리즈였다면, 0.0.3 은 조용히 틀리는 것들을 찾아낸
릴리즈입니다. 방법을 두 가지로 바꿨습니다 — 실패해도 아무 소리가 안 나는 경로를 찾아 찔러보고,
템플릿을 읽는 대신 생성한 프로젝트에서 실제로 기능을 붙여봤습니다.

배포된 앱까지 갔을 버그

크래시 리포터가 부팅을 죽일 수 있었습니다

runStage 가 catch 블록 안에서 onStageError 를 불렀습니다. 콜백이 throw 하면 catch 를
뚫고 나가 runPreloader 가 reject 되고, splash 가 끝나지 않아 앱이 아예 뜨지 않습니다.
이 콜백들은 이미 뭔가 잘못됐을 때 불리고, onStageError 에 붙일 건 뻔히 Sentry 입니다 —
리포터가 초기화 전이면 부팅이 통째로 죽습니다. 화면도 로그도 리포트도 없는 최악의 실패입니다.

실패 기록을 콜백보다 먼저 하도록 바꿨습니다. 전에는 콜백이 throw 하면 건네주던 기록까지
사라졌습니다.

인코딩된 딥링크 파라미터가 라우팅을 깨뜨렸습니다

파서가 경로를 나눠 세그먼트별로 디코딩한 뒤, 다시 이어 붙인 문자열을 재분할했습니다.

링크 전 후
menu-4/a%2Fb 3세그먼트 → 매칭 실패 2세그먼트 → 정상
menu-4/a%20b /(tabs)/menu-4/a b — 생 공백이 router.navigate 로 .../a%20b
한글 id 디코딩 후 재인코딩 없음 왕복 정상

증상은 "푸시를 눌러도 아무 일이 없다" 입니다. 백그라운드·앱 종료 상태라 콘솔도 못 봅니다.
세그먼트 배열이 원본이고 경로는 거기서 파생됩니다.

Android release 서명이 조용히 빠질 수 있었습니다

서명 주입은 app/build.gradle 을 AGP 템플릿에 대고 정규식으로 고칩니다. 앵커가 빗나가면
두 방향으로 깨지는데 한쪽은 그대로 출시됩니다 — buildTypes 치환이 실패하면 release
빌드가 debug 키를 그대로 씁니다. signingConfigs 와 buildTypes 사이에 주석 한 줄만
끼어도 첫 앵커가 깨지는 것을 실측했고, 그게 지금 회귀 테스트입니다. 두 앵커 모두 실패 시
고쳐야 할 정규식 이름과 함께 throw 합니다.

import 경계가 가장 중요한 곳에서 사문화돼 있었습니다

flat config 는 같은 rule 키를 쓰는 블록 중 마지막 것만 적용합니다. cross-feature 블록이
같은 no-restricted-imports 를 다시 써서 providers 규칙을 src/features 전체에서 덮었습니다 —
feature 가 providers 를 import 하는 게 바로 그 규칙이 막으려던 구조 파괴인데, 거기만 비어
있었습니다. 두 severity 가 rule 키를 하나씩 나눠 갖습니다.

실무가 바로 부딪히는 구멍

auth 게이트는 AUTH_LOGIN_PATH 로 push 하고, 재생을 위해 원래 목적지를 먼저 저장합니다.
그 라우트가 없었습니다. gates: ['auth'] 를 쓰는 첫 앱 — 실무에서 당연히 쓰는 것 —
이 +not-found 에 떨어지고, 보류 의도는 이미 저장된 뒤라 빠져나갈 길도 없습니다.

템플릿은 모든 탭에 자리표시 화면을 싣는데 자기 메커니즘이 요구하는 그 하나만 없었습니다.
같은 방식으로 채웠고 계약은 하나입니다 — 성공하면 signIn(tokens). 개발용 로그인
버튼은 __DEV__ 안이라 릴리즈 빌드에 나오지 않습니다.

생성한 프로젝트에 탭·API 도메인·상세 라우트·게이트 딥링크를 붙여서 찾았습니다.
그 외에는 템플릿을 고칠 일이 없었습니다.

테스트를 넣고, 다시 줄였습니다

8 스위트 64 케이스, 네이티브 모듈 목은 0개입니다. MMKV·RNFB·notifee·reanimated 를
목으로 세우자 목을 실제 API 와 맞추는 일이 본업이 됐습니다 — v4 는 delete 가 아니라
remove 인데 이름이 어긋난 목은 테스트가 생길 때까지 아무 소리도 안 냅니다. jest-setup.ts
를 지웠고, 남은 것은 목 없이 도는 순수 로직뿐입니다. 화면·스토어 테스트는 필요한 앱이 자기
방식대로 세웁니다.

CI 가 PR 마다 check-all 을 돌립니다 — 그동안 아무것도 돌지 않았습니다.

버전은 npm 이 아니라 Expo 가 정합니다

pnpm doctor 와 npx expo install --check 가 판정 기준이고 AGENTS.md ④ 에 박았습니다.
react-native 가 npm 최신 0.87.1 이 아니라 0.86.3 인 이유는 SDK 57 의
bundledNativeModules.json 이 그렇게 고정하기 때문입니다 — 손으로 올리면 코드젠·Podspec 이
expo 모듈들과 어긋납니다.

Xcode 27 은 Simulator.app 을 DeviceHub.app 으로 대체했습니다. fallback 이 이미
@expo/cli 에 있습니다(expo/expo#46757) —
devices:// 스킴 등록과 xcrun simctl 동작을 실측했으니 문서의 딥링크·푸시 검증 명령은
그대로 유효합니다. 템플릿이 할 일은 없습니다.

검증

expo install --check Dependencies are up to date
expo-doctor 18/18
check-all lint · tsc · 64 테스트

이 계보 앞에서 확인한 것: 이 템플릿으로 만든 프로젝트가 iOS·Android 양쪽에서 설치 가능한
바이너리까지 나오고, 식별자가 네이티브 프로젝트까지 그대로 갑니다.

아직 검증되지 않은 것

런타임입니다. 앱이 뜬 뒤를 아무도 보지 않았습니다.

  • 콜드 부팅 splash → tabs 이음새
  • InsetView 가 실제로 탭 전환 덜컹거림을 없앴는지
  • 딥링크 콜드/웜 진입 · 푸시 3경로(FCM/APNs 키 필요)
  • Xcode 27 에서 pnpm ios:development 가 DeviceHub 를 여는지
  • iOS NSE(리치 푸시 이미지)는 여전히 미포함

호환성

Expo SDK 57 (~57.0.22)
React Native 0.86.3
React 19.2.3
expo-router ~57.0.21
Xcode 26.4+ (27 확인)
패키지 매니저 pnpm 11.10.0

시작하기

npx create-lesa-app my-app

전체 변경 내역

CHANGELOG.md ·
v0.0.2...v0.0.3