๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

INFRA/DB

[INFRA/DB] ๋กค๋ฐฑ์„ ๊ณ ๋ คํ•ด ํ•˜์œ„ํ˜ธํ™˜์„ฑ์„ ๊ฐ–์ถ˜ ์Šคํ‚ค๋งˆ ์„ค๊ณ„ํ•˜๊ธฐ

๐Ÿ“‘ Table of Contents

๐Ÿ“ ๋กค๋ฐฑ์„ ๊ณ ๋ คํ•˜๊ฒŒ ๋œ ์ด์œ 

๐Ÿค” ์Šคํ‚ค๋งˆ๋Š” ์–ด๋–ป๊ฒŒ ๋กค๋ฐฑํ•  ์ˆ˜ ์žˆ์ง€?

๐Ÿ™‹ ์ฒซ ์‹œ๋„, ๋กค๋ฐฑ์šฉ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ

๐Ÿ” ์Šคํ‚ค๋งˆ ๋กค๋ฐฑ, ๊ผญ ํ•„์š”ํ•œ๊ฐ€?
     โœ… flyway ๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ์„œ ํ•˜๊ฒŒ ๋œ ์˜คํ•ด
     โœ… SRE ์›์น™์„ ํ†ตํ•œ ๊นจ๋‹ฌ์Œ

๐Ÿš€ Expand and Contract ์ „๋žต
     โœ… ์˜ˆ์‹œ๋กœ ์ดํ•ดํ•ด๋ณด๊ธฐ
     โœ… DDL ๋ณ„ ์›์น™

๐Ÿš€ Flyway ์„ค์ • ์ผ๋ถ€ ๋ณ€๊ฒฝ

๐Ÿš€ ์‹œ๋“œ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ, R prefix ์‚ฌ์šฉํ•˜๊ธฐ

๐Ÿ“ ๋กค๋ฐฑ์„ ๊ณ ๋ คํ•˜๊ฒŒ ๋œ ์ด์œ 

์ง€๋‚œ 1๊ฐœ์›”ํ•˜๊ณ ๋„ ๋ช‡์ฃผ๊ฐ„์˜ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ์ƒํ™ฉ์—์„œ, ์šฐ๋ฆฌ๋Š” ์žฆ์€ ์š”๊ตฌ์‚ฌํ•ญ์˜ ๋ณ€ํ™”๋ฅผ ๊ฒช๊ฒŒ ๋๋‹ค. ์ด์— ๋”ฐ๋ผ ์ฝ”๋“œ๋Š” ๋น ๋ฅด๊ฒŒ ๋ณ€๊ฒฝ์ด ์ด๋ค„์กŒ๊ณ , ๋ฒ„๊ทธ ํ”ฝ์Šค๋„ ์‹ฌ์‹ฌ์ฐฎ๊ฒŒ ํ•„์š”ํ–ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ QA ๋ฅผ ํ•˜๊ฑฐ๋‚˜, ๋ฐ๋ชจ๋ฐ์ด๋ฅผ ํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ๊ณผ ๊ฐ™์ด ๋น ๋ฅด๊ฒŒ ์•ˆ์ •์ ์ธ ์„œ๋ฒ„ ์ƒํƒœ๋กœ ๋Œ๋ ค์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๋‹นํ˜นํ•˜๊ธฐ ์ผ์‘ค์˜€๋‹ค. 

 

ํ˜„์žฌ ์‹ค์ œ ์„œ๋น„์Šค ์ƒํ™ฉ์ด ์•„๋‹˜์—๋„ ์ด๋Ÿฐ ์–ด๋ ค์›€์„ ๊ฒช๋Š”๋ฐ, ์‹ค์ œ ์„œ๋น„์Šค ์ƒํ™ฉ์—์„œ๋Š” ์ด์ „ ๋ฒ„์ „์œผ๋กœ ๋กค๋ฐฑ์— ์‚ฌ์šฉ์ž๋“ค์ด ์ผ๋ถ€ ๊ธฐ๋Šฅ๋งŒ์ด๋ผ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์„ ํ•˜๊ฒŒ ๋๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ณด๋‹ˆ ์ž์—ฐ์Šค๋ ˆ ๋กค๋ฐฑ์˜ ํ•„์š”์„ฑ์„ ์ฒด๊ฐํ•˜๊ณ , ๋„์ž…ํ•˜๊ฒŒ ๋๋‹ค.


๐Ÿค” ์Šคํ‚ค๋งˆ๋Š” ์–ด๋–ป๊ฒŒ ๋กค๋ฐฑํ•  ์ˆ˜ ์žˆ์ง€?

์„œ๋ฒ„์˜ ๋กค๋ฐฑ์„ ๊ณ ๋ คํ•˜๊ณ  ๋‚˜์„œ, ๊ฐ€์žฅ ํฐ ์˜๋ฌธ์ด ๋“ค์—ˆ๋˜ ์ง€์ ์€ ์Šคํ‚ค๋งˆ์˜ ๋กค๋ฐฑ์ด์—ˆ๋‹ค.

 

ํ˜„์žฌ ์šฐ๋ฆฌ๋Š” ์Šคํ‚ค๋งˆ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋„๊ตฌ๋กœ flyway ๋ฅผ ์‚ฌ์šฉ ์ค‘์ด๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ์„œ๋ฒ„๊ฐ€ ๋กค๋ฐฑ๋œ๋‹ค๋ฉด, ๋‹น์—ฐํžˆ flyway ์Šคํฌ๋ฆฝํŠธ ์—ญ์‹œ๋„ ๋กค๋ฐฑ์ด ๋œ๋‹ค. flyway ์ž์ฒด์—์„œ๋Š” ๋กค๋ฐฑ์„ ์ œ๊ณตํ•˜์ง€ ์•Š์•˜๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ flyway ์˜ ๋Œ€์ฒด์žฌ์ธ Liquibase ์—์„œ๋Š” ๋กค๋ฐฑ์„ ์ œ๊ณตํ–ˆ๊ธฐ์— flyway ๋ฅผ ํ†ตํ•ด์„œ๋„ ๋กค๋ฐฑ์ด ๊ฐ€๋Šฅํ• ๊นŒ? ํ•˜๋Š” ์˜๋ฌธ์„ ํ’ˆ๊ณ  ๊ณ ๋ฏผ์„ ์‹œ์ž‘ํ–ˆ๋‹ค.


๐Ÿ™‹ ์ฒซ ์‹œ๋„, ๋กค๋ฐฑ์šฉ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ

์ฒ˜์Œ์—๋Š” ๋กค๋ฐฑ์šฉ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์„ ์„ ํƒํ–ˆ๋‹ค.

 

๋กค๋ฐฑ์šฉ ์Šคํฌ๋ฆฝํŠธ๋Š” ๋‹ค๋ฅธ ๊ฒฝ๋กœ์— ๋‘๊ณ , ๋กค๋ฐฑ์„ ํ•ด์•ผ ํ•  ๋•Œ๋งŒ ํ•ด๋‹น ๊ฒฝ๋กœ๋ฅผ ํ™œ์„ฑํ™”์‹œ์ผœ ๋กค๋ฐฑ์šฉ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋™์ž‘ํ•˜๋„๋ก ํ•˜๊ณ ์ž ํ–ˆ๋‹ค.

src/main/resources/
db/migration/                    # ํ‰์‹œ์šฉ  ์Šคํฌ๋ฆฝํŠธ
V1__create_diary.sql

db/migration_emergency/          # ๋น„์ƒ์‹œ์šฉ ๋ณด์กด ์Šคํฌ๋ฆฝํŠธ
V2__preserve_diary_for_rollback.sql

 

์˜ˆ๋ฅผ ๋“ค์–ด, ์œ„์™€ ๊ฐ™์ด ๊ฒฝ๋กœ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด๋‹ค. 

  • ํ‰์ƒ์‹œ ์ •์ƒ ๋™์ž‘ ์ƒํ™ฉ : /db/migration ๋งŒ์„ ํ™œ์„ฑํ™”
  • ๋กค๋ฐฑ ํ•„์š” ์‹œ ์ƒํ™ฉ : /db/migration_emergency ๊นŒ์ง€ ์ธ์‹๋˜๋„๋ก ํ•˜์—ฌ ๋กค๋ฐฑ์„ ๋ฐ˜์˜

๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์— ๋Œ€ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์šฐ๋ ค๊ฐ€ ์žˆ์—ˆ๋‹ค.

 

1. ์†๋„๊ฐ€ ๋„ˆ๋ฌด ๋А๋ฆฌ๋‹ค.

ํ˜„์žฌ ๋ฐฉ์‹๋Œ€๋กœ๋ผ๋ฉด, ๋น„์ƒ์‹œ์šฉ ๋ณด์กด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํฌํ•จํ•˜๋„๋ก ์•ก์…˜์„ ๋Œ๋ ค์•ผ ํ•œ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์žฌ๋ฐฐํฌ๊ฐ€ ํ•„์š”ํ•˜๊ธฐ์— ์žฅ์•  ๋ฐœ์ƒ ์‹œ ์‚ฌ์šฉ์ž๊ฐ€ ๋Œ€๊ธฐํ•ด์•ผ ํ•˜๋Š” ์‹œ๊ฐ„์ด ๊ธธ๋‹ค.

 

2. ๊ฐœ๋ฐœ์ž๊ฐ€ ์ˆ˜๋™์œผ๋กœ ๊ด€์—ฌํ•ด์•ผ ํ•˜๋Š” ๋ถ€๋ถ„์ด ๋„ˆ๋ฌด ํฌ๋‹ค.

๊ฐœ๋ฐœ์ž๋Š” ์Šคํ‚ค๋งˆ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์ด๋กœ ์ธํ•ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์ด ๋ฌด์—‡์ธ์ง€ ๋ชจ๋“  ๊ฒƒ๋“ค์„ ๊ณ ๋ คํ•ด ๋กค๋ฐฑ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์งœ์•ผ ํ•œ๋‹ค. ์ด๋Š” ์„ธ์‹ฌํ•˜๊ณ  ๋ณต์žกํ•œ ์ž‘์—…์ด๊ธฐ์— ์ž๋™ํ™”ํ•  ์ˆ˜๋„ ์—†๊ณ , ๊ฐœ๋ฐœ์ž๊ฐ€ ์ˆ˜๋™์œผ๋กœ ๊ด€์—ฌํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด ์œ„ํ—˜๋„๊ฐ€ ๋†’๋‹ค๋Š” ์ƒ๊ฐ์„ ํ–ˆ๋‹ค.

 

๊ทธ๋ž˜์„œ ํ•ด๋‹น ๋ฐฉ์‹์— ๋Œ€ํ•œ ํ™•์‹ ์ด ๋“ค์ง€ ์•Š์•„, ๊ณ„์†ํ•ด์„œ ๊ณ ๋ฏผ ํ–ˆ๋‹ค.


๐Ÿ” ์Šคํ‚ค๋งˆ ๋กค๋ฐฑ, ๊ผญ ํ•„์š”ํ•œ๊ฐ€?

 

โœ… flyway ๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ์„œ ํ•˜๊ฒŒ ๋œ ์˜คํ•ด

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

๊ทธ๋Ÿฌ๋‚˜ ์‚ฌ์‹ค ๋‹ค์‹œ ์ƒ๊ฐํ•ด๋ณด๋ฉด ๋ฐ˜๋“œ์‹œ ์„œ๋ฒ„๊ฐ€ ๋กค๋ฐฑ๋œ๋‹ค๊ณ  ํ•ด์„œ ์Šคํ‚ค๋งˆ๊นŒ์ง€ ๋กค๋ฐฑ๋  ํ•„์š”๋Š” ์—†๋‹ค. ์„œ๋ฒ„์—์„œ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜, ๊ธฐ๋Šฅ์ด ๋ณ€๊ฒฝ๋จ์— ๋”ฐ๋ผ ์Šคํ‚ค๋งˆ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฑด ๋‹น์—ฐํ•œ ์ผ์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์„œ๋ฒ„๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜๋Š” ์‹œ์ ๊ณผ ๋ฐ˜๋“œ์‹œ ๋งž๋ฌผ๋ ค์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ๋ฅผ ์—…๋ฐ์ดํŠธํ•  ํ•„์š”๋Š” ์—†๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์ด์— ๋Œ€ํ•ด ์‹ค๋ฌด์ž๋“ค๊ณผ ์ฝ”์น˜์ง„๋“ค์—๊ฒŒ๋„ ์—ฌ์ญค๋ณธ ๊ฒฐ๊ณผ, ์„œ๋น„์Šค๊ฐ€ ๋ฒ„์ „์—…๋  ๋•Œ ๋ฐ˜๋“œ์‹œ ์Šคํ‚ค๋งˆ๊ฐ€ ๋™์‹œ์— ์—…๋ฐ์ดํŠธ ๋  ํ•„์š”๋Š” ์—†๋‹ค๋Š” ์ด์•ผ๊ธฐ๋ฅผ ๋งŽ์ด ๋“ค์—ˆ๋‹ค. ์ฃผ๋กœ ๋ฒ„์ „์—… ์ „์— ๋ฏธ๋ฆฌ ์ค‘์š”ํ•œ ํ…Œ์ด๋ธ”์€ ๋งŒ๋“ค์–ด ๋‘๊ณ , ํ•„์š” ์—†๋Š” ๊ฒƒ์€ ์ถ”ํ›„์— ๋“œ๋žํ•˜๋Š” ์ „๋žต์„ ์„ ํƒํ•˜๋ฉฐ ์ฃผ๋กœ ์ž๋™๋ณด๋‹ค๋Š” ์ˆ˜๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋๋‹ค. ์ด๋Š” ๋‚ด๊ฐ€ flyway ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ์„œ๋ฒ„๋ฅผ ์—…๋ฐ์ดํŠธ ํ•  ๋•Œ ๋™์‹œ์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๊ณ  ์žˆ๊ธฐ์— ํ•˜๊ฒŒ ๋œ ๊ณ ์ •๊ด€๋…์— ๊ฐ€๊นŒ์› ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

 

๋˜ํ•œ, ๋งŒ์•ฝ flyway ๋ฅผ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‹œ์ ๊ณผ ์™„๋ฒฝํžˆ ๋งž๋ฌผ๋ ค ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ๋ฅผ ๋กค๋ฐฑํ•ด์•ผ ํ•œ๋‹ค๋ฉด ๊ณ ๋ คํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ๋“ค์ด ๋„ˆ๋ฌด ๋งŽ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋กค๋ฐฑ ์ด์ „์— ์ƒ๊ธด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ์— ์•Œ๋งž๊ฒŒ ๋ฐ์ดํ„ฐ๊ฐ€ ์ด๋ฏธ ์กด์žฌํ•œ๋‹ค๋ฉด ๋กค๋ฐฑํ•˜๊ณ  ๋‚œ ๋’ค์— ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋“ค์€ ์–ด๋–ป๊ฒŒ ํ•  ๊ฒƒ์ธ๊ฐ€? ์ด๋ฏธ ์ปฌ๋Ÿผ์ด DROP ๋œ ์ƒํƒœ์—ฌ์„œ ์ƒˆ๋กœ์šด ๋ฒ„์ „์—์„œ๋Š” ํ•ด๋‹น ์ปฌ๋Ÿผ์ด ๋ชจ๋‘ null ์ธ๋ฐ ์ด์ „ ๋ฒ„์ „์—์„œ๋Š” ํ•ด๋‹น ์ปฌ๋Ÿผ์˜ ๊ฐ’์ด ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•˜๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋Œ€์‘ํ•  ๊ฒƒ์ธ๊ฐ€?

 

โœ… SRE ์›์น™์„ ํ†ตํ•œ ๊นจ๋‹ฌ์Œ

Google ์—์„œ ๋‚ด์„ธ์šฐ๋Š” SRE ์›์น™์—์„œ๋Š” ๊ฐ€์žฅ ์ค‘์‹œํ•˜๋Š” ๊ฒƒ์ด ‘๊ฐ€์šฉ์„ฑ’์ด๋‹ค. ์‹œ์Šคํ…œ์€ ๋ฌด์กฐ๊ฑด์ ์œผ๋กœ ์™„๋ฒฝํ•  ์ˆ˜ ์—†์œผ๋‹ˆ, ์žฅ์• ๋ฅผ ์–ด๋А ์ •๋„๋Š” ํ—ˆ์šฉํ•˜๋˜ ์‚ฌ์šฉ์ž๊ฐ€ ๋‚ฉ๋“ํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜์ค€์˜ ๊ฐ€์šฉ์„ฑ์„ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋ฌด์กฐ๊ฑด ์†๋„๊ฐ€ ์ค‘์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์ด๋ผ๊ธฐ๋ณด๋‹ค๋Š”, ์‚ฌ์ „์— ์ •์˜๋œ SLO(SLO/SLI) ๋ฒ”์œ„ ์•ˆ์—์„œ๋ผ๋ฉด ์ •ํ•ฉ์„ฑ์„ ์ผ์ • ๋ถ€๋ถ„ ์–‘๋ณดํ•˜๊ณ , ๊ทธ ๋Œ€์‹  ๋ฆด๋ฆฌ์ฆˆ ์†๋„๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์กฐ๊ฑด๋ถ€ ํ—ˆ์šฉ์— ๊ฐ€๊น๋‹ค.

 

์ด๋Š” ์ฃผ๋กœ ๊ฐœ๋ฐœ ์†๋„์™€ ๊ด€๋ จ๋œ ์›์น™์ด๊ธด ํ–ˆ์ง€๋งŒ, ๊ฐ„์ ‘์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž์ฒด์˜ ์™„๋ฒฝํ•œ ์ •ํ•ฉ์„ฑ๊ณผ ๋ฒ„์ €๋‹์„ ๋ชจ๋“  ์ƒํ™ฉ์—์„œ ๋ณด์žฅํ•˜๊ธฐ๋ณด๋‹ค๋Š”, ์ผ๋ถ€ ์žฅ์• ๋ฅผ ํ—ˆ์šฉํ•˜๋”๋ผ๋„ ๋น ๋ฅธ ๋ณต๊ตฌ์™€ ์‚ฌ์šฉ์ž ๊ฐ€์šฉ์„ฑ ํ™•๋ณด์— ์ง‘์ค‘ํ•˜๋Š” ๊ฒƒ์ด ํ˜„์‹ค์ ์œผ๋กœ ๋” ์ค‘์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

๊ทธ๋ž˜์„œ ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด

1. ๋กค๋ฐฑ์ด ์•„๋‹ˆ๋ฉด์„œ๋„

2. ์„œ๋ฒ„์˜ ๋ฒ„์ „์— ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋Š” ์ „๋žต์ด ์žˆ์„๊นŒ ๊ณ ๋ฏผํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค.


๐Ÿš€ Expand and Contract ์ „๋žต

โœ… ์˜ˆ์‹œ๋กœ ์ดํ•ดํ•ด๋ณด๊ธฐ

Expand and Contract ์ „๋žต์€ ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•˜์ž๋ฉด, ๋ชจ๋“  ๋ฒ„์ „์— ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ์Šคํ‚ค๋งˆ๋ฅผ ๊ตฌ์„ฑํ•ด๋‘๊ณ  ์ถ”ํ›„ ์•ˆ์ •์ ์ด๊ฒŒ ๋์„ ๋•Œ ์Šคํ‚ค๋งˆ๋ฅผ ํ™•์ •์ง“๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋‘๋Š” ์ „๋žต๋„ ์กด์žฌํ•˜์ง€๋งŒ, ๋‚˜๋Š” ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋งŒ์„ ํ† ๋Œ€๋กœ ์„ค๋ช…ํ•ด๋ณด๊ฒ ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด, ์ƒˆ๋กœ์šด ์ปฌ๋Ÿผ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์„ ๊ฐ€์ •ํ•ด๋ณด์ž.

์›๋ž˜๋Š” ๋ธ”๋กœ๊ทธ๋ฅผ ์„œ๋น„์Šคํ•˜๋Š” ํ…Œ์ด๋ธ”์—์„œ ๊ฒŒ์‹œ๊ธ€์„ ์˜๋ฏธํ•˜๋Š” Post ๋ผ๋Š” ํ…Œ์ด๋ธ”์ด ์žˆ์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

 

V1.0.0 ์—์„œ๋Š” Post ์— created_at ์ด ์—†์—ˆ์œผ๋‚˜, V1.0.1 ์—์„œ๋Š” created_at ์„ ๋งŒ๋“ค์—ˆ๊ณ  ์ด์— ๋Œ€ํ•œ ๋กœ์ง ์—ญ์‹œ ๊ตฌ์ƒ์„ ํ–ˆ๋‹ค.

CREATE TABLE post (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(255) NOT NULL,
    content TEXT,
    created_at TIMESTAMP NOT NULL
);

 

ํ˜„์žฌ V1.0.1 ์— ๋งž์ถฐ ํ…Œ์ด๋ธ”์ด ์œ„์™€ ๊ฐ™์ด ๊ตฌ์„ฑ๋˜์–ด ์žˆ์—ˆ์œผ๋‚˜, ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ด V1.0.0 ์œผ๋กœ ๋ฒ„์ „์„ ๋˜๋Œ๋ ธ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉ์ž๋Š” Post ๋ฅผ ํ•˜๋‚˜ ๋” ๋“ฑ๋กํ•œ๋‹ค.

 

๊ทธ๋Ÿฌ๋ฉด ์ด ๋•Œ ๋ฐ”๋กœ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๊ฒŒ ๋œ๋‹ค. ์™œ๋ƒํ•˜๋ฉด, V1.0.0 ์‹œ์ ์—์„œ๋Š” created_at ์ด ์กด์žฌํ•˜์ง€ ์•Š์•˜๊ธฐ์— created_at ์ด NULL ๋กœ ๋“ค์–ด๊ฐ€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

CREATE TABLE post (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(255) NOT NULL,
    content TEXT,
    created_at TIMESTAMP NULL -- 1. NULL ํ—ˆ์šฉ
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP -- 2. default ๊ฐ’ ์ •์˜
);

 

์ด์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ์•ˆ์€ created_at ์— NULL ์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด, ๋‹น์—ฐํ•˜๊ฒŒ๋„ V1.0.0 ์—์„œ๋„ Post ๋“ฑ๋ก์ด ์ •์ƒ์ ์œผ๋กœ ์ด๋ค„์ง„๋‹ค. ํ˜น์€, ๊ธฐ๋ณธ๊ฐ’์„ ์ •์˜ํ•ด NOT NULL ์ž„์„ ์œ ์ง€ํ•˜๋ฉด์„œ๋„ NULL ์ธ ๊ฒฝ์šฐ์—๋Š” ๊ธฐ๋ณธ๊ฐ’์ด ๋“ค์–ด๊ฐ€๋„๋ก ๋Œ€์‘ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

 

์ด๊ฒƒ์ด ๋ฐ”๋กœ EXPAND ๋‹จ๊ณ„์— ํ•ด๋‹นํ•œ๋‹ค. ํ•˜์œ„ํ˜ธํ™˜์„ฑ์„ ์ง€์ผœ์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

created_at ์ด ๋กœ์ง ์ƒ ์ •๋ง ์ค‘์š”ํ•œ ์ •๋ณด๋ผ๋ฉด, NULL ์„ ํ—ˆ์šฉํ•˜๊ณ  ๋‘๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ• ๊นŒ? ์•„๋‹ ๊ฒƒ์ด๋‹ค. 

 

๊ทธ๋ ‡๊ธฐ์— ์šฐ์„ ์ ์œผ๋กœ ์ฝ”๋“œ ๋ ˆ๋ฒจ ์ƒ์—์„œ ์ž˜ ๋ง‰์•„๋‘ฌ์•ผ ํ•œ๋‹ค. ๋˜ํ•œ, ์ถ”ํ›„ ๋ฒ„๊ทธ ํ”ฝ์Šค๋ฅผ ํ†ตํ•ด ํƒ„์ƒํ•œ V1.0.2 ์ด ์–ด๋А ์ •๋„ ์•ˆ์ •ํ™”๊ฐ€ ๋œ๋‹ค๋ฉด ์ด ๋•Œ ๊ฐ€์„œ๋Š” created_at ์— ๋Œ€ํ•ด NOT NULL ๋กœ ์ •์˜๋ฅผ ๋ฐ”๊ฟ”๋‘ฌ์•ผ ํ•œ๋‹ค. ์ด๊ฐ€ Contract ๋‹จ๊ณ„์— ํ•ด๋‹นํ•œ๋‹ค.

โœ… DDL ๋ณ„ ์›์น™

1. ADD COLUMN

ALTER TABLE post
  ADD COLUMN subtitle VARCHAR(255) NULL;

 

์ปฌ๋Ÿผ์„ ์ถ”๊ฐ€ํ•˜๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ,

 

1. NULL ์„ ํ—ˆ์šฉํ•˜๊ฑฐ๋‚˜

2. DEFAULT ๋ฅผ ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค.

 

๋˜ํ•œ ์ถ”ํ›„ CONTRACT ๋‹จ๊ณ„์—์„œ๋Š” NOT NULL ์ด๋„๋ก ์ˆ˜์ •ํ•˜๋ฉด ๋œ๋‹ค.

 

2. MODIFY COLUMN

 

2-1. ํฌ๊ธฐ ์ œํ•œ ๊ด€๋ จ ๋ณ€๊ฒฝ

ALTER TABLE post
  MODIFY COLUMN title VARCHAR(500) NOT NULL;

 

๋งŒ์•ฝ ์œ„์™€ ๊ฐ™์ด ๊ธ€์ž ์ˆ˜ ์ œํ•œ์„ ๋Š˜๋ฆฐ๋‹ค๋ฉด, ๊ทธ๋Œ€๋กœ ํ•ด๋„ ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ค„์ด๋Š” ๊ฒฝ์šฐ์—๋Š” ์ˆ˜๋™์œผ๋กœ ํ•˜๊ฑฐ๋‚˜ ๋ฒ„์ „ ๊ตฌ๋™ ํ™•์ธ์„ ๊ฑฐ์นœ ๋’ค ๋ฐ˜์˜ํ•ด์•ผ ํ•œ๋‹ค.

 

2-2. ์ปฌ๋Ÿผ๋ช… / ํƒ€์ž… ๋ณ€๊ฒฝ

-- Expand: ์ƒˆ ์ปฌ๋Ÿผ ์ถ”๊ฐ€
ALTER TABLE member ADD COLUMN display_name VARCHAR(100) NULL;

-- ๋ฐ์ดํ„ฐ ๋ฐฑํ•„: ๊ธฐ์กด nickname ๊ฐ’์„ ์ƒˆ ์ปฌ๋Ÿผ์œผ๋กœ ๋ณต์‚ฌ
UPDATE member
SET display_name = nickname
WHERE display_name IS NULL;

-- Contract: ๊ตฌ ์ปฌ๋Ÿผ ์ œ๊ฑฐ ํ›„ ์ƒˆ ์ปฌ๋Ÿผ์„ ๋ณธ๋ž˜ ์ด๋ฆ„์œผ๋กœ ๊ต์ฒด
ALTER TABLE member DROP COLUMN nickname;
ALTER TABLE member CHANGE COLUMN display_name nickname VARCHAR(100) NOT NULL;

 

๋งŒ์•ฝ ๊ธฐ์กด์—๋Š” nickname ์ด๋ผ๊ณ  ๋˜์–ด์žˆ๋˜ ์ปฌ๋Ÿผ์„ display_name ์ด๋ผ๊ณ  ๋ฐ”๊พธ๊ณ  ์‹ถ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. ์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋Š”, ๊ธฐ์กด์˜ ์ปฌ๋Ÿผ์€ ๊ทธ๋Œ€๋กœ ๋‘๊ณ  ๋ณ€๊ฒฝํ•˜๊ณ ์ž ํ•˜๋Š” ์ƒˆ๋กœ์šด ์ด๋ฆ„์„ ์‚ฌ์šฉํ•ด ์ปฌ๋Ÿผ์„ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

๋˜ํ•œ, ๊ธฐ์กด์˜ nickname ์ด์—ˆ๋˜ ๊ฐ’๋“ค์„ ๋ชจ๋‘ display_name ์œผ๋กœ ์ด์ „ํ•ด์ฃผ๋ฉด ๋œ๋‹ค. ์ถ”ํ›„ CONTRACT ๋‹จ๊ณ„์—์„œ๋Š” ๊ธฐ์กด์˜ ์ปฌ๋Ÿผ์„ ๋“œ๋žํ•˜๊ณ  ์ปฌ๋Ÿผ๋ช…์„ ๋ณ€๊ฒฝํ•ด์ฃผ๋ฉด ๋œ๋‹ค. ํƒ€์ž… ๋ณ€๊ฒฝ์˜ ๊ฒฝ์šฐ๋„ ๋น„์Šทํ•˜๊ฒŒ ์ง„ํ–‰ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

3. DROP

 

ํŠน์ • ํ…Œ์ด๋ธ”์ด๋‚˜ ์ปฌ๋Ÿผ์„ ๋“œ๋žํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š”, ํ˜„์žฌ ์„œ๋ฒ„์˜ ๋ฒ„์ „์ด ์™„์ „ํžˆ ์•ˆ์ •ํ™”๊ฐ€ ๋˜์—ˆ๋‹ค๊ณ  ํŒ๋‹จ์ด ์ด๋ค„์ง€๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ง„ํ–‰ํ•œ๋‹ค.

 

4. UNIQUE / CHECK ์ œ์•ฝ

 

์ตœ๋Œ€ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ ˆ๋ฒจ์—์„œ ์ด˜์ด˜ํ•˜๊ฒŒ ๊ฒ€์ฆ์„ ํ•˜๋„๋ก ๊ตฌ์„ฑ์„ ํ•˜๊ณ , CONTRACT ๋‹จ๊ณ„์—์„œ๋งŒ ์ œ์•ฝ์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

 

5. FK ์ถ”๊ฐ€

ALTER TABLE post ADD COLUMN author_id BIGINT NULL;

-- ๋ฐฑํ•„·์ •ํ•ฉ ์ ๊ฒ€ ํ›„
ALTER TABLE post 
  ADD CONSTRAINT fk_post_author FOREIGN KEY (author_id) REFERENCES member(id);

 

์ฒ˜์Œ์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ ˆ๋ฒจ์—์„œ ๊ตฌ์ƒ์„ ํ•  ๋•Œ์—๋Š” ๊ฐ„์ ‘ ์ฐธ์กฐ๋ฅผ ํ†ตํ•ด ๊ตฌ์„ฑ์„ ํ•˜๊ณ , ์ถ”ํ›„ ํ•ด๋‹น ์„œ๋ฒ„ ๋ฒ„์ „์ด ์•ˆ์ •ํ™”๊ฐ€ ๋์„ ๋•Œ ์œ„์™€ ๊ฐ™์ด ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ์„ ํ†ตํ•ด ์ฒ˜๋ฆฌํ•œ๋‹ค.


๐Ÿš€ Flyway ์„ค์ • ์ผ๋ถ€ ๋ณ€๊ฒฝ

๋‚ด๊ฐ€ ์ œ์‹œํ•œ Expand and Contract ๋ฅผ ์‹คํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”, Flyway ์„ค์ •์„ ์ผ๋ถ€ ๋ฐ”๊ฟ”์ฃผ์–ด์•ผ ํ•œ๋‹ค.

spring:
  flyway:
    enabled: true
    baseline-on-migrate: true
    validate-on-migrate: true
    locations: classpath:db/migration
    clean-disabled: true
    ignore-migration-patterns: *:future // ์ถ”๊ฐ€ํ•ด์ค˜์•ผ ํ•จ ๐Ÿ’ฅ

 

ํ˜„์žฌ ๋‚ด๊ฐ€ ์˜๋„ํ•œ ๋กค๋ฐฑ ์‹œ ์Šคํ‚ค๋งˆ์˜ ๋ณ€๊ฒฝ ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

1. v1 ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ -> flyway ์— v1 ์— ํ•ด๋‹นํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ ๋ชจ๋‘ ์ ์šฉ๋จ
2. v2 ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ -> flyway ์— v2 ์— ํ•ด๋‹นํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ ๋ชจ๋‘ ์ ์šฉ๋จ
3. v1 ์œผ๋กœ ๋กค๋ฐฑ -> v2 ์— ํ•ด๋‹นํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ด๋ฏธ DB ์— ์ ์šฉ๋๋Š”๋ฐ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ ์ƒ์— ์—†๊ธฐ์— ์˜ค๋ฅ˜ ๋ฐœ์ƒ ๊ฐ€๋Šฅ ๐Ÿ’ฅ

 

๋”ฐ๋ผ์„œ, ํŠน์ • ํŒจํ„ด์ธ ์Šคํ‚ค๋งˆ๋ฅผ ๋ฌด์‹œํ•œ๋‹ค๋Š” ์„ค์ •์ธ ignore-migration-patterns ๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

 

*:future ๋ผ๋Š” ์˜ต์…˜์„ ํ†ตํ•ด DB ์—๋Š” ์ด๋ฏธ ์ ์šฉ์ด ๋์œผ๋‚˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—๋Š” ์—†๋Š”, ์ฆ‰ ๋ฏธ๋ž˜์˜ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ ์šฉ๋˜์—ˆ๋”๋ผ๋„ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜์ง€ ์•Š๋„๋ก ํ–ˆ๋‹ค.

 

https://github.com/woowacourse-teams/2025-mul-kkam/pull/696

 

[BE][chore]: flyway ๊ตฌ๋™ ์‹œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ƒˆ๋กœ์šด ๋ฒ„์ „์ด ์—†๋”๋ผ๋„ ๊ตฌ๋™ํ•˜๋„๋ก ์„ค์ • ๋ณ€๊ฒฝ by Jin409 ·

๐Ÿ”— ๊ด€๋ จ ์ด์Šˆ close [BE][chore]: flyway ๊ตฌ๋™ ์‹œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ƒˆ๋กœ์šด ๋ฒ„์ „์ด ์—†๋”๋ผ๋„ ๊ตฌ๋™ํ•˜๋„๋ก ์„ค์ • ๋ณ€๊ฒฝ #695 ๐Ÿ“ ์ž‘์—… ๋‚ด์šฉ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์—†๋Š” ์ดํ›„ ๋ฒ„์ „์ด ์ ์šฉ๋˜์–ด๋„ ์ •์ƒ์ ์œผ๋กœ ๊ตฌ๋™ํ•˜๋„

github.com


๐Ÿš€ ์‹œ๋“œ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ, R prefix ์‚ฌ์šฉํ•˜๊ธฐ

ํ•ด๋‹น ํŒจํ„ด์„ ๊ณ ๋ คํ•ด ๊ตฌํ˜„์„ ํ•˜๋˜ ์™€์ค‘์—, ์ดˆ๊ธฐ๊ฐ’์„ ๋„ฃ์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์–ด๋–ป๊ฒŒ ๋Œ€์‘ํ•ด์•ผ ํ•˜๋Š”์ง€ ์˜๋ฌธ์ด ์ƒ๊ฒผ๋‹ค.

 

๊ธฐ์กด์— ์‚ฌ์šฉํ•˜๋˜ ์Šคํฌ๋ฆฝํŠธ๋“ค์€ ๋ชจ๋‘ ์Šคํ‚ค๋งˆ์˜ ๋ฒ„์ „์„ ๋ช…์‹œํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ flyway ๋ฅผ ํ†ตํ•ด ์ •์˜ํ•˜๋Š” ๊ฒƒ์€ ์ ์ ˆ์น˜ ์•Š๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์–ด ๊ณ ๋ฏผ์„ ์‹œ์ž‘ํ–ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” data.sql ์— ์ •์˜ํ•ด์•ผ ํ•˜๋‚˜ ์‹ถ์—ˆ๋Š”๋ฐ, ์—ฌ๊ธฐ์—๋Š” ๋ฒ„์ €๋‹์ด ์กด์žฌํ•˜์ง€ ์•Š์œผ๋‹ˆ ์• ๋งคํ•˜๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.

 

๊ทธ๋Ÿฌ๋˜ ์™€์ค‘, flyway ์—๋Š” V ๋ฅผ ์‚ฌ์šฉํ•œ ๋ฒ„์ „์„ ๋ช…์‹œํ•˜๋Š” prefix ์ด์™ธ์—๋„ R ์ด๋ผ๋Š” prefix ์—ญ์‹œ ์กด์žฌํ•˜๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋๋‹ค. ์ด๋Š” ๋ฒ„์ „์„ ์œ„ํ•œ prefix ๊ฐ€ ์•„๋‹ˆ๋ผ Repeatable, ์ฆ‰ ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•œ ์Šคํฌ๋ฆฝํŠธ์ธ ๊ฒƒ์ด๋‹ค.

  • V prefix ๊ฐ€ ๋ถ™์€ ์Šคํฌ๋ฆฝํŠธ๋“ค์ด ๋ชจ๋‘ ์‹คํ–‰๋œ ๋’ค ์‹คํ–‰๋˜๋ฉฐ
  • ๋ฒ„์ „์ด ์•„๋‹ˆ๋ผ ํŒŒ์ผ๋ช… ์ž์ฒด๋กœ ๊ตฌ๋ถ„๋˜๊ณ 
  • ์ฒดํฌ์„ฌ์„ ํ†ตํ•ด ๋ณ€๊ฒฝ์ด ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ์žฌ์‹คํ–‰์ด ๋˜์ง€๋งŒ, ์ด๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ์—๋Š” ์žฌ์‹คํ–‰์ด ๋˜์ง€ ์•Š๋Š”๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด image ๋ผ๋Š” ํ…Œ์ด๋ธ”์— ์‹œ๋“œ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์–ด์•ผ ํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

  • V1 ์—์„œ๋Š” image ๋ผ๋Š” ํ…Œ์ด๋ธ” ์ž์ฒด๊ฐ€ ์—†์—ˆ๊ณ ,
  • V2 ๋กœ ๋ฒ„์ „์—…ํ•ด์„œ image ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์—ˆ๋‹ค๊ฐ€
  • V1 ์œผ๋กœ ๋กค๋ฐฑํ•œ ๋’ค (๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—๋Š” ๋ณ€๊ฒฝ ์—†์Œ. ์ฆ‰, ์ด๋ฏธ ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ๋“ค์–ด๊ฐ€ ์žˆ์Œ)
  • V2.0.1 ๋กœ ์žฌ๋ฐฐํฌ ํ•ด์„œ ๋‹ค์‹œ R__add_image_seed.sql ๊ฐ€ ํฌํ•จ๋œ๋‹ค๊ณ  ํ•˜๋”๋ผ๋„, ์ด๋ฏธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒ์— ๋ฐ˜์˜๋˜์–ด ์žˆ์œผ๋ฉฐ ์ฒดํฌ์„ฌ์ด ๋‹ฌ๋ผ์ง€์ง€ ์•Š์€ ์ด์ƒ ์žฌ๋ฐ˜์˜๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด๋‹ค.

 

https://github.com/woowacourse-teams/2025-mul-kkam/pull/679#discussion_r2312891363

 

[BE][chore]: ๋กค๋ฐฑ์„ ๊ณ ๋ คํ•˜์—ฌ DDL ์„ค๊ณ„ ์ˆ˜์ • by Jin409 · Pull Request #679 · woowacourse-teams/2025-mul-kkam

๐Ÿ”— ๊ด€๋ จ ์ด์Šˆ close [BE][chore]: ๋กค๋ฐฑ์„ ๊ณ ๋ คํ•˜์—ฌ DDL ์„ค๊ณ„ ์ˆ˜์ • #677 ๐Ÿ“ ์ž‘์—… ๋‚ด์šฉ ๋กค๋ฐฑ์„ ๊ณ ๋ คํ•˜์—ฌ DDL ์„ ๊ตฌ์„ฑ ์ตœ๋Œ€ํ•œ DROP ์„ ํ•˜์ง€ ์•Š๊ณ , ์„œ๋ฒ„๊ฐ€ ์ด์ „ ๋ฒ„์ „์œผ๋กœ ๋กค๋ฐฑ๋˜๋”๋ผ๋„ ์ •์ƒ์ ์œผ๋กœ ๊ตฌ๋™๋˜๋„๋ก

github.com

 


๐Ÿ“ ์ฐธ๊ณ  ์ž๋ฃŒ

http://cloudinsight.net/cloud/sre/

 

SRE ์— ๋Œ€ํ•œ ์ดํ•ด - ํด๋ผ์šฐ๋“œ ์ธ์‚ฌ์ดํŠธ

SRE ์˜ ์‹œ์ž‘์€ 2003๋…„ Google ์—์„œ ์‹œ์Šคํ…œ ์šด์˜ํ™˜๊ฒฝ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋กœ์ ํŠธ์—์„œ ๋ถ€ํ„ฐ ๋น„๋กฏ๋˜์—ˆ๋‹ค. ๋Œ€๊ทœ๋ชจ ์‹œ์Šคํ…œ์„ ์•ˆ์ •์ ์ด๊ณ  ํšจ์œจ์ ์œผ๋กœ ์šด์˜ ๋ฐ ์œ ์ง€๋ณด์ˆ˜ ํ•˜๊ธฐ ์œ„ํ•œ ์ƒˆ๋กœ์šด ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•˜๊ณ 

cloudinsight.net

https://www.prisma.io/dataguide/types/relational/expand-and-contract-pattern

 

Using the expand and contract pattern | Prisma's Data Guide

In this article, we introduce the expand and contract pattern to help migrate data and clients to a new schema.

www.prisma.io

https://www.tim-wellhausen.de/papers/ExpandAndContract/ExpandAndContract.html

 

Expand and Contract - A Pattern to Apply Breaking Changes to Persistent Data with Zero Downtime

The Expand and Contract pattern provides a way to implement breaking changes to a system in a safe manner.

www.tim-wellhausen.de

https://russell-seo.tistory.com/5

 

Flyway(DB Migration) ๋„์ž…๊ธฐ

What is Flyway? ๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ DB ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์˜คํ”ˆ ์†Œ์Šค ํˆด ์ž…๋‹ˆ๋‹ค. Database ์˜ DDL ์ด๋ ฅ์„ ์Œ“์•„์„œ ๊ด€๋ฆฌํ•˜๋Š” ํˆด ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด DB ํ˜•์ƒ๊ด€๋ฆฌ ๋ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. svn ์—์„œ๋Š” ์œ„ํ—˜ํ•˜์ง€๋งŒ gi

russell-seo.tistory.com

https://documentation.red-gate.com/fd/flyway-repeatable-sql-migration-prefix-setting-277579026.html

 

Flyway Repeatable SQL Migration Prefix Setting - Redgate Flyway - Product Documentation

Flyway Repeatable SQL Migration Prefix Setting Page last updated 27 August 2025 Published 15 January 2025 Description The file name prefix for repeatable SQL migrations. Repeatable SQL migrations have the following file name structure: prefixSeparatorDESCR

documentation.red-gate.com