๐ 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
'INFRA > DB' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[INFRA/DB] Flyway๋ฅผ ๊ณ ๋ฅด๊ธฐ๊น์ง - DB ์ ๋ง์ด๊ทธ๋ ์ด์ ๋ ์์์ผํด์ผ ํด (3) | 2025.07.29 |
---|