# DB 브랜치 (미리보기 데이터베이스)

브랜치는 프로젝트의 **스키마로 만든 데이터베이스**예요. git 브랜치마다 하나씩 두면 그 브랜치의 미리보기 배포가
운영 데이터베이스가 아니라 브랜치를 써요. Pro 요금제부터 프로젝트마다 3개까지 둘 수 있어요(엔터프라이즈 10개).

- 만들 때 프로젝트의 마이그레이션 기록(`apply_migrations`, `oneend db push`로 적용한 것)을 순서대로 다시 실행하고,
  시드 SQL이 있으면 실행해요. **데이터는 복사하지 않아요.**
- 브랜치는 ref가 따로 있는 프로젝트예요. `list_branches`의 `ref`를 `run_sql`, `get_project_keys`,
  `get_database_connection` 등 모든 도구에 그대로 쓰면 돼요. 주소·키·사용자·파일도 따로예요.
- 브랜치의 git 브랜치로 미리보기를 배포하면 배포 환경 변수에 브랜치의 `SUPABASE_URL`, `NEXT_PUBLIC_SUPABASE_URL`,
  `SUPABASE_ANON_KEY`, `NEXT_PUBLIC_SUPABASE_ANON_KEY`, `SUPABASE_SERVICE_ROLE_KEY`, `DATABASE_URL`,
  `POSTGRES_URL`, `DIRECT_URL`, `ONEEND_DB_BRANCH`가 들어가요. 미리보기용 환경 변수 중 운영 프로젝트의
  주소나 키를 담은 값도 브랜치의 것으로 바뀌어요.
- `merge_branch`는 브랜치에만 있는 마이그레이션을 운영에 적용해요. 그래서 브랜치에서 스키마를 바꿀 때는
  `run_sql`이 아니라 `apply_migrations { ref: <브랜치 ref> }`로 바꿔야 해요.
- git 브랜치를 지우거나 풀 리퀘스트를 닫으면 브랜치도 지워져요. 마지막 배포 뒤 보존 기간(기본 14일)이 지나도
  지워져요. 크기가 한도(기본 1GB)를 넘으면 일시정지돼요.

```
create_branch { ref, git_branch: "feature/login" }
list_branches { ref }
apply_migrations { ref: "<branch ref>", migrations: [{ version: "20261005000000", name: "add_profiles", sql: "..." }] }
merge_branch { ref, name: "feature-login" }
reset_branch { ref, name: "feature-login", confirm: "feature-login" }
delete_branch { ref, name: "feature-login", confirm: "feature-login" }
set_branching { ref, automatic: true, seed_sql: "insert into plans (code) values ('free');", lifetime_days: 14 }
```

`set_branching`의 `automatic`을 켜면 미리보기로 배포되는 git 브랜치마다 브랜치가 저절로 만들어져요.

**요금:** 브랜치의 데이터베이스 용량은 DB 저장 용량으로, 브랜치가 있는 동안은 시간당 0.25GB의 서버 메모리
(`runtime_gb_hour`)로 프로젝트의 조직에 청구돼요. 밤마다 하는 백업은 하지 않아요.

HTTP로는 `GET /branches`, `POST /branches`, `POST /branches/<이름>/merge`, `POST /branches/<이름>/reset`,
`DELETE /branches/<이름>`, `PUT /branching`이에요.

---

https://end.blackall.ai/docs/branches?lang=ko
