dd/README_DRIZZLE.md

6.7 KiB
Raw Permalink Blame History

🎉 Drizzle ORM 마이그레이션 완료!

JWT 인증 시스템이 Drizzle ORM을 사용하도록 성공적으로 마이그레이션되었습니다.

🚀 빠른 시작

# 1. 의존성 설치 (이미 완료됨)
# pnpm install

# 2. 데이터베이스 마이그레이션 (이미 완료됨)
# pnpm db:push

# 3. 빌드 (이미 완료됨)
# pnpm build

# 4. 개발 서버 실행
pnpm cf:dev

그런 다음 브라우저에서:

완료된 작업

1. Drizzle ORM 설치

  • drizzle-orm v0.44.7
  • drizzle-kit v0.31.7

2. 스키마 정의

  • src/lib/server/schema.ts 생성
  • TypeScript 타입 자동 추론 (User, NewUser)

3. 데이터베이스 함수 변환

  • src/lib/server/db.ts Drizzle로 재작성
  • createUser() - 타입 안전
  • getUserByEmail() - 타입 안전
  • getUserById() - 타입 안전

4. 마이그레이션 시스템

  • drizzle.config.ts 설정
  • 마이그레이션 SQL 생성 (drizzle/0000_*.sql)
  • 로컬 DB에 적용 완료

5. NPM 스크립트 추가

{
  "db:generate": "drizzle-kit generate",
  "db:push": "wrangler d1 execute auth-db --local --file=...",
  "db:push:remote": "wrangler d1 execute auth-db --remote --file=...",
  "db:studio": "drizzle-kit studio",
  "db:query": "wrangler d1 execute auth-db --local --command=...",
  "db:query:remote": "wrangler d1 execute auth-db --remote --command=..."
}

6. 문서 작성

  • DRIZZLE_GUIDE.md - 상세 가이드
  • DRIZZLE_MIGRATION_COMPLETE.md - 마이그레이션 요약
  • AUTH_GUIDE.md - 업데이트됨

7. 빌드 및 테스트

  • TypeScript 컴파일 성공
  • 프로덕션 빌드 성공
  • 에러 없음

📦 새로운 NPM 명령어

Drizzle 관련

# 마이그레이션 생성 (스키마 변경 후)
pnpm db:generate

# 로컬 DB에 마이그레이션 적용
pnpm db:push

# 프로덕션 DB에 마이그레이션 적용
pnpm db:push:remote

# Drizzle Studio 실행 (DB 관리 UI)
pnpm db:studio

# 사용자 조회 (로컬)
pnpm db:query

# 사용자 조회 (프로덕션)
pnpm db:query:remote

기존 명령어

# 개발 서버 (Vite)
pnpm dev

# 개발 서버 (Cloudflare Workers)
pnpm cf:dev

# 빌드
pnpm build

# 배포
pnpm deploy

📁 프로젝트 구조

프로젝트/
├── drizzle.config.ts              # ✨ Drizzle 설정
├── drizzle/                       # ✨ 마이그레이션
│   ├── 0000_omniscient_lady_mastermind.sql
│   └── meta/
├── src/
│   ├── lib/
│   │   └── server/
│   │       ├── schema.ts          # ✨ Drizzle 스키마
│   │       ├── db.ts              # 🔄 Drizzle 사용
│   │       └── auth.ts            # JWT 함수
│   └── routes/
│       ├── login/                 # 로그인 페이지
│       ├── register/              # 회원가입 페이지
│       └── api/
│           └── logout/            # 로그아웃 API
├── DRIZZLE_GUIDE.md              # ✨ Drizzle 가이드
├── DRIZZLE_MIGRATION_COMPLETE.md # ✨ 마이그레이션 요약
├── AUTH_GUIDE.md                 # 🔄 업데이트됨
└── package.json                  # 🔄 스크립트 추가

🎯 주요 개선사항

1. 타입 안전성

// Before: 런타임 에러 가능
const user = await db.prepare('SELECT * FROM usres').first();
//                                              ^^^^^ 오타!

// After: 컴파일 타임에 에러 발견
const [user] = await drizzleDb.select().from(usres);
//                                           ^^^^^ 컴파일 에러!

2. 자동 완성

IDE에서 테이블명, 컬럼명, 함수 등 완벽한 자동 완성 지원

3. 자동 마이그레이션

스키마 변경 시 SQL을 자동으로 생성

pnpm db:generate  # ALTER TABLE, CREATE TABLE 등 자동 생성

4. 리팩토링 용이

테이블이나 컬럼명 변경 시 TypeScript가 모든 사용처를 찾아줌

📚 문서

1. DRIZZLE_GUIDE.md (필독!)

  • Drizzle ORM 기본 개념
  • 스키마 정의 방법
  • 고급 쿼리 예제
  • 마이그레이션 관리
  • Drizzle Studio 사용법
  • Before/After 비교

2. AUTH_GUIDE.md

  • JWT 인증 설정
  • 로컬 개발 환경 설정
  • 프로덕션 배포
  • 보안 고려사항
  • Drizzle 명령어 포함

3. DRIZZLE_MIGRATION_COMPLETE.md

  • 마이그레이션 전후 비교
  • 변경된 파일 목록
  • 테스트 결과
  • 다음 단계 제안

🔍 Drizzle Studio

데이터베이스를 브라우저에서 관리:

pnpm db:studio

기능:

  • 📊 테이블 데이터 조회/편집
  • 레코드 추가
  • 🗑️ 레코드 삭제
  • 🔍 검색 및 필터링
  • 📈 관계 시각화

🎓 다음 단계

Drizzle ORM을 활용하여 다음 기능들을 쉽게 추가할 수 있습니다:

1. 프로필 테이블

export const profiles = sqliteTable('profiles', {
  id: integer('id').primaryKey({ autoIncrement: true }),
  userId: integer('user_id').references(() => users.id),
  avatar: text('avatar'),
  bio: text('bio')
});

2. 게시글 시스템

export const posts = sqliteTable('posts', {
  id: integer('id').primaryKey({ autoIncrement: true }),
  userId: integer('user_id').references(() => users.id),
  title: text('title').notNull(),
  content: text('content').notNull()
});

3. 관계 쿼리

const postsWithUsers = await drizzleDb
  .select()
  .from(posts)
  .leftJoin(users, eq(posts.userId, users.id));

모든 것이 타입 안전하게 작동합니다!

성능

Drizzle ORM은 순수 SQL과 동일한 성능을 제공합니다.

  • Zero-cost abstractions
  • 최소한의 런타임 오버헤드
  • Cloudflare D1에 최적화

🐛 문제 해결

Q: 마이그레이션 파일이 생성되지 않아요

# 스키마 파일 경로 확인
ls src/lib/server/schema.ts

# Drizzle 설정 확인
cat drizzle.config.ts

Q: 로컬 DB에 적용이 안 돼요

# 올바른 데이터베이스 이름 사용
pnpm wrangler d1 execute auth-db --local --file=./drizzle/0000_*.sql

Q: 타입 에러가 발생해요

# 타입 재생성
pnpm svelte-kit sync

🎊 완료!

Drizzle ORM 마이그레이션이 성공적으로 완료되었습니다!

주요 성과:

  • 타입 안전성 100% 확보
  • 개발 생산성 향상
  • 유지보수성 개선
  • 자동 마이그레이션 시스템
  • 빌드 및 테스트 성공

다음 실행 명령어:

pnpm cf:dev

즐거운 개발 되세요! 🚀