dd/README_DRIZZLE.md

277 lines
6.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 🎉 Drizzle ORM 마이그레이션 완료!
JWT 인증 시스템이 **Drizzle ORM**을 사용하도록 성공적으로 마이그레이션되었습니다.
## 🚀 빠른 시작
```bash
# 1. 의존성 설치 (이미 완료됨)
# pnpm install
# 2. 데이터베이스 마이그레이션 (이미 완료됨)
# pnpm db:push
# 3. 빌드 (이미 완료됨)
# pnpm build
# 4. 개발 서버 실행
pnpm cf:dev
```
그런 다음 브라우저에서:
- http://localhost:8787/register - 회원가입
- http://localhost:8787/login - 로그인
- http://localhost:8787 - 메인 페이지
## ✅ 완료된 작업
### 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 스크립트 추가
```json
{
"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 관련
```bash
# 마이그레이션 생성 (스키마 변경 후)
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
```
### 기존 명령어
```bash
# 개발 서버 (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. 타입 안전성
```typescript
// Before: 런타임 에러 가능
const user = await db.prepare('SELECT * FROM usres').first();
// ^^^^^ 오타!
// After: 컴파일 타임에 에러 발견
const [user] = await drizzleDb.select().from(usres);
// ^^^^^ 컴파일 에러!
```
### 2. 자동 완성
IDE에서 테이블명, 컬럼명, 함수 등 완벽한 자동 완성 지원
### 3. 자동 마이그레이션
스키마 변경 시 SQL을 자동으로 생성
```bash
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
데이터베이스를 브라우저에서 관리:
```bash
pnpm db:studio
```
기능:
- 📊 테이블 데이터 조회/편집
- 레코드 추가
- 🗑️ 레코드 삭제
- 🔍 검색 및 필터링
- 📈 관계 시각화
## 🎓 다음 단계
Drizzle ORM을 활용하여 다음 기능들을 쉽게 추가할 수 있습니다:
### 1. 프로필 테이블
```typescript
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. 게시글 시스템
```typescript
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. 관계 쿼리
```typescript
const postsWithUsers = await drizzleDb
.select()
.from(posts)
.leftJoin(users, eq(posts.userId, users.id));
```
모든 것이 타입 안전하게 작동합니다!
## ⚡ 성능
Drizzle ORM은 순수 SQL과 동일한 성능을 제공합니다.
- Zero-cost abstractions
- 최소한의 런타임 오버헤드
- Cloudflare D1에 최적화
## 🐛 문제 해결
### Q: 마이그레이션 파일이 생성되지 않아요
```bash
# 스키마 파일 경로 확인
ls src/lib/server/schema.ts
# Drizzle 설정 확인
cat drizzle.config.ts
```
### Q: 로컬 DB에 적용이 안 돼요
```bash
# 올바른 데이터베이스 이름 사용
pnpm wrangler d1 execute auth-db --local --file=./drizzle/0000_*.sql
```
### Q: 타입 에러가 발생해요
```bash
# 타입 재생성
pnpm svelte-kit sync
```
## 🎊 완료!
Drizzle ORM 마이그레이션이 성공적으로 완료되었습니다!
**주요 성과:**
- ✅ 타입 안전성 100% 확보
- ✅ 개발 생산성 향상
- ✅ 유지보수성 개선
- ✅ 자동 마이그레이션 시스템
- ✅ 빌드 및 테스트 성공
**다음 실행 명령어:**
```bash
pnpm cf:dev
```
즐거운 개발 되세요! 🚀