← 경험 목록

경험 01

B2C 예매 앱 개발 — WebView 래퍼에서 네이티브 앱으로

내가 제일 잘 쓰는 스택을 두고 팀이 쓰는 것을 골랐다

2026.02 — 현재
기간
2026.02 ~ 현재
프론트엔드 2 · 백엔드 1 · UI 디자이너 1
기술
ExpoReact NativeTypeScriptExpo RouterNativeWindTanStack QueryZustandSentryPG 결제Next.jsTailwindVitest
배경
기존 앱의 실체
이전 개발팀이 만든 WebView 래퍼 — 웹 화면을 네이티브 컨테이너에 담은 형태
에러가 잦고 대응 불가
오래전부터 방치돼 쓰지 않는 상태
앱을 다시 세워야 함
래퍼를 손볼지, 네이티브 앱으로 만들지부터 정하는 일
제약
팀 주력 경험 = React
Flutter 를 쓰면 사실상 한 사람이 감당하는 구조
인계 상태가 아님
만든 팀이 없고, 문제를 만든 구조가 그대로 남아 있음
PM · 기획자 없음
요구사항 정의와 화면 설계를 개발과 함께
서드파티 딥링크 종료
진입 경로를 대체할 방법이 필요해짐
기능
탐색보고 싶은 영화와 회차를 찾는 구간
  • 영화 목록 · 상세 · 상영 시간표
  • 지점 선택 · 검색
예매회차를 고르고 좌석을 잡는 구간
  • 회차 선택 · 좌석 배치도 · 인원 선택 · 할인 적용
  • 상영 시작이 가까우면 예매가 닫힌다 — 결제 도중에 닫히면 돈만 나가고 표가 안 나온다
  • 그래서 회차 선택 · 다음 단계 · 결제 시점에서 각각 마감 여부를 다시 확인
결제PG 연동과 할인 수단
  • PG 결제 연동(iamport) · 결제 수단 선택
  • 쿠폰 · 포인트 적용
  • 결제 중 이탈이나 실패에서 되돌아오는 경로
계정 · 인증소셜 로그인과 토큰 인증
  • 소셜 로그인 4종 (Kakao · Naver · Google · Apple) · 회원 정보
  • access / refresh 토큰 갱신
  • 인증 가드에 막힌 경로를 보관했다가 로그인 후 복원 (returnAfterLogin)
내 예매예매하고 나서의 화면
  • 예매 내역 · 예매번호로 티켓 확인
  • 취소 · 환불
알림 · 진입 경로앱 밖에서 앱 안으로
  • 푸시 알림
  • App Links · Universal Links 와 자체 fallback 웹
  • 설치 여부에 따라 앱 화면 또는 스토어로 분기 / 인앱 브라우저는 외부 브라우저로
  • 공유 링크 URL 빌더와 딥링크 resolve 체계 — 앱과 웹이 같은 규칙을 사용
  • id 가 없는 딥링크의 폴백 경로 정의 — 커스텀 스킴과 푸시를 같은 규칙으로
앱 안의 웹 화면앱에서 웹을 띄우는 구간을 정리
공통 기반팀이 그 위에서 화면을 확장하도록
  • 반복되던 티켓 카드 · 모달을 공용 컴포넌트로 통합
  • 쿼리 키 팩토리화 · 배럴 파일 정리
성능렌더 비용 절감
  • PanResponder lazy-init 으로 제스처 초기화를 필요한 시점까지 미룸
  • 불필요한 quota 재조회 제거
  • 푸시 초기 응답 보류 · 업데이트 게이트 캐시 폴백
관측한 번에 붙이지 않고 단계로 세움 — P0 → P4
  • P0 딥링크 · 푸시 도착 퍼널과 인증 가드 리다이렉트 사유
  • P1 조용히 실패하던 다섯 경로를 Sentry 이슈로 올림
  • P2 HTTP 200 으로 응답하지만 실제로는 실패하는 구간 드러냄 · 결제 퍼널 확장 · 노이즈로 걸러낸 항목도 스파이크가 나면 이슈로 올림
  • P4 Android 알림 채널 셋업 실패 드러냄
  • 노이즈 관리 — 상세 404 와 토큰 갱신 네트워크 오류는 friction 으로만 기록해 이슈화 억제
  • GA4 사용자 식별(user_id · properties)과 예매 · 결제 이벤트 추적 보강
배포OTA 로 심사 없이 반영
  • 개발 → 운영 승격 PR 을 리뷰 지점으로 두어 배포 전에 함께 확인
결정
기존 WebView 래퍼 유지비용 최소 / 지금 문제를 만든 구조가 그대로
Flutter — 내가 가장 익숙한 스택혼자면 가장 빠름 / 팀 역량 불일치, OTA 제한
네이티브 전환성능 최대 / 인력 두 배
Expo / React Native채택
근거
판단 기준 = 내 숙련도 아님
팀이 감당할 수 있는가
OTA → 심사 없이 배포
시간에 민감한 서비스의 장애 대응 시간 단축
TV 앱은 Flutter 유지
같은 시기 같은 사람이 다르게 골랐다 — 제약이 다르면 통일하지 않는 편이 낫다
득실

얻은 것

팀 전원이 손대는 코드베이스 / 심사를 우회하는 배포 경로

포기한 것

내가 가장 빠르게 쓸 수 있는 스택

결과
심사 2~5일 → OTA 즉시
앞으로의 긴급 수정 반영 경로
조용한 실패 5종 검출·수정
HTTP 200 응답 + 실제 실패 구간 포함
설치 여부 무관 도달
공유 링크 · 푸시 유입이 의도한 화면까지
회고

모니터링을 재구축과 동시에 넣지 않고 나중에 붙였다. 그 결과 전환 직후 어떤 실패가 있었는지 확인할 데이터가 남지 않았다. 다음에는 화면보다 모니터링을 먼저 세운다.

자료

화면 캡처는 공개 범위를 고려해 포트폴리오에만 담았습니다. 요청하시면 개별 전달드립니다 — nuyoi7@gmail.com