264 lines
7.4 KiB
Markdown
264 lines
7.4 KiB
Markdown
# 📍 Cloudflare D1 로컬 데이터베이스 파일 위치
|
|
|
|
## 🗂️ 데이터베이스 파일 위치
|
|
|
|
Cloudflare Workers의 로컬 개발 환경(`pnpm cf:dev`)에서 사용하는 D1 데이터베이스는 다음 위치에 저장됩니다:
|
|
|
|
```
|
|
C:\giteat\dd\.wrangler\state\v3\d1\miniflare-D1DatabaseObject\
|
|
└── e833abeb83abd38e60de8166ab13bbd4d7a5636dc148a7fd8ec47b7678c87854.sqlite
|
|
```
|
|
|
|
### 전체 경로
|
|
```
|
|
프로젝트폴더\.wrangler\state\v3\d1\miniflare-D1DatabaseObject\[해시].sqlite
|
|
```
|
|
|
|
## 📊 현재 데이터베이스 정보
|
|
|
|
### 파일 크기
|
|
- **20,480 bytes** (약 20 KB)
|
|
|
|
### 포함된 테이블
|
|
```
|
|
┌─────────────────┐
|
|
│ name │
|
|
├─────────────────┤
|
|
│ users │ ← 우리가 생성한 테이블
|
|
│ sqlite_sequence │ ← SQLite 내부 테이블 (AUTO_INCREMENT 관리)
|
|
│ _cf_METADATA │ ← Cloudflare 메타데이터
|
|
└─────────────────┘
|
|
```
|
|
|
|
## 🔍 왜 프로젝트 폴더에서 찾을 수 없나요?
|
|
|
|
### 1. 숨김 디렉토리
|
|
`.wrangler` 디렉토리는 앞에 점(`.`)이 있어서 기본적으로 숨겨진 폴더입니다.
|
|
|
|
### 2. Wrangler가 자동 관리
|
|
`wrangler dev` 실행 시 자동으로 생성되고 관리됩니다.
|
|
|
|
### 3. gitignore에 포함
|
|
일반적으로 `.gitignore`에 포함되어 Git에 커밋되지 않습니다.
|
|
|
|
## 📁 전체 .wrangler 구조
|
|
|
|
```
|
|
.wrangler/
|
|
├── state/
|
|
│ └── v3/
|
|
│ ├── d1/ # D1 데이터베이스
|
|
│ │ └── miniflare-D1DatabaseObject/
|
|
│ │ └── [해시].sqlite # ← 여기!
|
|
│ ├── do/ # Durable Objects
|
|
│ │ └── dd-CounterDurableObject/
|
|
│ │ ├── [해시].sqlite
|
|
│ │ ├── [해시].sqlite-shm
|
|
│ │ └── [해시].sqlite-wal
|
|
│ ├── cache/ # Cache API
|
|
│ │ └── miniflare-CacheObject/
|
|
│ │ └── [해시].sqlite
|
|
│ └── workflows/ # Workflows (비어있음)
|
|
└── tmp/ # 임시 파일
|
|
```
|
|
|
|
## 🛠️ 데이터베이스 파일 직접 접근
|
|
|
|
### 방법 1: Wrangler CLI 사용 (권장)
|
|
|
|
```bash
|
|
# 테이블 조회
|
|
pnpm wrangler d1 execute auth-db --local --command="SELECT * FROM users"
|
|
|
|
# 스키마 확인
|
|
pnpm wrangler d1 execute auth-db --local --command="PRAGMA table_info(users)"
|
|
|
|
# 모든 테이블 조회
|
|
pnpm wrangler d1 execute auth-db --local --command="SELECT name FROM sqlite_master WHERE type='table'"
|
|
```
|
|
|
|
### 방법 2: SQLite CLI 도구 사용
|
|
|
|
```bash
|
|
# SQLite CLI가 설치되어 있다면
|
|
sqlite3 .wrangler\state\v3\d1\miniflare-D1DatabaseObject\[해시].sqlite
|
|
|
|
# SQLite 프롬프트에서
|
|
sqlite> .tables
|
|
sqlite> SELECT * FROM users;
|
|
sqlite> .schema users
|
|
```
|
|
|
|
### 방법 3: DB Browser for SQLite (GUI)
|
|
|
|
1. [DB Browser for SQLite](https://sqlitebrowser.org/) 다운로드
|
|
2. 파일 열기: `.wrangler\state\v3\d1\miniflare-D1DatabaseObject\[해시].sqlite`
|
|
3. GUI로 데이터 확인 및 편집
|
|
|
|
### 방법 4: Drizzle Studio (권장!)
|
|
|
|
```bash
|
|
pnpm db:studio
|
|
```
|
|
|
|
브라우저에서 자동으로 열리며 데이터베이스를 시각적으로 관리할 수 있습니다.
|
|
|
|
## 🔐 해시 파일명의 의미
|
|
|
|
파일명인 `e833abeb83abd38e60de8166ab13bbd4d7a5636dc148a7fd8ec47b7678c87854.sqlite`는:
|
|
|
|
- **데이터베이스 ID의 해시값**
|
|
- `wrangler.jsonc`의 `database_id: "local-db"`를 기반으로 생성
|
|
- 각 데이터베이스마다 고유한 해시를 가짐
|
|
|
|
## 📝 데이터베이스 파일 관리
|
|
|
|
### 데이터베이스 초기화 (리셋)
|
|
|
|
로컬 데이터베이스를 완전히 초기화하고 싶다면:
|
|
|
|
```bash
|
|
# 방법 1: .wrangler 폴더 삭제
|
|
rmdir /s /q .wrangler
|
|
|
|
# 방법 2: D1 폴더만 삭제
|
|
rmdir /s /q .wrangler\state\v3\d1
|
|
|
|
# 그 후 다시 마이그레이션 실행
|
|
pnpm db:push
|
|
```
|
|
|
|
### 데이터베이스 백업
|
|
|
|
```bash
|
|
# 백업 디렉토리 생성
|
|
mkdir backups
|
|
|
|
# 데이터베이스 파일 복사
|
|
copy .wrangler\state\v3\d1\miniflare-D1DatabaseObject\*.sqlite backups\local-db-backup.sqlite
|
|
|
|
# 또는 SQL 덤프로 백업
|
|
pnpm wrangler d1 export auth-db --local --output=backups\backup.sql
|
|
```
|
|
|
|
### 데이터베이스 복원
|
|
|
|
```bash
|
|
# SQL 파일로 복원
|
|
pnpm wrangler d1 execute auth-db --local --file=backups\backup.sql
|
|
```
|
|
|
|
## 🆚 로컬 vs 프로덕션 데이터베이스
|
|
|
|
### 로컬 개발 (`--local`)
|
|
```
|
|
위치: .wrangler\state\v3\d1\miniflare-D1DatabaseObject\[해시].sqlite
|
|
접근: pnpm wrangler d1 execute auth-db --local --command="..."
|
|
```
|
|
|
|
### 프로덕션 (`--remote`)
|
|
```
|
|
위치: Cloudflare 클라우드 (물리적 접근 불가)
|
|
접근: pnpm wrangler d1 execute auth-db --remote --command="..."
|
|
```
|
|
|
|
## 🎯 NPM 스크립트로 쉽게 접근
|
|
|
|
`package.json`에 이미 추가된 스크립트:
|
|
|
|
```json
|
|
{
|
|
"scripts": {
|
|
"db:query": "wrangler d1 execute auth-db --local --command=\"SELECT * FROM users\"",
|
|
"db:query:remote": "wrangler d1 execute auth-db --remote --command=\"SELECT * FROM users\"",
|
|
"db:studio": "drizzle-kit studio"
|
|
}
|
|
}
|
|
```
|
|
|
|
사용법:
|
|
```bash
|
|
# 로컬 사용자 조회
|
|
pnpm db:query
|
|
|
|
# 프로덕션 사용자 조회
|
|
pnpm db:query:remote
|
|
|
|
# Drizzle Studio 실행
|
|
pnpm db:studio
|
|
```
|
|
|
|
## 🔍 현재 데이터 확인
|
|
|
|
로컬 데이터베이스의 현재 사용자를 확인하려면:
|
|
|
|
```bash
|
|
pnpm db:query
|
|
```
|
|
|
|
또는:
|
|
|
|
```bash
|
|
pnpm wrangler d1 execute auth-db --local --command="SELECT id, email, nickname, datetime(created_at, 'unixepoch') as created_at FROM users"
|
|
```
|
|
|
|
## 📊 데이터베이스 통계
|
|
|
|
```bash
|
|
# 사용자 수 확인
|
|
pnpm wrangler d1 execute auth-db --local --command="SELECT COUNT(*) as user_count FROM users"
|
|
|
|
# 데이터베이스 크기 확인
|
|
pnpm wrangler d1 execute auth-db --local --command="SELECT page_count * page_size as size FROM pragma_page_count(), pragma_page_size()"
|
|
|
|
# 마지막 생성된 사용자
|
|
pnpm wrangler d1 execute auth-db --local --command="SELECT * FROM users ORDER BY created_at DESC LIMIT 1"
|
|
```
|
|
|
|
## 🚨 주의사항
|
|
|
|
### 1. 직접 파일 수정 금지
|
|
SQLite 파일을 직접 편집하는 것은 권장하지 않습니다. 항상 Wrangler CLI나 Drizzle Studio를 사용하세요.
|
|
|
|
### 2. 개발 중 데이터 손실 주의
|
|
`.wrangler` 폴더는 개발용이므로 중요한 데이터를 저장하지 마세요. 프로덕션에는 `--remote`를 사용하세요.
|
|
|
|
### 3. Git에 커밋하지 않기
|
|
`.gitignore`에 `.wrangler` 포함 확인:
|
|
```gitignore
|
|
.wrangler/
|
|
```
|
|
|
|
### 4. 팀원과 DB 공유 불가
|
|
각 개발자는 자신의 로컬 DB를 가집니다. 스키마는 마이그레이션 파일(`drizzle/`)로 공유됩니다.
|
|
|
|
## 🎓 정리
|
|
|
|
**질문:** `cf:dev`에서 동작할 때 로컬 서버가 바라보고 있는 db 파일은 어디에 있나요?
|
|
|
|
**답변:**
|
|
```
|
|
C:\giteat\dd\.wrangler\state\v3\d1\miniflare-D1DatabaseObject\
|
|
└── e833abeb83abd38e60de8166ab13bbd4d7a5636dc148a7fd8ec47b7678c87854.sqlite
|
|
```
|
|
|
|
**쉽게 접근하는 방법:**
|
|
```bash
|
|
# Drizzle Studio (GUI)
|
|
pnpm db:studio
|
|
|
|
# CLI로 쿼리
|
|
pnpm db:query
|
|
|
|
# 직접 SQL 실행
|
|
pnpm wrangler d1 execute auth-db --local --command="SELECT * FROM users"
|
|
```
|
|
|
|
**작동이 정상인 이유:**
|
|
- Wrangler가 자동으로 `.wrangler` 폴더에 SQLite 파일을 생성하고 관리
|
|
- `wrangler.jsonc`의 D1 바인딩 설정에 따라 자동으로 연결
|
|
- 마이그레이션 파일(`drizzle/`)을 실행하여 테이블 생성 완료
|
|
|
|
즐거운 개발 되세요! 🚀
|
|
|