글자 크기

보이게 만드는 건, 결국 디테일이었다

요즘 나는 ‘죠비엣(Choviet)’ iOS 앱을 만들면서 한 가지를 자주 느낀다.
기능이 되는 것과 제품처럼 느껴지는 것 사이에는, 생각보다 깊은 강이 하나 흐른다는 것.

Turbo Native를 붙이는 작업은 딱 그 강을 건너는 일이었다.
처음엔 “웹을 앱으로 싸기만 하면 되겠지” 같은 순진한 마음이었다가,
막상 해보니 이건 ‘포장’이 아니라 경계면(네이티브 ↔ 웹)을 조각하는 일이었다.

그리고 그 강을 건너는 데 가장 큰 도움을 준 건, 의외로 화려한 기술이 아니라…

반복 가능한 자동화 스크립트였다.


1. Turbo Native 통합의 목표는 단순했다

“웹을 띄우되, 사용자는 앱이라고 믿게 만들기”

Turbo Native는 매력적이다.
웹을 그대로 활용하면서 iOS 앱처럼 보이게 만들 수 있으니까.

하지만 그만큼 함정도 있다.

  • 헤더가 겹친다
  • 스크롤이 어색하다
  • 모달이 웹처럼 뜬다
  • 제출 후 화면이 멈춘다
  • 링크가 사파리로 빠진다

이런 문제들은 기능이 ‘실패’한 게 아니라,
사용자의 신뢰가 조용히 새는 구멍이 된다.

그래서 이번 통합 작업의 진짜 목표는 하나였다.

“앱이 웹을 품고 있다는 사실을, 사용자가 굳이 의식하지 않게 만들기.”


2. 해결한 것들: “앱다운 감각”을 만드는 체크리스트

이번에 완료된 핵심 항목은 다음 다섯 가지다.

✅ 1) 네이티브 헤더: 불투명 + 콘텐츠 겹침 없음

이거 하나만 해결돼도 체감이 확 바뀐다.
헤더가 투명하거나 겹치면, 앱이 아니라 “웹뷰” 느낌이 바로 난다.

결론: 헤더는 장식이 아니라 제품의 얼굴이다.

✅ 2) 웹 헤더 숨김

네이티브 헤더가 있으면 웹 헤더는 사라져야 한다.
헤더가 두 개면 사용자는 즉시 “아 이거 웹이네” 하고 마음이 떠난다.

결론: 한 화면에 왕은 한 명만 있어야 한다.

✅ 3) 스크롤 정상 작동

스크롤이 어색하면 기능이 아무리 많아도 “불안한 앱”이 된다.
사람은 스크롤로 제품의 품질을 판단한다. (진짜임)

결론: 스크롤은 UX의 심장박동이다.

✅ 4) 신고 모달 & 폼 제출

모달은 Turbo Native 경계에서 자주 깨지는 대표 구간인데,
여기까지 자연스럽게 되면 “이제 앱이 기능을 소화한다”는 감각이 생긴다.

결론: 모달과 폼은 ‘통합이 제대로 됐는지’ 보여주는 시험지다.

✅ 5) 성공 후 리디렉션

제출이 성공했는데 화면이 멈추면 사용자는 바로 불안해한다.
리디렉션(또는 명확한 피드백)이 있어야 “끝났다”가 된다.

결론: 성공은 완료 신호까지 포함해야 성공이다.


3. 진짜 승부처: “실수할 자유를 줄이기”

그래서 내가 만든 건… iOS 테스트 자동화 스크립트였다

Turbo Native 작업은 “한 번 고치고 끝”이 아니다.
조금만 손대도 다시 깨진다.
그러니까 매번 수동으로 확인하면, 사람은 지치고 제품은 흔들린다.

그래서 나는 test-choviet.sh를 만들었다.

이 스크립트가 하는 일은 단순하지만 강력하다.

  • 서버 상태코드 + JSON 정상 여부 확인
  • 시뮬레이터 자동 선택 & 자동 부팅
  • 빌드 → 앱 경로 탐색 → 설치 → 실행
  • 시나리오별 스크린샷 자동 저장
  • 결과 폴더를 자동으로 열어 확인까지 빠르게

그리고 재미있는 점은…
이 스크립트도 진화했다는 것이다.

v2.4.1 → v2.4.3g 까지의 진화는 거의 “생존기”

  • HEAD가 막히면 GET으로 우회
  • 리다이렉트(-L) 대응
  • 타임아웃 도입(무한 대기 방지)
  • 상태코드가 빈 문자열이면 0 처리
  • UDID 선택 로직 개선(booted 우선, runtime 검증)
  • JSON 파싱 실패 시 응답 미리보기 출력
  • 멀티바이트/개행 안전 출력(head -c, printf)
  • STATUS 숫자 검증으로 이상한 문자열 방어

한 줄로 요약하면 이거다.

“스크립트는 점점 더 정직해졌고, 더 덜 믿음직한 세상에서도 버티게 됐다.”


4. 현실적인 이슈: 유니버설 링크 미설정이면 사파리로 새는 문제

스크린샷 파일명에 maybe-web이 들어간 이유도 이거다.

  • /users/sign_in
  • /posts/1

이런 링크는 설정이 없으면 사파리로 열린다.

그래서 스크립트는 솔직하게 말한다.

“이 화면은 앱일 수도 있고, 사파리일 수도 있다.”

이건 실패가 아니라 정확한 현상 기록이다.
그리고 다음 단계는 명확하다.

  • Associated Domains(유니버설 링크)
  • 또는 Custom URL Scheme(choviet://)

5. 최종 결과: Turbo Native 통합 완료 요약

  • ✅ 네이티브 헤더 (불투명, 콘텐츠 겹침 없음)
  • ✅ 웹 헤더 숨김
  • ✅ 스크롤 작동
  • ✅ 신고 모달 & 폼 제출
  • ✅ 성공 후 리디렉션

이제 “작동하는 앱”을 넘어서,
사용자가 믿을 수 있는 앱으로 넘어가는 문턱에 섰다.


6. 다음 단계(너무 욕심내지 말고, 딱 3개만)

1. 유니버설 링크/딥링크 정리
maybe-web을 sure-app으로 바꾸는 작업

2. 로딩/에러 UX 추가
느린 통신에서도 앱이 멈춘 느낌이 안 나게

3. 테스트 결과 요약 파일 생성
스크린샷 + 상태코드 + 실행 환경을 summary.txt로 남기면
나중에 회귀 테스트에서 신이 된다


마무리: 결국 이건 “앱을 만드는 일”이 아니라 “신뢰를 만드는 일”

Turbo Native 통합은 기술 통합이지만,
내가 진짜로 통합한 건 사용자의 시간과 내 마음의 안정감이었다.

수동 테스트의 피로를 자동화로 바꾸고,
불확실성을 로그와 스크린샷으로 고정해버리면,
그제야 다음 기능을 만들 수 있는 힘이 생긴다.

나 같은 늦깎이에게 필요한 건 속도가 아니라,
다시 시작할 수 있는 구조니까.

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다