277 lines
6.7 KiB
Markdown
277 lines
6.7 KiB
Markdown
# 🎉 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
|
||
```
|
||
|
||
즐거운 개발 되세요! 🚀
|
||
|