데이터베이스
Drizzle ORM 스키마 구조와 마이그레이션 방법을 안내합니다.
개요
kindie는 Drizzle ORM을 사용하여 PostgreSQL 데이터베이스를 관리합니다. 타입 안전한 쿼리 빌더와 직관적인 스키마 정의가 특징입니다.
스키마 파일
스키마는 도메인별로 분리되어 있습니다:
lib/db/
├── index.ts DB 클라이언트 (drizzle 인스턴스)
├── schema/
│ ├── auth.ts 사용자, 계정, OTP/프로필
│ └── billing.ts 플랜, 구독, 결제
└── seed.ts 시드 데이터 (플랜 정보)주요 테이블
auth.ts
| 테이블 | 설명 |
|---|---|
users |
사용자 정보 (이름, 이메일, 역할, 프로필 이미지) |
accounts |
OAuth 계정 연결 (provider, providerAccountId) |
verification_tokens |
인증 토큰 (Auth.js 기본 테이블) |
phone_verifications |
SMS OTP 해시/만료/시도 횟수 관리 |
profiles |
사용자 프로필 확장 정보 |
이 템플릿은 JWT 세션 전략을 사용하므로 기본적으로
sessions테이블을 사용하지 않습니다.
billing.ts
| 테이블 | 설명 |
|---|---|
plans |
요금제 정보 (Free, Pro, Enterprise) |
subscriptions |
사용자 구독 상태 |
payments |
결제 내역 (PortOne 트랜잭션) |
명령어
# 스키마를 DB에 직접 반영 (개발 중 사용)
npm run db:push
# 시드 데이터 삽입
npm run db:seed
# Drizzle Studio (DB GUI)
npm run db:studio스키마 수정하기
lib/db/schema/아래의 파일을 수정npm run db:push로 변경사항 적용
// 예: lib/db/schema/auth.ts에 필드 추가
export const users = pgTable("users", {
id: text("id").primaryKey().$defaultFn(() => crypto.randomUUID()),
name: text("name"),
email: text("email").unique(),
role: text("role", { enum: ["user", "admin"] }).default("user"),
// 새 필드 추가
phone: text("phone"),
});주의: 운영 환경에서는
db:push대신 마이그레이션을 사용하는 것이 안전합니다. Drizzle의drizzle-kit generate와drizzle-kit migrate명령을 활용하세요.