Migration νμμλ Entity λ³κ²½μ¬νμ λ°μ΄ν°λ² μ΄μ€μ λ°μνκΈ° μν λ§μ΄κ·Έλ μ΄μ
μ μκ°μ μΌλ‘ κ΄λ¦¬ν μ μμ΅λλ€. CLIμ pnpm migrate λͺ
λ Ήμ΄λ₯Ό UIλ‘ λ체ν©λλ€.
Migration ν ꡬ쑰
Migration νμ λ κ°μ§ μ£Όμ μμμΌλ‘ ꡬμ±λ©λλ€:
- μΌμͺ½ Sidebar: λ§μ΄κ·Έλ μ΄μ
λͺ©λ‘ (Pending/Applied μνλ³λ‘ κ·Έλ£Ήν)
- μ€λ₯Έμͺ½ Content: μ νν λ§μ΄κ·Έλ μ΄μ
μ μμΈ μ 보μ Preview
λ§μ΄κ·Έλ μ΄μ
μν νμΈ
Status νμΈ
[Check Status] λ²νΌμ ν΄λ¦νλ©΄ νμ¬ λ§μ΄κ·Έλ μ΄μ
μνλ₯Ό νμΈν μ μμ΅λλ€.
| μν | μ€λͺ
| νμ |
|---|
| Pending | μμ§ μ μ©λμ§ μμ λ§μ΄κ·Έλ μ΄μ
| π λ
Έλμ |
| Applied | μ΄λ―Έ μ μ©λ λ§μ΄κ·Έλ μ΄μ
| β
μ΄λ‘μ |
| Failed | μ€ν μ€ μ€λ₯ λ°μ | β λΉ¨κ°μ |
λ°μ΄ν°λ² μ΄μ€λ³ μν
μ¬λ¬ λ°μ΄ν°λ² μ΄μ€κ° μ€μ λ κ²½μ° κ° DBμ μνλ₯Ό κ°λ³μ μΌλ‘ νμΈν μ μμ΅λλ€:
Development Master: β
Up to date (v20240115_143022)
Testing: β οΈ 2 pending migrations
Production: β
Up to date (v20240115_143022)
λ§μ΄κ·Έλ μ΄μ
μμ±
Entityλ₯Ό μμ νλ©΄ Sonamuκ° μλμΌλ‘ λ§μ΄κ·Έλ μ΄μ
μ μμ±ν©λλ€.
μλ μμ±λλ κ²½μ°
λ€μκ³Ό κ°μ Entity λ³κ²½μ¬νμ΄ μμ λ:
| λ³κ²½ νμ
| μμ |
|---|
| ν
μ΄λΈ μμ± | μ Entity μΆκ° |
| μ»¬λΌ μΆκ° | Property μΆκ° |
| μ»¬λΌ μμ | νμ
/κΈΈμ΄ λ³κ²½ |
| μ»¬λΌ μμ | Property μμ |
| μΈλ±μ€ μΆκ° | Index μΆκ° |
| μΈλν€ μΆκ° | belongsTo κ΄κ³ μΆκ° |
λ§μ΄κ·Έλ μ΄μ
νμΌ νμΈ
μμ±λ λ§μ΄κ·Έλ μ΄μ
νμΌμ ν΄λ¦νλ©΄ λ΄μ©μ 미리 λ³Ό μ μμ΅λλ€:
import type { Knex } from "knex";
export async function up(knex: Knex): Promise<void> {
await knex.schema.alterTable("users", (table) => {
table.string("phone", 20).nullable();
});
}
export async function down(knex: Knex): Promise<void> {
await knex.schema.alterTable("users", (table) => {
table.dropColumn("phone");
});
}
λ§μ΄κ·Έλ μ΄μ
μ€ν
λ¨μΌ λ§μ΄κ·Έλ μ΄μ
μ€ν
- λ§μ΄κ·Έλ μ΄μ
νμΌ μ ν
- [Apply] λ²νΌ ν΄λ¦
- νμΈ λͺ¨λ¬μμ [Confirm] ν΄λ¦
μ€ν κ³Όμ :
Development Master:
β 20240116_101530_add_user_phone (0.2s)
Testing:
β 20240116_101530_add_user_phone (0.2s)
All migrations applied successfully!
λͺ¨λ Pending λ§μ΄κ·Έλ μ΄μ
μ€ν
[Run All] λ²νΌμ ν΄λ¦νλ©΄ λκΈ° μ€μΈ λͺ¨λ λ§μ΄κ·Έλ μ΄μ
μ μμλλ‘ μ€νν©λλ€.
νλ‘λμ
μ£Όμ: νλ‘λμ
λ°μ΄ν°λ² μ΄μ€μ λ§μ΄κ·Έλ μ΄μ
μ μ€ννκΈ° μ μλ λ°λμ λ°±μ
νμΈμ.
λ§μ΄κ·Έλ μ΄μ
λ‘€λ°±
λ¨μΌ λ‘€λ°±
- Applied μνμ λ§μ΄κ·Έλ μ΄μ
μ ν
- [Rollback] λ²νΌ ν΄λ¦
- νμΈ λͺ¨λ¬μμ [Confirm] ν΄λ¦
λ‘€λ°± κ³Όμ :
Rolling back last migration...
Development Master:
β Rollback 20240116_101530_add_user_phone
Rollback completed successfully!
λ°μ΄ν° μμ€ μν: λ‘€λ°±μ ν
μ΄λΈμ΄λ 컬λΌμ μμ ν μ μμΌλ―λ‘ λ°μ΄ν°κ° μμ€λ μ μμ΅λλ€.
Migration Preview
λ§μ΄κ·Έλ μ΄μ
μ μ€ννκΈ° μ μ μ΄λ€ λ³κ²½μ΄ λ°μν μ§ λ―Έλ¦¬ νμΈν μ μμ΅λλ€.
Preview λ΄μ©
π Migration: 20240116_101530_add_user_profile
Changes:
β
Table: users
+ column: profile_image (string, nullable)
+ column: bio (text, nullable)
+ index: (email) unique
β οΈ Table: posts
- column: deprecated_field
β οΈ Warning: Data in this column will be lost!
μμ΄μ½ μλ―Έ:
- β
μΆκ°: μλ‘μ΄ ν
μ΄λΈ/컬λΌ/μΈλ±μ€
- π μμ : κΈ°μ‘΄ μ»¬λΌ νμ
/κΈΈμ΄ λ³κ²½
- β οΈ μμ : ν
μ΄λΈ/μ»¬λΌ μμ (λ°μ΄ν° μμ€ κ°λ₯)
λ€μ€ λ°μ΄ν°λ² μ΄μ€ κ΄λ¦¬
Sonamuλ μ¬λ¬ λ°μ΄ν°λ² μ΄μ€λ₯Ό λμμ κ΄λ¦¬ν μ μμ΅λλ€.
λ°μ΄ν°λ² μ΄μ€ μ ν
λ§μ΄κ·Έλ μ΄μ
μ€ν μ λμ λ°μ΄ν°λ² μ΄μ€λ₯Ό μ νν μ μμ΅λλ€:
- βοΈ Development Master
- βοΈ Testing
- β Production (μλ μ ν)
κΈ°λ³Έμ μΌλ‘ _masterλ‘ λλλ λ°μ΄ν°λ² μ΄μ€μ test λ°μ΄ν°λ² μ΄μ€μ μλμΌλ‘ μ μ©λ©λλ€.
νλ‘λμ
λ°μ΄ν°λ² μ΄μ€λ λͺ
μμ μΌλ‘ μ νν΄μΌ μ μ©λ©λλ€.
λ§μ΄κ·Έλ μ΄μ
μμ
λ§μ΄κ·Έλ μ΄μ
μ νμΌλͺ
μ νμμ€ν¬ν μμλλ‘ μ€νλ©λλ€:
β
20240115_120000_create_users_table.ts
β
20240115_130000_create_posts_table.ts
π 20240116_101530_add_user_phone.ts β λ€μ μ€ν
π 20240116_102045_add_post_tags.ts
μμ λ³κ²½
μμλ₯Ό λ³κ²½ν΄μΌ νλ κ²½μ°:
- λ§μ΄κ·Έλ μ΄μ
νμΌλͺ
μ νμμ€ν¬ν μμ
- νμΌ μμ€ν
μμ μ§μ λ³κ²½
- UIμμ μλ‘κ³ μΉ¨
μΈλν€ κ΄κ³ μ£Όμ: μ°Έμ‘°νλ ν
μ΄λΈμ΄ λ¨Όμ μμ±λμ΄μΌ ν©λλ€.
μ: posts.user_id β users.id κ΄κ³λΌλ©΄ users ν
μ΄λΈμ λ¨Όμ μμ±ν΄μΌ ν¨
λ¬Έμ ν΄κ²°
λ§μ΄κ·Έλ μ΄μ
μ€ν¨
μ¦μ: λ§μ΄κ·Έλ μ΄μ
μ€ν μ€ μ€λ₯ λ°μ
μμΈ λ° ν΄κ²°:
| μ€λ₯ | μμΈ | ν΄κ²° λ°©λ² |
|---|
| Foreign key constraint | μ°Έμ‘° ν
μ΄λΈμ΄ μμ | μ°Έμ‘° ν
μ΄λΈμ λ¨Όμ μμ± |
| Column already exists | μ΄λ―Έ μ‘΄μ¬νλ μ»¬λΌ | λ§μ΄κ·Έλ μ΄μ
νμΌ νμΈ |
| Cannot drop column | λ°μ΄ν°κ° μκ±°λ μ μ½μ‘°κ±΄ μ‘΄μ¬ | μ μ½μ‘°κ±΄ λ¨Όμ μμ |
λ§μ΄κ·Έλ μ΄μ
κΈ°λ‘ λΆμΌμΉ
μ¦μ: μ€μ DB μνμ λ§μ΄κ·Έλ μ΄μ
κΈ°λ‘μ΄ λ€λ¦
ν΄κ²°:
# CLIμμ μ€ν
pnpm migrate clear # λ§μ΄κ·Έλ μ΄μ
κΈ°λ‘ μμ
pnpm migrate status # νμ¬ μν νμΈ
λ‘€λ°± λΆκ°λ₯
μ¦μ: λ‘€λ°± μλ μ μ€λ₯ λ°μ
μμΈ: down() ν¨μκ° μ λλ‘ μ μλμ§ μμ
ν΄κ²°: λ§μ΄κ·Έλ μ΄μ
νμΌμ μ΄μ΄ down() ν¨μλ₯Ό μμ
μ€μ ν
1. μμ λ¨μλ‘ λ§μ΄κ·Έλ μ΄μ
# β λμ μ: λͺ¨λ λ³κ²½μ¬νμ ν λ²μ
- 10κ° Entity λμ μμ
- ν λ²μ λ§μ΄κ·Έλ μ΄μ
μ€ν
# β
μ’μ μ: μμ λ¨μλ‘ λλκΈ°
- Entity 1κ°μ© μμ
- λ§μ΄κ·Έλ μ΄μ
μμ± λ° μ€ν
- ν
μ€νΈ ν λ€μ Entity μ§ν
2. νλ‘λμ
μ ν
μ€νΈ
1. Development DBμμ ν
μ€νΈ
β
2. Testing DBμμ κ²μ¦
β
3. λ°μ΄ν° λ°±μ
β
4. Production DBμ μ μ©
3. λ§μ΄κ·Έλ μ΄μ
κΈ°λ‘ κ΄λ¦¬
- Gitμ λ§μ΄κ·Έλ μ΄μ
νμΌ μ»€λ°
- μ»€λ° λ©μμ§μ λ³κ²½ λ΄μ© λͺ
μ
- νμλ€κ³Ό λ§μ΄κ·Έλ μ΄μ
μμ 곡μ
λ€μ λ¨κ³