๐ŸํŒŒ์ด์ฌ ์ดˆ๋ณด์ž ๊ฐ€์ด๋“œ : Django ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งŒ๋“ค๊ธฐ(๋‹จ๊ณ„๋ณ„ ๊ฐ€์ด๋“œ)

 

 

์•ˆ๋…•ํ•˜์„ธ์š”! ์›น ๊ฐœ๋ฐœ์„ ์‹œ์ž‘ํ•˜๋ ค๋Š” ์ดˆ๋ณด ๊ฐœ๋ฐœ์ž๋‹˜, ํŒŒ์ด์ฌ์˜ ๊ฐ•๋ ฅํ•œ ์›น ํ”„๋ ˆ์ž„์›Œํฌ **Django(์žฅ๊ณ )**๋ฅผ ๋งŒ๋‚˜๋ณด์…จ๊ตฐ์š”! Django๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(DB) ์—ฐ๋™์„ ๋งค์šฐ ์‰ฝ๊ณ  ์žฌ๋ฏธ์žˆ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฒˆ ๋ธ”๋กœ๊ทธ ๊ธ€์—์„œ๋Š” Django์˜ ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ธ SQLite๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ดˆ๋ณด์ž ๋ˆˆ๋†’์ด์— ๋งž์ถฐ ๋‹จ๊ณ„๋ณ„๋กœ ์„ค๋ช…ํ•ด ๋“œ๋ฆด๊ฒŒ์š”!


๐Ÿ’ก 1. Django์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค: ORM์˜ ๋งˆ๋ฒ• ✨

Django๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฐฉ์‹์€ ์กฐ๊ธˆ ํŠน๋ณ„ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ”๋กœ **ORM(Object-Relational Mapping)**์ด๋ผ๋Š” ๊ฐœ๋… ๋•๋ถ„์ธ๋ฐ์š”.

  • ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ธฐ: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๋ณดํ†ต SQL์ด๋ผ๋Š” ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋‹ค๋ฃน๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ORM์€ ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ํŒŒ์ด์ฌ **ํด๋ž˜์Šค(Class)์™€ ๊ฐ์ฒด(Object)**๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ **ํ…Œ์ด๋ธ”(Table)๊ณผ ๋ฐ์ดํ„ฐ(Data)**์— ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ๋‹ค๋ฆฌ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

  • ์žฅ์ : ๋ณต์žกํ•œ SQL ์ฟผ๋ฆฌ๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•  ํ•„์š” ์—†์ด, ํŒŒ์ด์ฌ ์ฝ”๋“œ๋งŒ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด ํŒŒ์ด์ฌ ํด๋ž˜์Šค๊ฐ€ ๋ฐ”๋กœ Django์˜ **Models(๋ชจ๋ธ)**์ž…๋‹ˆ๋‹ค.


๐Ÿ› ️ 2. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค์ • ํ™•์ธ (settings.py)

์ƒˆ๋กœ์šด Django ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค๋ฉด, ๊ธฐ๋ณธ์ ์œผ๋กœ SQLite ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์„ค์ •์€ ํ”„๋กœ์ ํŠธ ํด๋” ์•ˆ์˜ settings.py ํŒŒ์ผ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”.

Python
# settings.py ํŒŒ์ผ ๋‚ด์šฉ ์ค‘
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}
  • 'default': ์ด ์„ค์ •์ด ํ”„๋กœ์ ํŠธ์˜ ์ฃผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ผ๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

  • 'ENGINE': ์–ด๋–ค ์ข…๋ฅ˜์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ• ์ง€ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ sqlite3์ž…๋‹ˆ๋‹ค.

  • 'NAME': ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŒŒ์ผ์˜ ์ด๋ฆ„๊ณผ ์œ„์น˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์„ค์ •๋Œ€๋กœ๋ผ๋ฉด, ํ”„๋กœ์ ํŠธ ์ตœ์ƒ์œ„ ํด๋”์— db.sqlite3 ํŒŒ์ผ์ด ์ƒ์„ฑ๋  ๊ฑฐ์˜ˆ์š”.

๐Ÿ“ ํŒ: ์ดˆ๋ณด์ž์—๊ฒŒ๋Š” ๋ณ„๋„์˜ ์„ค์น˜ ์—†์ด ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” SQLite๊ฐ€ ๊ฐ€์žฅ ์‰ฝ์Šต๋‹ˆ๋‹ค. ๋‚˜์ค‘์— MySQL, PostgreSQL ๊ฐ™์€ ๋‹ค๋ฅธ DB๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜๋„ ์žˆ์–ด์š”!


๐Ÿ—️ 3. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ชจ๋ธ(Model) ์ƒ์„ฑํ•˜๊ธฐ

์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋  ๋ฐ์ดํ„ฐ์˜ **๊ตฌ์กฐ(์Šคํ‚ค๋งˆ)**๋ฅผ ์ •์˜ํ•˜๋Š” ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ์•ฑ ํด๋”(์˜ˆ: myapp) ์•ˆ์˜ models.py ํŒŒ์ผ์— ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฐ„๋‹จํ•œ '๊ฒŒ์‹œ๊ธ€' ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ๋ชจ๋ธ์„ ๋งŒ๋“ค์–ด ๋ด…์‹œ๋‹ค.

Python
# myapp/models.py
from django.db import models

class Post(models.Model): # Post๋ผ๋Š” ์ด๋ฆ„์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
    title = models.CharField(max_length=100) # ์ œ๋ชฉ(์ตœ๋Œ€ 100์ž ๋ฌธ์ž์—ด)
    content = models.TextField()             # ๋‚ด์šฉ(๊ธด ํ…์ŠคํŠธ)
    created_at = models.DateTimeField(auto_now_add=True) # ์ƒ์„ฑ ์‹œ๊ฐ„(์ž๋™ ์ €์žฅ)
    
    def __str__(self):
        return self.title # ๊ฐ์ฒด๋ฅผ ์ถœ๋ ฅํ•  ๋•Œ ์ œ๋ชฉ์ด ๋ณด์ด๋„๋ก ์„ค์ •
  • models.Model์„ ์ƒ์†: ์ด ํด๋ž˜์Šค๊ฐ€ Django์˜ ORM ๋ชจ๋ธ์ž„์„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

  • ํ•„๋“œ ์ •์˜: title, content ๋“ฑ์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์˜ **์—ด(Column)**์ด ๋ฉ๋‹ˆ๋‹ค.

  • ์ž๋™ ID: ๋ชจ๋“  Django ๋ชจ๋ธ์—๋Š” id ํ•„๋“œ๊ฐ€ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜์–ด ๊ธฐ๋ณธ ํ‚ค(Primary Key) ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.


⚙️ 4. ์•ฑ ๋“ฑ๋ก ๋ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์‹คํ–‰ํ•˜๊ธฐ

๋ชจ๋ธ์„ ๋งŒ๋“ค์—ˆ๋‹ค๊ณ  ํ•ด์„œ ๋ฐ”๋กœ DB์— ๋ฐ˜์˜๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋‘ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์ณ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

4.1. ์•ฑ ๋“ฑ๋ก (settings.py)

Django ํ”„๋กœ์ ํŠธ์—๊ฒŒ ์ƒˆ๋กœ์šด ์•ฑ(์˜ˆ: myapp)์ด ์ƒ๊ฒผ๊ณ , ์ด ์•ฑ์˜ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๋ ค์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ์˜ settings.py ํŒŒ์ผ๋กœ ๋Œ์•„๊ฐ€์„œ INSTALLED_APPS ๋ฆฌ์ŠคํŠธ์— ์•ฑ ์ด๋ฆ„์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

Python
# settings.py ํŒŒ์ผ ๋‚ด์šฉ ์ค‘
INSTALLED_APPS = [
    # ... ๊ธฐ๋ณธ ์•ฑ๋“ค
    'django.contrib.admin',
    # ...
    # ์—ฌ๊ธฐ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค
    'myapp', # <--- ๋งŒ๋“  ์•ฑ์˜ ์ด๋ฆ„์„ ์ถ”๊ฐ€
]

4.2. ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํŒŒ์ผ ์ƒ์„ฑ (makemigrations)

์ด์ œ Django์—๊ฒŒ "๋‚ด๊ฐ€ ๋ชจ๋ธ์„ ๋ณ€๊ฒฝํ–ˆ์œผ๋‹ˆ, DB์— ๋ฐ˜์˜ํ•  ์ค€๋น„๋ฅผ ํ•ด์ค˜!"๋ผ๊ณ  ๋ช…๋ นํ•  ์ฐจ๋ก€์ž…๋‹ˆ๋‹ค.

๊ฐ€์ƒ ํ™˜๊ฒฝ์ด ํ™œ์„ฑํ™”๋œ ํ„ฐ๋ฏธ๋„์—์„œ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Bash
python manage.py makemigrations myapp
  • ์ด ๋ช…๋ น์€ models.py์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฐ์ง€ํ•˜์—ฌ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ์šฉํ•  **์„ค๊ณ„๋„ ํŒŒ์ผ(๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํŒŒ์ผ)**์„ myapp/migrations ํด๋”์— ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

4.3. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ˜์˜ (migrate)

๋งˆ์ง€๋ง‰์œผ๋กœ, ์ƒ์„ฑ๋œ ์„ค๊ณ„๋„ ํŒŒ์ผ์„ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(db.sqlite3 ํŒŒ์ผ)์— ์ ์šฉํ•˜์—ฌ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

Bash
python manage.py migrate
  • ์ด ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉด, Django๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•„์š”ํ•œ ํ…Œ์ด๋ธ”(์ธ์ฆ, ์„ธ์…˜ ๋“ฑ)๊ณผ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  Post ๋ชจ๋ธ์— ํ•ด๋‹นํ•˜๋Š” ํ…Œ์ด๋ธ”์„ ๋ชจ๋‘ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.


✅ 5. ์ƒ์„ฑ๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ™•์ธ

migrate ๋ช…๋ น์ด ์„ฑ๊ณต์ ์œผ๋กœ ์‹คํ–‰๋˜์—ˆ๋‹ค๋ฉด, ํ”„๋กœ์ ํŠธ ํด๋”์— db.sqlite3 ํŒŒ์ผ์ด ์ƒ์„ฑ๋˜์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ํŒŒ์ผ์€ ์ผ๋ฐ˜์ ์ธ ํ…์ŠคํŠธ ํŽธ์ง‘๊ธฐ๋กœ๋Š” ์—ด์–ด๋ณผ ์ˆ˜ ์—†์ง€๋งŒ, DB Browser for SQLite ๊ฐ™์€ ์ „์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์‚ฌ์šฉํ•˜๋ฉด ์‹ค์ œ๋กœ ํ…Œ์ด๋ธ”์ด ์ž˜ ๋งŒ๋“ค์–ด์กŒ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ“ ๋งˆ๋ฌด๋ฆฌ

์ถ•ํ•˜ํ•ฉ๋‹ˆ๋‹ค! ์ด์ œ ํŒŒ์ด์ฌ ์ฝ”๋“œ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค๊ณ , ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŒŒ์ผ์— ๋ฐ˜์˜ํ•˜๋Š” ๋ชจ๋“  ๊ณผ์ •์„ ๋งˆ์Šคํ„ฐํ•˜์…จ์Šต๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ์š”์•ฝ:

  1. ๋ชจ๋ธ ์ •์˜: models.py์—์„œ ํŒŒ์ด์ฌ ํด๋ž˜์Šค๋กœ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ(ํ…Œ์ด๋ธ”)๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

  2. ์•ฑ ๋“ฑ๋ก: settings.py์˜ INSTALLED_APPS์— ์•ฑ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  3. ์„ค๊ณ„๋„ ์ƒ์„ฑ: python manage.py makemigrations๋กœ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค.

  4. DB ๋ฐ˜์˜: python manage.py migrate๋กœ ์‹ค์ œ DB์— ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์ด ๊ณผ์ •์„ ํ†ตํ•ด Django์˜ Models์™€ Migrations ์‹œ์Šคํ…œ์ด ์–ผ๋งˆ๋‚˜ ํŽธ๋ฆฌํ•œ์ง€ ๋А๋ผ์…จ์„ ๊ฑฐ์˜ˆ์š”.

๋Œ“๊ธ€