데이터베이스

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

스키마 수정하기

  1. lib/db/schema/ 아래의 파일을 수정
  2. 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 generatedrizzle-kit migrate 명령을 활용하세요.