Expo 55에서 57로 한 번에 올리다 라우터와 인증이 같이 깨진 날
Expo 57 업그레이드로 expo-router import가 깨지면 딥링크 인증 콜백까지 막혀요. 백엔드 관점의 원인과 점검 순서를 정리했어요.
모바일 SDK 업그레이드는 프론트 일이라고 생각했어요. 직접 겪어 보니 아니었어요. Expo 55에서 57로 두 버전을 한 번에 올린 날, 가장 먼저 무너진 건 화면이 아니라 인증 흐름이었어요.
라우터가 깨졌는데 왜 서버 로그를 봤나
Expo 57부터 expo-router가 react-navigation 포크로 바뀌면서, @react-navigation/*을 직접 import하던 코드가 통째로 깨져요. 직접 올려 보니 화면 전환이 안 되는 건 금방 눈에 들어왔는데, 진짜 문제는 그 뒤에 있었어요. 앱이 라우트를 못 찾으니 딥링크로 들어오는 인증 콜백도 처리하지 못한 거예요.
서버 로그를 열어 보면 이상한 점이 하나 있어요. 에러가 없어요. OAuth 리다이렉트까지는 정상으로 나가는데, 그다음에 와야 할 토큰 교환 API 호출이 아예 안 들어와요. 서버는 멀쩡한데 로그인은 실패하는 상태였죠.
여기서 배운 게 있어요. 딥링크 경로는 사실 API 계약의 일부예요. 인증 서버에 등록한 redirect URI와 앱의 라우트 구조는 한 몸이라서, 앱 라우터가 깨지면 서버 쪽 계약도 같이 깨진 셈이 돼요. 그런데 그 실패는 서버 에러 로그가 아니라 "요청이 안 온다"는 침묵으로만 드러나요.
백엔드 순서로 다시 잡은 점검 목록
적용해 봤더니 고치는 순서는 인프라부터가 맞았어요.
- Node 20.19.4 이상
- iOS 최소 16.4
- react-navigation 직접 import 제거
- 인증 왕복 로그 확인
먼저 빌드 환경이에요. Expo 57은 Node 20.19.4 이상을 요구해서, CI와 백엔드 모노레포의 Node 버전이 어긋나면 코드 수정 전에 빌드부터 막혀요. iOS 최소 버전도 16.4로 올라가니 배포 대상 정리가 필요하고요.
다음은 import 정리예요. @react-navigation/*을 직접 가져오던 자리를 expo-router가 내보내는 API로 바꿨어요. 테스트해 보면 경로만 바꿔도 대부분 되살아나요.
마지막이 제일 중요해요. 로그인부터 리다이렉트, 토큰 교환까지 한 바퀴를 돌리고 서버 로그에 토큰 교환 요청이 실제로 찍히는지 확인했어요. 빌드 성공이 아니라 이 왕복 성공을 업그레이드 완료 기준으로 잡았어요. 혼자 운영하면서 얻은 기준인데, 플랜비(plan-b)처럼 멤버와 회비 데이터를 다루는 서비스는 로그인 한 번 막히면 그날 운영이 통째로 멈추거든요.
보상도 있긴 했어요. 공식 발표 기준으로 Android 콜드 스타트는 약 40%, 첫 렌더는 33% 빨라졌다고 하는데, 돌려 보니 체감도 분명했어요.
모바일 라우터도 인프라예요. 화면 전환 장치가 아니라 서버와 앱을 잇는 마지막 배선이라고 생각하면, 업그레이드 체크리스트에 서버 로그 확인 한 줄이 자연스럽게 들어가요. 다음 메이저 업그레이드 전에 인증 왕복 테스트 하나만 미리 만들어 두세요.
관련 글
댓글
아직 댓글이 없어요. 첫 댓글을 남겨주세요.