Skip to content

v0.1.0 — 첫 프로덕션 릴리스

Choose a tag to compare

@swthewhite swthewhite released this 16 Aug 16:23
· 83 commits to develop since this release
53f8110

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 로 바꿨습니다.

"env": {
  "dev":  { "name": "dev-ssccops" },   // 기존 배포 유지
  "prod": { "name": "ssccops" }
}

환경 블록에서 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 deploydeploy: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)는 아직 생성돼 있지 않습니다 — 위 대시보드 설정이 선행돼야 프로덕션 배포가 시작됩니다.
  • 폼 응답 목록에 페이징이 없습니다(서버 결정에 맞춤).