Skip to main content
pnpm migrate ๋ช…๋ น์–ด๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ์„ ์•ˆ์ „ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. Entity ์ •์˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž๋™์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ƒ์„ฑํ•˜๊ณ , ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ผ๊ด€๋˜๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ๊ฐœ๋…

๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ์„ ๋ฒ„์ „ ๊ด€๋ฆฌํ•˜๋Š” ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค:
  • Entity ๊ธฐ๋ฐ˜: Entity ์ •์˜์—์„œ ์ž๋™์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ƒ์„ฑ
  • ์ˆœ์ฐจ ์‹คํ–‰: ์ƒ์„ฑ ์ˆœ์„œ๋Œ€๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ ์šฉ
  • ๋‹ค์ค‘ DB ์ง€์›: ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋™์‹œ์— ๊ด€๋ฆฌ
  • ์ž๋™ ๊ฐ์ง€: Entity ๋ณ€๊ฒฝ์‚ฌํ•ญ ์ž๋™ ๊ฐ์ง€ ๋ฐ ์ฝ”๋“œ ์ƒ์„ฑ

๋ช…๋ น์–ด

status - ์ƒํƒœ ํ™•์ธ

ํ˜„์žฌ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
์ถœ๋ ฅ ์˜ˆ์‹œ:
์ƒํƒœ ์ข…๋ฅ˜:
  • โœ“ Up to date: ๋ชจ๋“  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ ์šฉ ์™„๋ฃŒ
  • โš  N pending: N๊ฐœ์˜ ๋ฏธ์ ์šฉ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜
  • โŒ Error: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์‹คํŒจ

run - ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์‹คํ–‰

๋Œ€๊ธฐ ์ค‘์ธ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ๋ชจ๋‘ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.
์‹คํ–‰ ๊ณผ์ •:
์ž๋™ ์ƒ์„ฑ ๋ฐ ์ ์šฉ:
  • Entity ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๊ฐ์ง€
  • ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ฝ”๋“œ ์ž๋™ ์ƒ์„ฑ
  • ๋ชจ๋“  ๋Œ€์ƒ DB์— ์ˆœ์ฐจ ์ ์šฉ
Sonamu๋Š” Entity ์ •์˜๋ฅผ ๋ถ„์„ํ•˜์—ฌ ํ•„์š”ํ•œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜๋™์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํŒŒ์ผ์„ ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ƒ์„ฑ

์ž๋™ ์ƒ์„ฑ

Entity๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด Sonamu๊ฐ€ ์ž๋™์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
user.entity.ts

๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํŒŒ์ผ

์ƒ์„ฑ๋œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํŒŒ์ผ์€ src/migrations/ ๋””๋ ‰ํ† ๋ฆฌ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
src/migrations/20240116_103045_add_phone_to_users.ts
๊ตฌ์กฐ:
  • up(): ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ ์šฉ (ํ…Œ์ด๋ธ” ์ƒ์„ฑ, ์ปฌ๋Ÿผ ์ถ”๊ฐ€ ๋“ฑ)
  • down(): ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋กค๋ฐฑ (๋ณ€๊ฒฝ์‚ฌํ•ญ ๋˜๋Œ๋ฆฌ๊ธฐ)

์ง€์›ํ•˜๋Š” ๋ณ€๊ฒฝ์‚ฌํ•ญ

Sonamu๊ฐ€ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•˜๊ณ  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ƒ์„ฑํ•˜๋Š” ๋ณ€๊ฒฝ์‚ฌํ•ญ:

๋‹ค์ค‘ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ

Sonamu๋Š” ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋™์‹œ์— ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์„ฑ

sonamu.config.ts
๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋Œ€์ƒ:
  • ๊ธฐ๋ณธ๊ฐ’์€ ํ˜„์žฌ NODE_ENV preset
  • development, staging, production, test ๊ฐ™์€ ๋ช…์‹œ์  preset
  • ์ฝ๊ธฐ ์ „์šฉ preset์€ ์ œ์™ธ
  • _slave๊ฐ€ ์•„๋‹Œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

์ผ๊ด„ ์ ์šฉ

์‹ค์ „ ์›Œํฌํ”Œ๋กœ์šฐ

1. Entity ๋ณ€๊ฒฝ

user.entity.ts

2. ์ƒํƒœ ํ™•์ธ

3. ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ ์šฉ

4. ์ฝ”๋“œ ์—…๋ฐ์ดํŠธ

user.model.ts

๊ณ ๊ธ‰ ์‚ฌ์šฉ๋ฒ• (ํ”„๋กœ๊ทธ๋ž˜๋งคํ‹ฑ)

CLI ๋ช…๋ น์–ด๋กœ ์ œ๊ณต๋˜์ง€ ์•Š๋Š” ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ์€ Migrator ํด๋ž˜์Šค๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Migrator ํด๋ž˜์Šค ์‚ฌ์šฉ

src/scripts/migration-tools.ts

๋กค๋ฐฑ ์Šคํฌ๋ฆฝํŠธ

src/scripts/rollback-migration.ts
์‹คํ–‰:
๋ฐ์ดํ„ฐ ์†์‹ค ์œ„ํ—˜: ๋กค๋ฐฑ์€ ํ…Œ์ด๋ธ”์ด๋‚˜ ์ปฌ๋Ÿผ์„ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ”„๋กœ๋•์…˜์—์„œ๋Š” ๋งค์šฐ ์‹ ์ค‘ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜์„ธ์š”.

์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์•ก์…˜

Migrator.runAction() ๋ฉ”์„œ๋“œ๊ฐ€ ์ง€์›ํ•˜๋Š” ์•ก์…˜:

๋ฌธ์ œ ํ•ด๊ฒฐ

๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ถฉ๋Œ

๋ฌธ์ œ: ์—ฌ๋Ÿฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋™์‹œ์— ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ƒ์„ฑ
ํ•ด๊ฒฐ:

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์‹คํŒจ

๋ฌธ์ œ: DB ์—ฐ๊ฒฐ ์‹คํŒจ
ํ•ด๊ฒฐ:

๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ˆœ์„œ ์˜ค๋ฅ˜

๋ฌธ์ œ: ์ž˜๋ชป๋œ ์ˆœ์„œ๋กœ ์ ์šฉ๋จ
ํ•ด๊ฒฐ: ์™ธ๋ž˜ํ‚ค ์ฐธ์กฐ ๊ด€๊ณ„๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ, ์ฐธ์กฐ๋˜๋Š” ํ…Œ์ด๋ธ”์ด ๋จผ์ € ์ƒ์„ฑ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜์ • ๋ฐฉ๋ฒ• 1: ํ”„๋กœ๊ทธ๋ž˜๋งคํ‹ฑ ๋กค๋ฐฑ ํ›„ ์žฌ์ ์šฉ
์ˆ˜์ • ๋ฐฉ๋ฒ• 2: Entity ์ •์˜ ์ˆœ์„œ ์กฐ์ •

๋ฒ ์ŠคํŠธ ํ”„๋ž™ํ‹ฐ์Šค

1. ์ž์ฃผ ์ ์šฉํ•˜๊ธฐ

2. ํ”„๋กœ๋•์…˜ ์ „ ํ…Œ์ŠคํŠธ

3. ๋ฐฑ์—… ํ•„์ˆ˜

4. ๋กค๋ฐฑ ๊ฐ€๋Šฅ์„ฑ ๊ณ ๋ ค

5. Git์œผ๋กœ ๋ฒ„์ „ ๊ด€๋ฆฌ

๋‹ค์Œ ๋‹จ๊ณ„

fixture

ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌํ•˜๊ธฐ

Entity

Entity ์ •์˜ ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ธฐ