프로젝트 구조

kindie 프로젝트의 디렉토리 구조와 핵심 파일을 설명합니다.

디렉토리 구조

├── actions/              서버 액션 (auth, payments, profile, admin)
├── app/
│   ├── (marketing)/      공개 페이지 (랜딩, 블로그, 문서, 가격)
│   ├── (auth)/           인증 페이지 (로그인, 회원가입, 인증)
│   ├── (app)/            보호된 페이지 (대시보드, 설정, 관리자)
│   └── api/              API 라우트 (SMS, 주소검색, 웹훅)
├── components/
│   ├── ui/               shadcn/ui 기본 컴포넌트
│   ├── auth/             인증 폼 컴포넌트
│   ├── payments/         결제 관련 컴포넌트
│   ├── dashboard/        대시보드 레이아웃 컴포넌트
│   ├── marketing/        랜딩 페이지 섹션
│   ├── shared/           공유 컴포넌트 (Navbar, Footer)
│   └── email/            이메일 템플릿 (React Email)
├── content/
│   ├── blog/             블로그 포스트 (.mdx)
│   └── docs/             문서 (.mdx)
├── lib/
│   ├── auth.ts           Auth.js 설정
│   ├── blog.ts           블로그 파싱
│   ├── docs.ts           문서 파싱
│   ├── integrations.ts   기능 활성화 상태
│   ├── utils.ts          유틸리티 함수
│   ├── db/               Drizzle ORM (스키마, 쿼리, 시드)
│   ├── payments/         PortOne 결제 로직
│   ├── sms/              Solapi SMS 로직
│   ├── email/            Resend 이메일 로직
│   ├── korean/           한국 특화 API (주소검색)
│   └── i18n/             다국어 (ko, en)
├── config.ts             기능 토글, 플랜, 사이트 설정
└── types/                TypeScript 타입 정의

App Router 라우트 그룹

kindie는 Next.js App Router의 라우트 그룹을 사용하여 레이아웃을 분리합니다:

(marketing) — 공개 페이지

Navbar + Footer가 포함된 마케팅 레이아웃입니다.

  • / — 랜딩 페이지
  • /blog — 블로그
  • /docs — 문서
  • /pricing — 가격 페이지
  • /legal/* — 약관, 개인정보처리방침

(auth) — 인증 페이지

미니멀한 인증 전용 레이아웃입니다.

  • /login — 로그인
  • /signup — 회원가입
  • /verify — 이메일/SMS 인증

(app) — 보호된 페이지

사이드바 + 헤더가 포함된 앱 레이아웃입니다. 로그인 필수.

  • /dashboard — 대시보드
  • /settings/profile — 프로필 설정
  • /settings/billing — 결제 관리
  • /admin/* — 관리자 (역할 기반 접근)

핵심 파일

config.ts

모든 설정의 중앙 허브입니다. 사이트 정보, 플랜, 기능 토글, 라우트 정의가 여기에 있습니다. 자세한 내용은 기능 토글 문서를 참고하세요.

lib/integrations.ts

config.ts의 기능 플래그와 환경변수를 결합하여 실제로 사용 가능한 기능을 판단합니다. 예를 들어 카카오 로그인은 features.auth.kakaotrue이고, AUTH_KAKAO_IDAUTH_KAKAO_SECRET이 설정된 경우에만 활성화됩니다.

lib/auth.ts

Auth.js v5 설정 파일입니다. Credentials는 항상 포함되고, Google/Kakao/Naver는 features.auth.* 토글과 각 환경변수 유무에 따라 동적으로 등록됩니다.