# 앱 고침 바로 보내기(OTA)

마치면 스토어에 나간 앱에 JS·문구·그림 고침을 심사 없이 바로 보낼 수 있어요. 버그도 바로 사용자에게 가니까, 시험 채널에서 먼저 받아 보고 운영은 작게 시작해 넓혀요.

```mermaid
flowchart LR
  A[보내기 전 검사] --> B[시험 채널에서 받아 보기] --> C[운영 10%] --> D[지표 확인 뒤 50%·100%]
```

## 시작하기 전에

- **스토어에 나간 빌드** — OTA 는 그 빌드 위에 고침을 보내요.
- **OTA 도구** — 앱을 만든 방식마다 달라요(예: Expo 앱은 EAS Update). 순서는 어느 도구든 같아요.

OTA 로 보낼지 스토어 빌드로 낼지 먼저 가려요.

| 조건 | 고를 길 | 그 길의 대가 |
|---|---|---|
| JS·문구·그림만 바뀌고 네이티브(모듈·권한·아이콘·SDK)는 그대로 | OTA | 바로 나가요. 런타임 버전이 스토어 빌드와 같아야 해요 |
| 네이티브가 바뀌었거나 새 기능·결제·인앱 상품 추가 | 스토어 빌드 | 심사를 받아요. 심사받을 기능을 OTA 로 몰래 넣지 않아요([App Review](https://developer.apple.com/app-store/review/guidelines/)) |

allob 은 업데이트를 보내지 않아요. 보낸 업데이트를 릴리스로 기록하면 숫자와 겹쳐 볼 수 있어요([개선 루프](/docs/journey-improve)).

:::prompt
이 allob 사업 가이드를 읽고, 내 사업에 해당하는 할 일만 골라 진행해 줘: https://allob.app/docs/journey-ota.md
1. allob business view 와 allob path view --business 로 내 사업 모양(사업자 형태·돈 버는 방식·파는 나라)을 먼저 확인해.
2. 해당하지 않는 할 일은 왜 아닌지 한 줄로 알려 주고 allob step skip <id> --reason "…" 으로 넘겨.
3. 해당하는 할 일은 allob step view <id> 의 안내대로 하고, 끝나면 allob step done <id> --note "끝났다는 증거" 를 불러.
4. 본인 인증·서명·결제·약관 동의처럼 사람만 하는 곳에서는 멈추고 무엇을 누르면 되는지 알려 줘.
5. 되돌리기 어려운 답(과세 유형·계정 유형 등)은 내 폰으로 확인 요청이 와 — 명령이 보여 준 승인 링크를 알려 주고, 기다리는 동안 다른 할 일로 넘어가.
:::

## 시험 채널과 단계적 출시 준비하기 {#ota.channels}

운영 채널과 별도로 시험 채널을 만들고, 시험 빌드와 보내기 검사를 준비해요.

1. **채널 만들기** — 운영 채널(스토어 빌드가 묻는 곳)과 시험 채널(예: `ota-test`)을 만들어요.
2. **시험 빌드 만들기** — 채널만 시험 채널로 바꾼 출시용 빌드를 만들어요. 개발 빌드는 업데이트를 받지 않아요. 시험 빌드도 운영 서버로 이벤트를 보낼 수 있으니, 첫 실행 전에 내 기기로 표시해 숫자에서 빼요.
3. **보내기 전 검사 두기** — 타입 검사·테스트 통과, 커밋 안 된 변경 없음, 런타임 버전이 스토어 빌드와 같음, 메시지 있음. 스크립트로 둬서 잊어도 막히게 해요.
4. **런타임 버전 기록하기** — 스토어에 올린 빌드의 런타임 버전을 빌드 결과물에서 읽어 기록해 두고, 보낼 때 비교해요.

출시 뒤 고칠 때마다 이렇게 보내요.
1. 보내기 전 검사를 통과시켜요.
2. 시험 채널로 보내고, 시험 빌드를 **두 번** 껐다 켜서(받기·적용) 고친 흐름을 직접 눌러 봐요.
3. 운영은 10% → 충돌·핵심 이벤트 확인 → 50% → 100% 로 넓혀요.
4. 이상하면 단계적 출시를 거두거나 빌드에 든 묶음으로 되돌려요. 되돌림도 두 번 껐다 켜야 적용돼요.

:::tip 끝났는지 확인
시험 채널 업데이트를 시험 빌드에서 받아 바뀐 화면을 확인했고, 운영 채널에 단계적 출시로 보내는 방법이 정해졌으면 끝이에요. 증거는 메모(채널 이름·확인한 플랫폼)예요.
:::

에이전트가 끝까지 해요. 만든 채널과 확인한 플랫폼은 `allob step view <할 일>` 의 기록에 남아요.

## 자주 걸리는 함정

| 증상 | 원인·해결 |
|---|---|
| 보냈는데 기기에서 안 바뀌어요 | 한 번만 껐다 켰어요 → 한 번 더. 그래도 안 되면 빌드와 업데이트의 채널·런타임 버전을 비교 |
| 운영 출시 빌드가 시험 채널을 물어요 | 셸·네이티브 폴더·`.env` 에 시험 값이 남았어요 → 새 셸에서 값 없이 다시 빌드(Expo 는 prebuild 부터) |
| 보내기가 "스토어 빌드와 버전이 다르다"로 멈춰요 | 네이티브가 바뀌었어요 → OTA 말고 스토어 빌드 |
| 바로 100% 로 보냈다가 충돌이 늘었어요 | 단계적 출시를 건너뛰었어요 → 10% 부터, 지표 보고 넓혀요 |
| 켜자마자 죽는 업데이트 | 앞 업데이트로 다시 뜨지만 사용자는 한 번 넘어져요 → 시험 채널·단계적 출시로 막아요 |

## 출처

공식 안내와 마지막으로 맞춰 본 날: 2026-10-18

- [Expo EAS Update](https://docs.expo.dev/eas-update/introduction/)
- [Expo 가격](https://expo.dev/pricing)
- [Apple App Review 가이드라인](https://developer.apple.com/app-store/review/guidelines/)
