라우팅
이 페이지는 프론트엔드 라우팅 영역에 대한 레퍼런스 문서입니다. Lumie는 Next.js App Router만 사용합니다. 라우트 그룹이 주요 사용자 영역을 나누고, 레이아웃이 접근 제어를 담당하며, app/api/[...path]/route.ts는 브라우저의 모든 API 호출이 통과하는 동일 출처 프록시입니다.
소스 경로
| 경로 | 역할 |
|---|---|
lumie-frontend/app/page.tsx | 호스트를 기준으로 동작하는 사이트 루트. canonical host에서는 Lumie 마케팅 홈을 렌더링하고, 신뢰된 커스텀 도메인에서는 /에서 테넌트 랜딩을 렌더링합니다. |
lumie-frontend/app/(marketing)/ | /about, /pricing, /features, /blog 같은 canonical 공개 마케팅 페이지 |
lumie-frontend/app/(auth)/ | 로그인과 OWNER 회원가입 진입점 |
lumie-frontend/app/(onboarding)/layout.tsx | OWNER 온보딩 가드와 리다이렉트 |
lumie-frontend/app/admin/layout.tsx | staff 전용 가드와 로그인 후 복귀 경로 처리 |
lumie-frontend/app/dashboard/layout.tsx | 학생 전용 서버 가드와 대시보드 셸 |
lumie-frontend/app/dashboard/assignments/page.tsx | /dashboard/assignments에 마운트되는 학생 과제 목록 라우트 |
lumie-frontend/app/dashboard/assignments/[id]/page.tsx | /dashboard/assignments/[id]에 마운트되는 학생 과제 상세 라우트 |
lumie-frontend/app/auth/callback/page.tsx | 레거시 콜백 링크를 비밀번 호 로그인 모달 플로우로 돌려보내는 전환용 호환 라우트 |
lumie-frontend/app/auth/refresh/page.tsx | 무중단 refresh 경계 |
lumie-frontend/app/[customId]/page.tsx | 공개 학원 랜딩 페이지 |
lumie-frontend/app/api/[...path]/route.ts | NEXT_PUBLIC_API_BASE로 향하는 동일 출처 프록시 |
lumie-frontend/proxy.ts | 커스텀 도메인 host 고정, root auth URL 정규화, 닫힌 상태로 실패 커스텀 도메인 라우팅, 라우트 트리가 렌더링되기 전의 인증 라우팅 게이트 |
lumie-frontend/src/shared/lib/customDomain.ts | edge-safe 커스텀 도메인 host, env map, 대체 해석 헬퍼 |
lumie-frontend/src/shared/lib/serverCustomDomain.ts | 신뢰된 커스텀 도메인 테넌트 header를 읽는 server component 헬퍼 |
lumie-frontend/src/shared/config/env.ts | 브라우저 기준 API base. ENV.API_URL은 /api로 고정됩니다. |
lumie-frontend/src/features/auth/login/ui/LoginForm.tsx | 테넌트 인지 ID/비밀번호 로그인 폼 |
lumie-frontend/src/features/auth/register/ui/RegisterForm.tsx | 학원별 진입점의 공유 인증 모달에서 사용하는 학생 셀프 등록 폼 |
lumie-frontend/src/features/auth/register-owner/ui/OwnerRegisterForm.tsx | /signup에 마운트되는 다단계 OWNER 등록 흐름 |
lumie-frontend/src/entities/session/api/getServerUser.ts | 보호 레이아웃이 사용하는 서버 측 /v1/me 읽기 |
lumie-frontend/src/entities/session/model/onboarding.ts | 인증 후 기본 redirect의 역할 기반 로직 |
lumie-frontend/src/entities/assignment/api/student-queries.ts | /v1/assignments/me, /v1/assignments/{id}/me, PUT /v1/assignments/{id}/me/submission용 React Query hook |
lumie-frontend/src/entities/tenant/api/queries.ts | usePublicTenantAuthContext()가 서버에서 주입한 테넌트 데이터, path custom ID, 커스텀 도메인 host에서 인증 테넌트 컨텍스트를 해석 |
lumie-frontend/src/entities/tenant/providers/PublicTenantContextHydrator.tsx | /:customId 페이지와 커스텀 도메인 root rendering에서 서버가 해석한 공개 테넌트를 공유 인증 모달에 노출하는 클라이언트 브리지 |
lumie-frontend/src/entities/tenant/lib/useTenantCustomIdFromPath.ts | pathname에서 클라이언트 측 테넌트 custom ID 파싱 |
lumie-frontend/src/shared/lib/tenantRedirect.ts | 커스텀 도메인, canonical custom ID, 루트 대체 리디렉션을 만드는 인증 경계 로그인 URL 빌더 |
lumie-frontend/src/shared/lib/sessionCache.ts | 공유 API 코드가 사용하는 캐시된 세션 및 테넌트 리디렉션 컨텍스트 브리지 |
lumie-frontend/src/shared/lib/authRedirectReason.ts | AUTH_017 같은 백엔드 인증 실패 코드를 URL-safe 인증 안내 사유로 매핑 |
lumie-frontend/src/shared/api/serverFetch.ts | /api를 다시 통과하는 SSR fetch 경계 |
lumie-frontend/src/features/assignment-management/list-student-assignments/ | /dashboard/assignments용 학생 과제 목록 카드와 지표 |
lumie-frontend/src/features/assignment-management/view-student-assignment/ | 학생 과제 상세, 제출, 결과 컴포넌트 |
lumie-frontend/src/widgets/student-sidebar/ui/StudentSidebar.tsx | /dashboard/assignments용 학생 대시보드 내비게이션 진입점 |
라우트 그룹과 주요 경로
| 경로 형태 | 목적 | 비고 |
|---|---|---|
/ | 공개 사이트 루트 또는 커스텀 도메인 테넌트 랜딩 | app/page.tsx에 구현됩니다. canonical host는 공유 헤더와 푸터가 있는 Lumie 마케팅 홈을 렌더링하고, 신뢰된 커스텀 도메인은 Lumie 마케팅 chrome 없이 테넌트 랜딩을 렌더링합니다. |
/about, /pricing, /features, /blog 같은 마케팅 경로 | canonical 공개 사이트 페이지 | 공유 헤더와 푸터를 가진 app/(marketing) 아래 구현 |
/login | 인증 진입점 | LoginForm의 테넌트 인지 ID/비밀번호 로그인 폼을 사용합니다. |
/signup | OWNER 회원가입 진입점 | app/(auth)/signup/page.tsx가 OwnerRegisterForm을 렌더링합니다. 학생 셀프 등록은 tenant별 진입점의 공유 인증 모달로 노출됩니다. |
/onboarding | OWNER 온보딩 흐름 | app/(onboarding)/layout.tsx에서 보호 |
/admin/... | staff 및 학원 운영 | app/admin/layout.tsx에서 보호 |
/dashboard/... | 학생 경험 | app/dashboard/layout.tsx에서 보호한 뒤 자체 클라이언트 레이아웃과 사이드바 셸로 렌더링 |
/dashboard/assignments | 학생 과제 목록 | StudentAssignmentListPage를 렌더링하고 동일 출처 프록시를 통해 GET /v1/assignments/me를 호출 |
/dashboard/assignments/[id] | 학생 과제 상세 및 제출 흐름 | StudentAssignmentDetailPage를 렌더링하고 GET /v1/assignments/{id}/me를 읽으며 PUT /v1/assignments/{id}/me/submission으로 제출 |
/auth/callback | 전환용 호환 리다이렉트 | app/auth/callback/page.tsx는 레거시 링크를 위한 tombstone 라우트입니다. callbackUrl을 검증한 뒤, 활성 OAuth 또는 SSO 완료 플로우가 아니라 비밀번호 로그인으로 리다이렉트합니다. |
/auth/refresh | 무중단 refresh 브리지 | refresh 쿠키는 있지만 access token을 다시 세워야 할 때 사용 |
/:customId | 공개 학원 랜딩 페이지 | app/[customId]/page.tsx로 구현 |
/api/[...path] | 동일 출처 프록시 라우트 | 브라우저 요청을 백엔드 게이트웨이로 전달 |
루트 라우트는 의도적으로 app/page.tsx에 둡니다. 그래야 커스텀 도메인이 모든 canonical 마케팅 페이지를 dynamic으로 만들지 않고도 /에서 테넌트 랜딩을 렌더링할 수 있습니다. Canonical 마케팅 하위 페이지는 app/(marketing) 아래에 남습니다.
/api/health는 app/api/health/route.ts에 별도로 있는 로컬 라우트입니다. 프론트엔드 liveness 용도로만 사용해야 하며, 백엔드 프록시는 검사하지 않습니다.