v0.1.0 — 첫 프로덕션 릴리스
SSCC 지원서·운영 관리 프론트엔드의 첫 프로덕션 릴리스입니다. develop 에 쌓인 45개 커밋을 main 으로 올렸습니다.
Next.js 16 / React 19 / Tailwind CSS 4 / Zustand / Supabase Auth, Cloudflare Workers 에 OpenNext 로 배포합니다.
인증 · 권한
- Supabase Google OAuth 로그인 (#1) 과 라우트 가드
- 회원가입 화면 — 폼 검증과 오류 처리 (#3), 로그인 세션 서버 연동 (#4)
- 역할 기반 화면 권한 (#29) — 서버가 내려주는
capabilities로 기능 노출을 제어합니다. 화면이 역할을 보고 스스로 판정하지 않으므로 버튼과 실제 인가가 갈리지 않습니다. - 역할별 권한 관리 화면 (#32) — 권한 트리 부여·회수. 저장 전 미리 보기를 위해 서버와 같은 펼침 규칙을 트리 간선으로 재현합니다.
- 회원·CSV 이관 메뉴에
MEMBER_MANAGE권한 게이트 (#52) - 운영관리 접근 권한 수정 (#71)
- OAuth 복귀 목적지를 쿠키로 전달 (#77) —
redirectTo에서?next=쿼리를 제거했습니다. 쿼리를 붙이면 Supabase 에 등록한 Redirect URL 과 일치하지 않아 Site URL(보통 localhost)로 조용히 폴백하는 결함이 있었습니다.
폼
- 폼 목록·상세 (#7) — API 계층 분리와 필터의 URL 반영
- 폼 편집기와 자동 저장 (#8)
- 라벨 관리·지정 (#10), 접수 상태 전환·복제 (#9)
- 공개 폼 — 인증 게이트 (#11, 가입 후 원래 폼으로 복귀), 응답 제출·자동 저장 (#12)
- 응답 목록·상세·상태 변경 (#13) — 상세의 이전/다음 이동은 서버가 내려주는 이웃 식별자를 씁니다(URL 로 바로 열어도 이동이 죽지 않도록)
- 폼 도메인 서버 계약 감사와 잔재 정리 (#14)
회원
- 회원 목록·상세 (#46), 정보 수정·내 계정 프로필 수정 (#47)
- 등급·상태 변경 (#48), 역할 부여·종료 (#50), 변경 이력 화면 (#51)
- 역할 목록·수정·역할 분류 관리 (#49)
- CSV 회원 이관 위저드 (#57) — 클라이언트 시뮬레이션을 걷어내고 서버 검증에 연동했습니다. CSV 파싱은 서버 한 곳에만 두어, 따옴표로 감싼 헤더에서 해석이 갈리는 문제를 없앴습니다.
- 이관 회원 계정 연결 화면 (#58) — 가입 화면에서 기존 회원으로 연결하는 경로
- 회원·역할 목 스토어 제거 (#54)
운영
- 업무 목록·상세·등록 (#30), 하위 업무 등록 (#36)·상세·전이·체크리스트 (#39)·전체 조회 (#41)
- 하위 업무 유형 관리 (#34)
- 승인함 조회·투표·승인·반려 (#45)
- 회의 등록·조회 (#56)
- 운영 대시보드 (#60), 운영 통합 페이지 (#63)
- 운영 등록의 담당자를 서버 후보 목록에서 선택 (#53)
⚠️ 배포 시 주의
dev/prod 배포 환경이 분리됐습니다
이 릴리스에 Cloudflare Workers 의 dev/prod 분리가 포함됩니다. wrangler.jsonc 에 이름을 하드코딩하던 것을 Wrangler named environments 로 바꿨습니다.
환경 블록에서 name 을 명시하면 Wrangler 가 -<env> 접미사를 붙이지 않고 그대로 씁니다. main·assets·compatibility_* 는 상속되고, vars 와 바인딩류는 상속되지 않으므로 추가할 때는 각 env 블록에 따로 써야 합니다.
Workers Builds 의 Production/Preview 로는 이걸 대신할 수 없습니다 — Build variables 가 Worker 당 한 세트뿐이라 production/preview 로 나뉘지 않는데, NEXT_PUBLIC_* 값은 Next 가 빌드 타임에 인라인해 버리므로 dev/prod 가 서로 다른 백엔드를 가리킬 수 없습니다. 그래서 Worker 를 둘로 나눴습니다.
대시보드 설정이 필요합니다
dev-ssccops (기존, 설정 수정) |
ssccops (신규 생성) |
|
|---|---|---|
| Production branch | develop |
main |
| Build command | pnpm exec opennextjs-cloudflare build -e dev |
pnpm exec opennextjs-cloudflare build -e prod |
| Deploy command | pnpm exec opennextjs-cloudflare deploy -e dev |
pnpm exec opennextjs-cloudflare deploy -e prod |
| Non-production branch builds | 켤 경우 ... upload -e dev |
끄기 |
| Build variables | dev 용 NEXT_PUBLIC_* |
prod 용 NEXT_PUBLIC_* |
기존 dev-ssccops 에 -e dev 를 넣지 않으면 다음 빌드가 ssccops-web 이라는 의도치 않은 세 번째 Worker 로 나갑니다.
Supabase · CORS
Google 프로바이더의 Redirect URL 은 경로까지 포함해서 등록해야 합니다. 오리진만 등록하면 Supabase 가 Site URL(보통 localhost)로 조용히 폴백해, 배포 환경에서 로그인이 로컬로 튕깁니다.
https://dev-ssccops.sscc-webservice.workers.dev/auth/callback
https://ssccops.sscc-webservice.workers.dev/auth/callback
서버의 frontend.url(CORS 허용 오리진)에도 prod 오리진 추가가 필요합니다 — 쉼표로 여러 개 넣을 수 있습니다.
필요한 빌드 변수
NEXT_PUBLIC_SUPABASE_URL · NEXT_PUBLIC_SUPABASE_ANON_KEY · NEXT_PUBLIC_API_BASE_URL · NEXT_PUBLIC_PUBLIC_FORM_ORIGIN(선택)
NEXT_PUBLIC_API_BASE_URL 이 비면 인증부터 폼 도메인 전 화면까지 목 데이터 폴백 없이 빈 화면이 됩니다.
스크립트 변경
pnpm run deploy 가 deploy:dev / deploy:prod 로 나뉘었습니다. 겸사겸사 pnpm 내장 명령과 충돌하던 pnpm deploy 이름도 피했습니다.
pnpm run preview # build -e dev && preview -e dev
pnpm run deploy:dev
pnpm run deploy:prod
알려진 제약
- prod Worker(
ssccops)는 아직 생성돼 있지 않습니다 — 위 대시보드 설정이 선행돼야 프로덕션 배포가 시작됩니다. - 폼 응답 목록에 페이징이 없습니다(서버 결정에 맞춤).