Django ๋ง์ด๊ทธ๋ ์ด์ ์ ๋ํ ์ข ํฉ ๊ฐ์ด๋๋ก, ์คํค๋ง ์งํ ์ ๋ต, ๋ชจ๋ฒ ์ฌ๋ก, ์ ์ธ๊ณ์ ์ผ๋ก ๋ฐฐํฌ๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ณ๊ฒฝ ์ฌํญ์ ๊ด๋ฆฌํ๊ธฐ ์ํ ๊ณ ๊ธ ๊ธฐ์ ์ ๋ค๋ฃน๋๋ค.
Python Django ๋ง์ด๊ทธ๋ ์ด์ : ๊ธ๋ก๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ์คํค๋ง ์งํ ์ ๋ต
Django์ ๋ง์ด๊ทธ๋ ์ด์ ์์คํ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง๋ฅผ ์ ์ด๋๊ณ ์์ธก ๊ฐ๋ฅํ ๋ฐฉ์์ผ๋ก ๋ฐ์ ์ํค๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ ๋๋ค. ์ด๋ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ๊ณผ ์ต์ํ์ ๊ฐ๋ ์ค์ง ์๊ฐ์ด ๊ฐ์ฅ ์ค์ํ ์ ์ธ๊ณ์ ์ผ๋ก ๋ฐฐํฌ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๊ณ ์ ์ง ๊ด๋ฆฌํ ๋ ํนํ ์ค์ํฉ๋๋ค. ์ด ๊ฐ์ด๋์์๋ ๊ธฐ๋ณธ ๊ฐ๋ ๋ถํฐ ๋ณต์กํ ํ๊ฒฝ์์ ์คํค๋ง ์งํ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ๊ณ ๊ธ ์ ๋ต๊น์ง ๋ชจ๋ ๊ฒ์ ๋ค๋ฃจ๋ Django ๋ง์ด๊ทธ๋ ์ด์ ์ ๋ํ ํฌ๊ด์ ์ธ ๊ฐ์๋ฅผ ์ ๊ณตํฉ๋๋ค.
Django ๋ง์ด๊ทธ๋ ์ด์ ์ดํด
ํต์ฌ์ ์ผ๋ก Django์ ๋ง์ด๊ทธ๋ ์ด์ ์์คํ ์ ์ฌ์ฉํ๋ฉด ๋ชจ๋ธ ๋ณ๊ฒฝ ์ฌํญ์ ์๊ฐ ๊ฒฝ๊ณผ์ ๋ฐ๋ผ ์ถ์ ํ๊ณ ํด๋น ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฉํ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง๋ฅผ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋์ ๋๊ธฐํํ์ฌ ๋ถ์ผ์น๋ฅผ ๋ฐฉ์งํ๊ณ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ๋ณด์ฅํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ฃผ์ ๊ตฌ์ฑ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๋ชจ๋ธ: ํ๋, ๊ด๊ณ ๋ฐ ์ ์ฝ ์กฐ๊ฑด์ ํฌํจํ์ฌ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ ์ํฉ๋๋ค.
- ๋ง์ด๊ทธ๋ ์ด์ : ํ๋ ์ถ๊ฐ, ํ ์ด๋ธ ์ด๋ฆ ๋ฐ๊พธ๊ธฐ ๋๋ ์ ์ฝ ์กฐ๊ฑด ์์ ๊ณผ ๊ฐ์ ๋ชจ๋ธ ๋ณ๊ฒฝ ์ฌํญ์ ๋ํ๋ ๋๋ค.
- ๋ง์ด๊ทธ๋ ์ด์ ํ์ผ: ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฉํ๊ธฐ ์ํ ์ง์นจ์ด ํฌํจ๋ Python ํ์ผ์ ๋๋ค.
- ๊ด๋ฆฌ ๋ช
๋ น: ๋ง์ด๊ทธ๋ ์ด์
์ ์์ฑํ๊ณ ์ ์ฉํ ์ ์๋
makemigrations
๋ฐmigrate
์ ๊ฐ์ ๋ช ๋ น์ ๋๋ค.
๊ธฐ๋ณธ ๋ง์ด๊ทธ๋ ์ด์ ์ํฌํ๋ก
Django ๋ง์ด๊ทธ๋ ์ด์ ์์ ์ ์ผ๋ฐ์ ์ธ ์ํฌํ๋ก๋ ๋ค์ ๋จ๊ณ๋ฅผ ํฌํจํฉ๋๋ค.
- ๋ชจ๋ธ ์์ :
models.py
ํ์ผ์ ํ์ํ ๋๋ก ๋ณ๊ฒฝํฉ๋๋ค. ์๋ฅผ ๋ค์ด ๋ชจ๋ธ์ ์ ํ๋๋ฅผ ์ถ๊ฐํฉ๋๋ค. - ๋ง์ด๊ทธ๋ ์ด์
์์ฑ:
python manage.py makemigrations
๋ช ๋ น์ ์คํํฉ๋๋ค. Django๋ ๋ชจ๋ธ์ ๊ฒ์ฌํ๊ณ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ์ํ๋ ๋ง์ด๊ทธ๋ ์ด์ ํ์ผ์ ์์ฑํฉ๋๋ค. - ๋ง์ด๊ทธ๋ ์ด์ ๊ฒํ : ์์ฑ๋ ๋ง์ด๊ทธ๋ ์ด์ ํ์ผ์ ๊ฒ์ฌํ์ฌ ์๋ํ ๋ณ๊ฒฝ ์ฌํญ์ ์ ํํ๊ฒ ์บก์ฒํ๋์ง ํ์ธํฉ๋๋ค.
- ๋ง์ด๊ทธ๋ ์ด์
์ ์ฉ:
python manage.py migrate
๋ช ๋ น์ ์คํํฉ๋๋ค. Django๋ ๋ง์ด๊ทธ๋ ์ด์ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฉํ์ฌ ์คํค๋ง๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค.
์๋ฅผ ๋ค์ด Product
๋ชจ๋ธ์ด ์๊ณ discount_percentage
๋ผ๋ ์ ํ๋๋ฅผ ์ถ๊ฐํ๋ ค๋ ๊ฒฝ์ฐ:
# models.py
from django.db import models
class Product(models.Model):
name = models.CharField(max_length=255)
price = models.DecimalField(max_digits=10, decimal_places=2)
discount_percentage = models.DecimalField(max_digits=5, decimal_places=2, default=0.00) # New field
discount_percentage
ํ๋๋ฅผ ์ถ๊ฐํ ํ ๋ค์์ ์คํํฉ๋๋ค.
python manage.py makemigrations
python manage.py migrate
Django๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ Product
ํ
์ด๋ธ์ ์ ํ๋๋ฅผ ์ถ๊ฐํ๋ ๋ง์ด๊ทธ๋ ์ด์
ํ์ผ์ ์์ฑํฉ๋๋ค.
๊ธ๋ก๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ์คํค๋ง ์งํ ์ ๋ต
์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ธ๊ณ์ ์ผ๋ก ๋ฐฐํฌํ ๋ ์คํค๋ง ๋ณ๊ฒฝ์ด ์ฌ๋ฌ ์ง์ญ์ ์ฌ์ฉ์์๊ฒ ๋ฏธ์น๋ ์ํฅ์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค. ์ ์ ํ ๊ณํ ์์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ณ๊ฒฝ ์ฌํญ์ ๋กค์์ํ๋ฉด ๊ฐ๋ ์ค์ง ์๊ฐ, ๋ฐ์ดํฐ ๋ถ์ผ์น ๋ฐ ์ด์ ํ ์ฌ์ฉ์ ๊ฒฝํ์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ์ ์ธ๊ณ์ ์ผ๋ก ๋ฐฐํฌ๋ ํ๊ฒฝ์์ ์คํค๋ง ์งํ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ๋ช ๊ฐ์ง ์ ๋ต์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
1. Blue-Green ๋ฐฐํฌ
Blue-green ๋ฐฐํฌ์๋ ํ์ฌ ํธ๋ํฝ์ ์ฒ๋ฆฌํ๋ "blue" ํ๊ฒฝ๊ณผ ์ ๋ฐ์ดํธ ์ค์ธ "green" ํ๊ฒฝ์ ๋ ๊ฐ์ง ๋์ผํ ํ๊ฒฝ์ ์คํํ๋ ๊ฒ์ด ํฌํจ๋ฉ๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ณ๊ฒฝ ์ฌํญ์ด ํฌํจ๋ ์ ๋ฒ์ ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ๋ ค๋ฉด ๋ค์์ ์ํํฉ๋๋ค.
- "green" ํ๊ฒฝ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ง์ด๊ทธ๋ ์ด์ ์ ์ ์ฉํฉ๋๋ค.
- ์ ๋ฒ์ ์ ์ ํ๋ฆฌ์ผ์ด์ ์ "green" ํ๊ฒฝ์ ๋ฐฐํฌํฉ๋๋ค.
- "green" ํ๊ฒฝ์ ์ฒ ์ ํ ํ ์คํธํฉ๋๋ค.
- "blue" ํ๊ฒฝ์์ "green" ํ๊ฒฝ์ผ๋ก ํธ๋ํฝ์ ์ ํํฉ๋๋ค.
์ด ์ ๊ทผ ๋ฐฉ์์ ์ ํ์ ๋น ๋ฅด๊ณ ์ฝ๊ฒ ์ํํ ์ ์์ผ๋ฏ๋ก ๊ฐ๋ ์ค์ง ์๊ฐ์ ์ต์ํํฉ๋๋ค. ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด "blue" ํ๊ฒฝ์ผ๋ก ์ฝ๊ฒ ๋ค์ ์ ํํ ์ ์์ต๋๋ค.
์: ๊ธ๋ก๋ฒ ์ ์ ์๊ฑฐ๋ ํ๋ซํผ์ blue-green ๋ฐฐํฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ๋๋ฅ์ ๊ณ ๊ฐ์ ๋ํ ์๋น์ค๋ฅผ ์ค๋จํ์ง ์๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ณ๊ฒฝ ์ฌํญ์ ๋กค์์ํฉ๋๋ค. ํ ์ง์ญ์ ์ฌ์ฉ๋์ด ์ ์ ์๊ฐ ๋์ ์ต์ ์คํค๋ง ๋ณ๊ฒฝ ์ฌํญ์ผ๋ก ์ด๋ฏธ ์ ๋ฐ์ดํธ๋ green ํ๊ฒฝ์ผ๋ก ํธ๋ํฝ์ ์ ํํฉ๋๋ค. ์ด๋ฅผ ํตํด ํด๋น ์ง์ญ์ ์ฌ์ฉ์๋ ์ต์ํ์ ์ค๋จ์ ๊ฒฝํํ ์ ์์ต๋๋ค.
2. ์นด๋๋ฆฌ์ ๋ฆด๋ฆฌ์ค
์นด๋๋ฆฌ์ ๋ฆด๋ฆฌ์ค์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ณ๊ฒฝ ์ฌํญ์ด ํฌํจ๋ ์ ๋ฒ์ ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๊ท๋ชจ ์ฌ์ฉ์์๊ฒ ๋ฐฐํฌํ๋ ๊ฒ์ด ํฌํจ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ์ ์ฒด ์ฌ์ฉ์ ๊ธฐ๋ฐ์ ๋กค์์ํ๊ธฐ ์ ์ ์ ํ๋ ๊ท๋ชจ๋ก ๋ณ๊ฒฝ ์ฌํญ์ ์ํฅ์ ๋ชจ๋ํฐ๋งํ ์ ์์ต๋๋ค. ์นด๋๋ฆฌ์ ๋ฆด๋ฆฌ์ค๋ฅผ ๊ตฌํํ๋ ค๋ฉด ๋ค์์ ์ํํฉ๋๋ค.
- ์นด๋๋ฆฌ์ ๋ฆด๋ฆฌ์ค์ ์ฌ์ฉ๋ ๋ณ๋์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ธ์คํด์ค ๋๋ ์คํค๋ง์ ๋ง์ด๊ทธ๋ ์ด์ ์ ์ ์ฉํฉ๋๋ค.
- ๋ก๋ ๋ฐธ๋ฐ์๊ฐ ์๋์ ํธ๋ํฝ์ ์นด๋๋ฆฌ์ ํ๊ฒฝ์ผ๋ก ๋ผ์ฐํ ํ๋๋ก ๊ตฌ์ฑํฉ๋๋ค.
- ์นด๋๋ฆฌ์ ํ๊ฒฝ์์ ์ค๋ฅ, ์ฑ๋ฅ ๋ฌธ์ ๋ฐ ๊ธฐํ ์ด์ ์งํ๋ฅผ ๋ชจ๋ํฐ๋งํฉ๋๋ค.
- ๋ชจ๋ ๊ฒ์ด ์ ์์ ์ผ๋ก ๋ณด์ด๋ฉด ์นด๋๋ฆฌ์ ํ๊ฒฝ์ด ๋ชจ๋ ํธ๋ํฝ์ ์ฒ๋ฆฌํ ๋๊น์ง ํธ๋ํฝ ๋น์จ์ ์ ์ง์ ์ผ๋ก ๋๋ฆฝ๋๋ค.
์นด๋๋ฆฌ์ ๋ฆด๋ฆฌ์ค๋ ์คํค๋ง ๋ณ๊ฒฝ์ผ๋ก ์ธํ ์ฑ๋ฅ ์ ํ ๋๋ ์๊ธฐ์น ์์ ๋์์ ๊ฐ์งํ๋ ๋ฐ ํนํ ์ ์ฉํฉ๋๋ค.
์: ์์ ๋ฏธ๋์ด ํ์ฌ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ ์ด ํ์ํ ์ ๊ธฐ๋ฅ์ ํ ์คํธํ๊ธฐ ์ํด ์นด๋๋ฆฌ์ ๋ฆด๋ฆฌ์ค๋ฅผ ์ฌ์ฉํฉ๋๋ค. ํน์ ์ง๋ฆฌ์ ์ง์ญ์ ์๋์ ์ฌ์ฉ์๋ฅผ ์นด๋๋ฆฌ์ ํ๊ฒฝ์ผ๋ก ๋ผ์ฐํ ํ์ฌ ๋ชจ๋ ์ฌ์ฉ์์๊ฒ ๊ธฐ๋ฅ์ ์ ์ธ๊ณ์ ์ผ๋ก ๋กค์์ํ๊ธฐ ์ ์ ๊ท์คํ ํผ๋๋ฐฑ์ ์์งํ๊ณ ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ฅผ ์๋ณํ ์ ์์ต๋๋ค.
3. ๊ธฐ๋ฅ ํ๋๊ทธ
๊ธฐ๋ฅ ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ๋ฉด ์ ์ฝ๋๋ฅผ ๋ฐฐํฌํ์ง ์๊ณ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ํน์ ๊ธฐ๋ฅ์ ํ์ฑํํ๊ฑฐ๋ ๋นํ์ฑํํ ์ ์์ต๋๋ค. ์ด๋ ์คํค๋ง ๋ณ๊ฒฝ ์ฌํญ์ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋ ๋ณ๊ฒฝ ์ฌํญ๊ณผ ๋ถ๋ฆฌํ๋ ๋ฐ ์ ์ฉํ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ํ๋ ๋๋ ํ ์ด๋ธ์ ๋์ ํ ์ ์์ง๋ง ๋กค์์ํ ์ค๋น๊ฐ ๋ ๋๊น์ง ํด๋น ๊ธฐ๋ฅ์ ๋นํ์ฑํ ์ํ๋ก ์ ์งํ ์ ์์ต๋๋ค.
๊ธฐ๋ฅ ํ๋๊ทธ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ๋ ค๋ฉด ๋ค์์ ์ํํฉ๋๋ค.
- ๋ง์ด๊ทธ๋ ์ด์ ์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ํ๋ ๋๋ ํ ์ด๋ธ์ ์ถ๊ฐํฉ๋๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋์์ ๊ธฐ๋ฅ ํ๋๊ทธ๋ฅผ ๊ตฌํํ์ฌ ์ ๊ธฐ๋ฅ์ ๋ํ ์ก์ธ์ค๋ฅผ ์ ์ดํฉ๋๋ค.
- ๊ธฐ๋ฅ ํ๋๊ทธ๊ฐ ๋นํ์ฑํ๋ ์ํ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํฉ๋๋ค.
- ์๋์ ์ฌ์ฉ์ ๋๋ ํน์ ์ง์ญ์์ ๊ธฐ๋ฅ ํ๋๊ทธ๋ฅผ ํ์ฑํํฉ๋๋ค.
- ์ ๊ธฐ๋ฅ์ ์ฑ๋ฅ๊ณผ ๋์์ ๋ชจ๋ํฐ๋งํฉ๋๋ค.
- ๋ชจ๋ ์ฌ์ฉ์๊ฐ ํ์ฑํ๋ ๋๊น์ง ๋ ๋ง์ ์ฌ์ฉ์์ ๋ํด ๊ธฐ๋ฅ ํ๋๊ทธ๋ฅผ ์ ์ง์ ์ผ๋ก ํ์ฑํํฉ๋๋ค.
๊ธฐ๋ฅ ํ๋๊ทธ๋ ์ ๊ธฐ๋ฅ์ ๋กค์์์ ๊ด๋ฆฌํ๊ณ ๊ธฐ์กด ์ฌ์ฉ์๋ฅผ ๋ฐฉํดํ ์ํ์ ์ต์ํํ๋ ์ ์ฐํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
์: ๊ธ๋ก๋ฒ ๊ธ์ต ์๋น์ค ํ์ฌ๋ ์ค์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง ๋ณ๊ฒฝ์ด ํ์ํ ์ ๋ณด๊ณ ๊ธฐ๋ฅ์ ์ ์ง์ ์ผ๋ก ๋กค์์ํ๊ธฐ ์ํด ๊ธฐ๋ฅ ํ๋๊ทธ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ฒ์์๋ ๋ด๋ถ ์ฌ์ฉ์์ ์๊ท๋ชจ ๋ฒ ํ ํ ์คํฐ ๊ทธ๋ฃน์ ๋ํด ๊ธฐ๋ฅ์ ํ์ฑํํ ๋ค์ ๊ณ ๊ฐ ๊ธฐ๋ฐ์ ์ ์ง์ ์ผ๋ก ๋กค์์ํ์ฌ ์ฑ๋ฅ์ ๋ฉด๋ฐํ ๋ชจ๋ํฐ๋งํ๊ณ ๊ทธ ๊ณผ์ ์์ ํผ๋๋ฐฑ์ ์์งํ ์ ์์ต๋๋ค.
4. ์จ๋ผ์ธ ์คํค๋ง ๋ณ๊ฒฝ
์จ๋ผ์ธ ์คํค๋ง ๋ณ๊ฒฝ์ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์คํ๋ผ์ธ์ผ๋ก ์ ํํ์ง ์๊ณ ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง๋ฅผ ์์ ํ ์ ์์ต๋๋ค. ์ด๋ ๋์ ๊ฐ์ฉ์ฑ์ด ํ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋งค์ฐ ์ค์ํฉ๋๋ค. ๋ค์๊ณผ ๊ฐ์ ์ฌ๋ฌ ๋๊ตฌ์ ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ์จ๋ผ์ธ ์คํค๋ง ๋ณ๊ฒฝ์ ์ํํ ์ ์์ต๋๋ค.
- pt-online-schema-change(MySQL์ฉ): ์ด ๋๊ตฌ๋ ์๋์ฐ ํ ์ด๋ธ์ ์์ฑํ๊ณ , ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ ๋ค์ ์๋์ฐ ํ ์ด๋ธ์์ ์คํค๋ง ๋ณ๊ฒฝ์ ์ํํฉ๋๋ค. ๋ณ๊ฒฝ์ด ์๋ฃ๋๋ฉด ์๋์ฐ ํ ์ด๋ธ์ ์๋ ํ ์ด๋ธ๊ณผ ๋ฐ๊ฟ๋๋ค.
- pg_repack(PostgreSQL์ฉ): ์ด ๋๊ตฌ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ ๊ทธ์ง ์๊ณ ํ ์ด๋ธ๊ณผ ์ธ๋ฑ์ค๋ฅผ ์ฌ๊ตฌ์ถํฉ๋๋ค.
- ๋ณด๊ธฐ ๋ฐ ํธ๋ฆฌ๊ฑฐ ์ฌ์ฉ: ์ํ๋ ์คํค๋ง๋ฅผ ์๋ฎฌ๋ ์ด์ ํ๋ ๋ณด๊ธฐ๋ฅผ ๋ง๋ค๊ณ ํธ๋ฆฌ๊ฑฐ๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ๋ณธ ํ ์ด๋ธ์ ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค.
์จ๋ผ์ธ ์คํค๋ง ๋ณ๊ฒฝ์ ์ํํ๋ ๊ฒ์ ๋ณต์กํ ์ ์์ผ๋ฉฐ ์ ์คํ ๊ณํ์ด ํ์ํ์ง๋ง ์ ์ธ๊ณ์ ์ผ๋ก ๋ฐฐํฌ๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋์ ๊ฐ์ฉ์ฑ์ ์ ์งํ๋ ๋ฐ ํ์์ ์ ๋๋ค.
์: ์จ๋ผ์ธ ๊ฒ์ ํ์ฌ๋ pt-online-schema-change
๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒ์์ ์คํ๋ผ์ธ์ผ๋ก ์ ํํ์ง ์๊ณ ๋ MySQL ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐํฉ๋๋ค. ์ด๋ฅผ ํตํด ํ๋ ์ด์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ง ๊ด๋ฆฌ ์์
์ค์๋ ์ค๋จ ์์ด ๊ฒ์์ ๊ณ์ ์ฆ๊ธธ ์ ์์ต๋๋ค.
5. ๋ฐ์ดํฐ ๋ง์ด๊ทธ๋ ์ด์ ์ ๋ต
๊ฒฝ์ฐ์ ๋ฐ๋ผ ์คํค๋ง ๋ณ๊ฒฝ์ผ๋ก ์ธํด ๊ธฐ์กด ๋ฐ์ดํฐ๋ฅผ ์ ์คํค๋ง๋ก ๋ง์ด๊ทธ๋ ์ด์ ํด์ผ ํฉ๋๋ค. ํนํ ๋๊ท๋ชจ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฒฝ์ฐ ๋ณต์กํ๊ณ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฌ๋ ํ๋ก์ธ์ค์ผ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ ๋ง์ด๊ทธ๋ ์ด์ ์ ๊ด๋ฆฌํ๊ธฐ ์ํ ๋ช ๊ฐ์ง ์ ๋ต์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ผ๊ด ์ฒ๋ฆฌ: ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ณผ๋ถํ๊ฐ ๊ฑธ๋ฆฌ์ง ์๋๋ก ๋ฐ์ดํฐ๋ฅผ ์์ ์ผ๊ด ์ฒ๋ฆฌ๋ก ์ฒ๋ฆฌํฉ๋๋ค.
- ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ : ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ก ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ฐ์ดํฐ ๋ง์ด๊ทธ๋ ์ด์ ์ ์ํํฉ๋๋ค.
- ๋ณ๋ ฌ ์ฒ๋ฆฌ: ์ฌ๋ฌ ์ค๋ ๋ ๋๋ ํ๋ก์ธ์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ๋ง์ด๊ทธ๋ ์ด์ ์๋๋ฅผ ๋์ ๋๋ค.
- ๋ฉฑ๋ฑ์ฑ ์คํฌ๋ฆฝํธ: ์๋ฌด๋ฐ ํด๋ฅผ ๋ผ์น์ง ์๊ณ ์ฌ๋ฌ ๋ฒ ์คํํ ์ ์๋ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํฉ๋๋ค.
- ๋ฐ์ดํฐ ์ ํจ์ฑ ๊ฒ์ฌ: ๋ง์ด๊ทธ๋ ์ด์ ํ ๋ฐ์ดํฐ๋ฅผ ์ ํจ์ฑ ๊ฒ์ฌํ์ฌ ์ฌ๋ฐ๋ฅด๊ณ ์ผ๊ด์ฑ์ด ์๋์ง ํ์ธํฉ๋๋ค.
์: ๋๊ท๋ชจ ์์ ๋คํธ์ํฌ๋ ์ฌ๋ฌ ์ธ์ด์ ๋ํ ์ง์์ ํฌํจํ๋ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง๋ก ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฅผ ๋ง์ด๊ทธ๋ ์ด์ ํด์ผ ํฉ๋๋ค. ์ผ๊ด ์ฒ๋ฆฌ, ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ๋ฐ ๋ฐ์ดํฐ ์ ํจ์ฑ ๊ฒ์ฌ์ ์กฐํฉ์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ์์ค์ด๋ ์์ ์์ด ๋ง์ด๊ทธ๋ ์ด์ ์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋๋๋ก ํฉ๋๋ค. ๋ง์ด๊ทธ๋ ์ด์ ์คํฌ๋ฆฝํธ๋ ํ์ํ ๊ฒฝ์ฐ ๋ค์ ์คํํ ์ ์๋๋ก ๋ฉฑ๋ฑ์ฑ์ผ๋ก ์ค๊ณ๋์์ต๋๋ค.
๊ณ ๊ธ ๋ง์ด๊ทธ๋ ์ด์ ๊ธฐ์
๊ธฐ๋ณธ ์ํฌํ๋ก ์ธ์๋ Django ๋ง์ด๊ทธ๋ ์ด์ ์ ๋ณต์กํ ์๋๋ฆฌ์ค๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์ฌ๋ฌ ๊ณ ๊ธ ๊ธฐ์ ์ ์ ๊ณตํฉ๋๋ค.
1. ๋ฐ์ดํฐ ๋ง์ด๊ทธ๋ ์ด์
๋ฐ์ดํฐ ๋ง์ด๊ทธ๋ ์ด์ ์ ์ฌ์ฉํ๋ฉด ๋ง์ด๊ทธ๋ ์ด์ ์ ์ผ๋ถ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ ์ ์์ต๋๋ค. ์ด๋ ๋ฐ์ดํฐ ์ ๋ฆฌ, ๋ฐ์ดํฐ ๋ณํ ๋๋ ๊ธฐ์กด ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ํ๋๋ฅผ ์ฑ์ฐ๋ ๋ฐ ์ ์ฉํ ์ ์์ต๋๋ค.
# migrations/0002_populate_discount_percentage.py
from django.db import migrations
def populate_discount_percentage(apps, schema_editor):
Product = apps.get_model('myapp', 'Product')
for product in Product.objects.all():
if product.price > 100:
product.discount_percentage = 0.10 # 10% discount
product.save()
def reverse_populate_discount_percentage(apps, schema_editor):
Product = apps.get_model('myapp', 'Product')
for product in Product.objects.all():
product.discount_percentage = 0.00
product.save()
class Migration(migrations.Migration):
dependencies = [
('myapp', '0001_initial'),
]
operations = [
migrations.RunPython(populate_discount_percentage, reverse_populate_discount_percentage),
]
์ด ์์ ์์๋ ๊ฐ๊ฒฉ์ด 100๋ณด๋ค ํฐ ์ ํ์ ๋ํด discount_percentage
ํ๋๋ฅผ ์ฑ์๋๋ค.
2. ์ฌ์ฉ์ ์ ์ ๋ง์ด๊ทธ๋ ์ด์ ์์
Django๋ฅผ ์ฌ์ฉํ๋ฉด ๊ธฐ๋ณธ ์ ๊ณต ์์ ์ด ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ์ง ์๋ ๊ฒฝ์ฐ ์์ฒด ๋ง์ด๊ทธ๋ ์ด์ ์์ ์ ์ ์ํ ์ ์์ต๋๋ค. ์ด๋ ๋ณต์กํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ ์ ์ํํ๊ฑฐ๋ ์ธ๋ถ ์์คํ ๊ณผ ์ํธ ์์ฉํ๋ ๋ฐ ์ ์ฉํ ์ ์์ต๋๋ค.
# myapp/migrations/operations.py
from django.db.migrations.operations import Operation
class CreateHStoreExtension(Operation):
reversible = True
def state_forwards(self, app_label, state):
pass
def database_forwards(self, app_label, schema_editor, from_state, to_state):
schema_editor.execute("CREATE EXTENSION IF NOT EXISTS hstore;")
def database_backwards(self, app_label, schema_editor, from_state, to_state):
schema_editor.execute("DROP EXTENSION IF EXISTS hstore;")
def describe(self):
return "Creates the hstore extension"
# migrations/0003_create_hstore_extension.py
from django.db import migrations
from myapp.migrations.operations import CreateHStoreExtension
class Migration(migrations.Migration):
dependencies = [
('myapp', '0002_populate_discount_percentage'),
]
operations = [
migrations.SeparateDatabaseAndState(
database_operations=[CreateHStoreExtension()],
state_operations=[]
),
]
์ด ์์ ์์๋ PostgreSQL์์ hstore
ํ์ฅ์ ๋ง๋๋ ์ฌ์ฉ์ ์ ์ ๋ง์ด๊ทธ๋ ์ด์
์์
์ ๋ง๋ญ๋๋ค.
3. ๋ง์ด๊ทธ๋ ์ด์ ์ค์ฟผ์ฑ
์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ํ๋ก์ ํธ์ ๋ง์ ๋ง์ด๊ทธ๋ ์ด์ ํ์ผ์ด ๋์ ๋ ์ ์์ต๋๋ค. ๋ง์ด๊ทธ๋ ์ด์ ์ค์ฟผ์ฑ์ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ๋ง์ด๊ทธ๋ ์ด์ ์ ๋จ์ผ ๋ง์ด๊ทธ๋ ์ด์ ์ผ๋ก ๊ฒฐํฉํ์ฌ ํ๋ก์ ํธ๋ฅผ ๋ ๊น๋ํ๊ณ ๊ด๋ฆฌํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
python manage.py squashmigrations myapp 0005
์ด ๋ช
๋ น์ myapp
์ฑ์ ๋ชจ๋ ๋ง์ด๊ทธ๋ ์ด์
์ ๋ง์ด๊ทธ๋ ์ด์
0005
๊น์ง ์ค์ฟผ์ฑํ์ฌ ์ ๋ง์ด๊ทธ๋ ์ด์
ํ์ผ๋ก ๋ง๋ญ๋๋ค.
Django ๋ง์ด๊ทธ๋ ์ด์ ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
Django ๋ง์ด๊ทธ๋ ์ด์ ์ด ์์ ์ ์ด๊ณ ์ ์ง ๊ด๋ฆฌ ๊ฐ๋ฅํ๋๋ก ํ๋ ค๋ฉด ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด์ญ์์ค.
- ์์์ ๋ง์ด๊ทธ๋ ์ด์ ์์ฑ: ๊ฐ ๋ง์ด๊ทธ๋ ์ด์ ์ ๋จ์ผํ๊ณ ์ ์ ์๋ ์์ ์ ์ํํด์ผ ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ง์ด๊ทธ๋ ์ด์ ์ ๋ ์ฝ๊ฒ ์ดํดํ๊ณ ๋๋ฒ๊ทธํ ์ ์์ต๋๋ค.
- ๋ง์ด๊ทธ๋ ์ด์ ํ ์คํธ: ํ๋ก๋์ ์ ์ ์ฉํ๊ธฐ ์ ์ ๊ฐ๋ฐ ๋๋ ์คํ ์ด์ง ํ๊ฒฝ์์ ํญ์ ๋ง์ด๊ทธ๋ ์ด์ ์ ํ ์คํธํฉ๋๋ค.
- ๋๋๋ฆด ์ ์๋ ๋ง์ด๊ทธ๋ ์ด์ ์ฌ์ฉ: ํ์ํ ๊ฒฝ์ฐ ๋ณ๊ฒฝ ์ฌํญ์ ์ฝ๊ฒ ๋กค๋ฐฑํ ์ ์๋๋ก ๋ง์ด๊ทธ๋ ์ด์ ์ ๋๋๋ฆด ์ ์๋์ง ํ์ธํฉ๋๋ค.
- ๋ง์ด๊ทธ๋ ์ด์ ๋ฌธ์ํ: ๊ฐ ์์ ์ ๋ชฉ์ ์ ์ค๋ช ํ๊ธฐ ์ํด ๋ง์ด๊ทธ๋ ์ด์ ํ์ผ์ ์ฃผ์์ ์ถ๊ฐํฉ๋๋ค.
- ๋ง์ด๊ทธ๋ ์ด์
์ ์ต์ ์ํ๋ก ์ ์ง:
python manage.py migrate
๋ฅผ ์ ๊ธฐ์ ์ผ๋ก ์คํํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง๋ฅผ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋์ ๋๊ธฐํํฉ๋๋ค. - ์ผ๊ด๋ ๋ช ๋ช ๊ท์น ์ฌ์ฉ: ๋ง์ด๊ทธ๋ ์ด์ ํ์ผ์ ๋ช ํํ๊ณ ์ผ๊ด๋ ๋ช ๋ช ๊ท์น์ ์ฌ์ฉํฉ๋๋ค.
- ์ถฉ๋์ ์ ์คํ๊ฒ ์ฒ๋ฆฌ: ์ฌ๋ฌ ๊ฐ๋ฐ์๊ฐ ๋์ผํ ํ๋ก์ ํธ์์ ์์ ํ๋ ๊ฒฝ์ฐ ๋ง์ด๊ทธ๋ ์ด์ ์ถฉ๋์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ ์์ค์ด๋ ์์์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ด๋ฌํ ์ถฉ๋์ ์ ์คํ๊ฒ ํด๊ฒฐํ์ญ์์ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ณ ๊ธฐ๋ฅ์ ์ ์ํ์ญ์์ค: ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ณ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ง์ด๊ทธ๋ ์ด์ ์ด ๋์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํธํ๋๋์ง ํ์ธํ์ญ์์ค.
์ผ๋ฐ์ ์ธ ๋ง์ด๊ทธ๋ ์ด์ ๋ฌธ์ ํด๊ฒฐ
์ ์คํ๊ฒ ๊ณํํ๋๋ผ๋ Django ๋ง์ด๊ทธ๋ ์ด์ ์์ ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ์ผ๋ฐ์ ์ธ ๋ฌธ์ ์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋๋ค.
- ๋ง์ด๊ทธ๋ ์ด์ ์ถฉ๋: ๋ง์ด๊ทธ๋ ์ด์ ํ์ผ์ ๊ฒ์ฌํ๊ณ ๋ณ๊ฒฝ ์ฌํญ์ ์๋์ผ๋ก ๋ณํฉํ์ฌ ์ถฉ๋์ ํด๊ฒฐํฉ๋๋ค.
- ๋๋ฝ๋ ์ข
์์ฑ:
migrate
๋ช ๋ น์ ์คํํ๊ธฐ ์ ์ ๋ชจ๋ ์ข ์์ฑ์ด ์ถฉ์กฑ๋์๋์ง ํ์ธํฉ๋๋ค. - ์ํ ์ข ์์ฑ: ์ํ ์ข ์์ฑ์ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ชจ๋ธ์ ๋ฆฌํฉํฐ๋งํฉ๋๋ค.
- ์ฅ๊ธฐ ์คํ ๋ง์ด๊ทธ๋ ์ด์ : ์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํด ๋ง์ด๊ทธ๋ ์ด์ ์ ์ต์ ํํฉ๋๋ค. ๋๊ท๋ชจ ํ ์ด๋ธ์ ๊ฒฝ์ฐ ์จ๋ผ์ธ ์คํค๋ง ๋ณ๊ฒฝ ๋๊ตฌ ์ฌ์ฉ์ ๊ณ ๋ คํ์ญ์์ค.
- ๋ฐ์ดํฐ ์์ค: ๋ฐ์ดํฐ๋ฅผ ์์ ํ๋ ๋ง์ด๊ทธ๋ ์ด์ ์ ์คํํ๊ธฐ ์ ์ ํญ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ฐฑ์ ํ์ญ์์ค.
๊ฒฐ๋ก
Django ๋ง์ด๊ทธ๋ ์ด์ ์ ์ ์ด๋๊ณ ์์ธก ๊ฐ๋ฅํ ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง ์งํ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐ ํ์์ ์ธ ๋๊ตฌ์ ๋๋ค. ๊ธฐ๋ณธ ๊ฐ๋ ์ ์ดํดํ๊ณ , ์คํค๋ง ์งํ ์ ๋ต์ ์ ์ฉํ๊ณ , ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ฉด ์ ์ธ๊ณ์ ์ผ๋ก ๋ฐฐํฌ๋ ํ๊ฒฝ์์๋ Django ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์ ์ ์ด๊ณ ์ ์ง ๊ด๋ฆฌ ๊ฐ๋ฅํ๋ฉฐ ํ์ฅ ๊ฐ๋ฅํ๋๋ก ํ ์ ์์ต๋๋ค. ๊ฐ๋ ์ค์ง ์๊ฐ๊ณผ ๋ฐ์ดํฐ ๋ถ์ผ์น ์ํ์ ์ต์ํํ๊ธฐ ์ํด ์ ์คํ๊ฒ ๊ณํํ๊ณ , ์ฒ ์ ํ ํ ์คํธํ๊ณ , ๋ง์ด๊ทธ๋ ์ด์ ์ ๋ฌธ์ํํ๋ ๊ฒ์ ์์ง ๋ง์ญ์์ค.
์ด ๊ฐ์ด๋์์๋ Django ๋ง์ด๊ทธ๋ ์ด์ ์ ๋ํ ํฌ๊ด์ ์ธ ๊ฐ์๋ฅผ ์ ๊ณตํ์ต๋๋ค. ๋ ผ์๋ ์ ๋ต๊ณผ ๊ธฐ์ ์ ํ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง๋ฅผ ์์ ์๊ฒ ๊ด๋ฆฌํ๊ณ ๊ธ๋ก๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ๊ณผ ์ต์ ์ ์ฑ๋ฅ์ ๋ณด์ฅํ ์ ์์ต๋๋ค.