- Framework์์ ์ ๊ณตํ๋ ORM์ ๋ํ ์ดํด
- Models.py๋ก Database ์ฐ๋.
- table๊ณผ column ์ ๋ํ CRUD ๋ฐฉ๋ฒ.
ORM(Object Relational Mapping)์ RDBMS์ ๋ฐ์ดํฐ๋ฅผ OOP(Object Oriented Programming)์ Class๋ก Mapping ํด์ฃผ๋ ๊ธฐ๋ฅ์ ๋งํ๋ค.
[์ฅ์ ]
1. ๊ฐ์ฒด ์งํฅ์ ์ธ ์ฝ๋๋ก ์ธํด ๋ ์ง๊ด์ ์ด๊ณ ๋น์ฆ๋์ค ๋ก์ง์ ๋ ์ง์คํ ์ ์๊ฒ ๋์์ค๋ค.
- ORM์ ์ด์ฉํ๋ฉด SQL Query๊ฐ ์๋ ์ง๊ด์ ์ธ ์ฝ๋(๋ฉ์๋)๋ก ๋ฐ์ดํฐ๋ฅผ ์กฐ์ํ ์ ์์ด ๊ฐ๋ฐ์๊ฐ ๊ฐ์ฒด ๋ชจ๋ธ๋ก ํ๋ก๊ทธ๋๋ฐํ๋ ๋ฐ ์ง์คํ ์ ์๋๋ก ๋์์ค๋ค.
- ์ ์ธ๋ฌธ, ํ ๋น, ์ข ๋ฃ ๊ฐ์ ๋ถ์์ ์ธ ์ฝ๋๊ฐ ์๊ฑฐ๋ ๊ธ๊ฒฉํ ์ค์ด๋ ๋ค.
- ๊ฐ์ข ๊ฐ์ฒด์ ๋ํ ์ฝ๋๋ฅผ ๋ณ๋๋ก ์์ฑํ๊ธฐ ๋๋ฌธ์ ์ฝ๋์ ๊ฐ๋ ์ฑ์ ์ฌ๋ ค์ค๋ค.
- SQL์ ์ ์ฐจ์ ์ด๊ณ ์์ฐจ์ ์ธ ์ ๊ทผ์ด ์๋ ๊ฐ์ฒด ์งํฅ์ ์ธ ์ ๊ทผ์ผ๋ก ์ธํด ์์ฐ์ฑ์ด ์ฆ๊ฐํ๋ค.
2. ์ฌ์ฌ์ฉ ๋ฐ ์ ์ง๋ณด์์ ํธ๋ฆฌ์ฑ์ด ์ฆ๊ฐํ๋ค.
- ORM์ ๋ ๋ฆฝ์ ์ผ๋ก ์์ฑ๋์ด์๊ณ , ํด๋น ๊ฐ์ฒด๋ค์ ์ฌํ์ฉ ํ ์ ์๋ค.
- ๋๋ฌธ์ ๋ชจ๋ธ์์ ๊ฐ๊ณต๋ ๋ฐ์ดํฐ๋ฅผ ์ปจํธ๋กค๋ฌ์ ์ํด ๋ทฐ์ ํฉ์ณ์ง๋ ํํ๋ก ๋์์ธ ํจํด์ ๊ฒฌ๊ณ ํ๊ฒ ๋ค์ง๋๋ฐ ์ ๋ฆฌํ๋ค.
- ๋งคํ์ ๋ณด๊ฐ ๋ช ํํ์ฌ, ERD๋ฅผ ๋ณด๋ ๊ฒ์ ๋ํ ์์กด๋๋ฅผ ๋ฎ์ถ ์ ์๋ค.
3. DBMS์ ๋ํ ์ข ์์ฑ์ด ์ค์ด๋ ๋ค.
- ๊ฐ์ฒด ๊ฐ์ ๊ด๊ณ๋ฅผ ๋ฐํ์ผ๋ก SQL์ ์๋์ผ๋ก ์์ฑํ๊ธฐ ๋๋ฌธ์ RDBMS์ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ Java์ ๊ฐ์ฒด์งํฅ ๋ชจ๋ธ ์ฌ์ด์ ๊ฐ๊ฒฉ์ ์ขํ ์ ์๋ค.
- ๋๋ถ๋ถ ORM ์๋ฃจ์ ์ DB์ ์ข ์์ ์ด์ง ์๋ค.
- ์ข ์์ ์ด์ง ์๋ค๋๊ฒ์ ๊ตฌํ ๋ฐฉ๋ฒ ๋ฟ๋ง์๋๋ผ ๋ง์ ์๋ฃจ์ ์์ ์๋ฃํ ํ์ ๊น์ง ์ ํจํ๋ค.
- ํ๋ก๊ทธ๋๋จธ๋ Object์ ์ง์คํจ์ผ๋ก ๊ทน๋จ์ ์ผ๋ก DBMS๋ฅผ ๊ต์ฒดํ๋ ๊ฑฐ๋ํ ์์ ์๋ ๋น๊ต์ ์ ์ ๋ฆฌ์คํฌ์ ์๊ฐ์ด ์์๋๋ค.
- ๋ํ ์๋ฐ์์ ๊ฐ๊ณตํ ๊ฒฝ์ฐ equals, hashCode์ ์ค๋ฒ๋ผ์ด๋ ๊ฐ์ ์๋ฐ์ ๊ธฐ๋ฅ์ ์ด์ฉํ ์ ์๊ณ , ๊ฐ๊ฒฐํ๊ณ ๋น ๋ฅธ ๊ฐ๊ณต์ด ๊ฐ๋ฅํ๋ค.
[๋จ์ ]
1. ์๋ฒฝํ ORM ์ผ๋ก๋ง ์๋น์ค๋ฅผ ๊ตฌํํ๊ธฐ๊ฐ ์ด๋ ต๋ค.
- ์ฌ์ฉํ๊ธฐ๋ ํธํ์ง๋ง ์ค๊ณ๋ ๋งค์ฐ ์ ์คํ๊ฒ ํด์ผํ๋ค.
- ํ๋ก์ ํธ์ ๋ณต์ก์ฑ์ด ์ปค์ง๊ฒฝ์ฐ ๋์ด๋ ๋ํ ์ฌ๋ผ๊ฐ ์ ์๋ค.
- ์๋ชป ๊ตฌํ๋ ๊ฒฝ์ฐ์ ์๋ ์ ํ ๋ฐ ์ฌ๊ฐํ ๊ฒฝ์ฐ ์ผ๊ด์ฑ์ด ๋ฌด๋์ง๋ ๋ฌธ์ ์ ์ด ์๊ธธ ์ ์๋ค.
- ์ผ๋ถ ์์ฃผ ์ฌ์ฉ๋๋ ๋ํ ์ฟผ๋ฆฌ๋ ์๋๋ฅผ ์ํด SP๋ฅผ ์ฐ๋๋ฑ ๋ณ๋์ ํ๋์ด ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋ค.
- DBMS์ ๊ณ ์ ๊ธฐ๋ฅ์ ์ด์ฉํ๊ธฐ ์ด๋ ต๋ค. (ํ์ง๋ง ์ด๊ฑด ๋จ์ ์ผ๋ก๋ง ๋ณผ ์ ์๋ค : ํน์ DBMS์ ๊ณ ์ ๊ธฐ๋ฅ์ ์ด์ฉํ๋ฉด ์ด์์ฑ์ด ์ ํ๋๋ค.)
2. ํ๋ก์์ ๊ฐ ๋ง์ ์์คํ ์์ ORM์ ๊ฐ์ฒด ์งํฅ์ ์ธ ์ฅ์ ์ ํ์ฉํ๊ธฐ ์ด๋ ต๋ค.
- ์ด๋ฏธ ํ๋ก์์ ๊ฐ ๋ง์ ์์คํ ์์ ๋ค์ ๊ฐ์ฒด๋ก ๋ฐ๊ฟ์ผํ๋ฉฐ, ๊ทธ ๊ณผ์ ์์ ์์ฐ์ฑ ์ ํ๋ ๋ฆฌ์คํฌ๊ฐ ๋ง์ด ๋ฐ์ํ ์ ์๋ค.
Model.py๋ Database ๊ฐ ์ฐ๋์ ์์ด ์ฌ์ฉํ๋ File ์ด๋ค. ์ด๊ณณ์ ์ ์๋๋ Class๋ค์ setting.py์ DATABASES์ ์ ์๋ ๋์ Database์ table๋ก์ ์์ฑ๋๊ฒ ๋๋ค.
class Menu(models.Model): name = models.CharField(max_length=45) class Categories(models.Model): name = models.CharField(max_length=45) menu = models.ForeignKey(Menu, on_delete=models.CASCADE) # FK ์์ฑ์ model class๋ฅผ ์ง์ ๋ฃ์ด๋ ๋๊ณ 'app.model'(์ฌ๊ธฐ์ services.Menu)๋ก ์ ๋ ฅํด๋ ๋จ. class Drinks(models.Model): category = models.ForeignKey(Categories, on_delete=models.CASCADE) korean_name = models.CharField(max_length=45) english_name = models.CharField(max_length=45) description = models.TextField()
์ ์ฝ๋๋ Menu, Categories, Drinks์ ๋ํ class ์ด๋ค. ์ด๋ฅผ database๋ก migrationํ๋ฉด ๊ฐ์ table์ด ๋๋ค. ์ฐธ๊ณ ๋ก table์ ๊ธฐ๋ณธ์ ์ผ๋ก Primary key(auto increment)๊ฐ์ผ๋ก 'id'๋ฅผ ์๋ ํ ๋นํ๋ค. ์์ Menu๋ฅผ migration ํ๋ฉด Database์๋ id ์์ฑ์ด PK, AI ์ค์ ์ผ๋ก ์๋ ์ถ๊ฐ๋๋ค.
๊ทธ๋ผ ์ด๋ป๊ฒ ํ๋ฉด Models.py์ ๋ด์ฉ์ Database์ ๋ฐ์ํ ๊น? ์๋์ ๋ช ๋ น์ ๋ณด์
python manage.py makemigrations [Models.py์ App ์ด๋ฆ]
์ ๋ช ๋ น์ App์ ๊ธฐ์ค์ผ๋ก Database์ ๋ฐ์ํ ๋ณ๊ฒฝ๋ด์ฉ์ ํ์ธ, migrate๋ฅผ ์ํ file์ ์ค๋นํ๋ค. file์ App/migrations ํด๋์ py ํ์์ผ๋ก ์์ฑ๋๋ค. (ex: 0001_initial.py)
ํ์ผ์ด ์ค๋น๋๋ฉด Database๋ก migrate ํ๋ค.
python manage.py migrate
์ ๋ช ๋ น์ ์คํํ๋ฉด Database์ ์ต์ข ๋ฐ์๋๋ค. ์ฐธ๊ณ ๋ก ์ค๊ฐ์ Models.py์ ์ ์๋ class์ ์ด๋ฆ์ ๋ฐ๊พธ๊ฑฐ๋ ์์ฑ์ ์ถ๊ฐํ๋ฉด migrate ๊ณผ์ ์์ framework๊ฐ ์ผ๋ถ ์ง์๋ฅผ ํ ๋๊ฐ ์๋ค. ๊ฐ๋ น ์ด๋ฆ์ ๋ณ๊ฒฝ์ ์๋ณธ์ด ๋๊ตฌ์๋์ง, non-NULL column ์ ๊ฐ์ ๊ฐ์ ๋ก ๋ฃ์ด์ผ ํ๋ ์ํฉ์ ์ด๋ป๊ฒ ํด์ผ ํ ์ง ๋ฑ์ ์ง์ํ ์ ์์ผ๋ ์์๋์.
Django๋ shell์ ์ง์ํ๋ค. shell์ ํตํด ์ค์๊ฐ์ผ๋ก data์ ๋ํ CRUD ํธ๋์ญ์ ์ ์ฒ๋ฆฌํ ์ ์๋ค.
python manage.py shell
์ ๋ช ๋ น์ ์คํํ๋ฉด Django ์ ์ด๋ฅผ ์ํ shell ์ ๋ ฅ ๋ชจ๋๋ก ์ง์ ํ๋ค. ์ด๊ณณ์์ python ์ฝ๋๋ฅผ ๋๋ฆด ์ ์๋ค.
์ด์ CRUD ํ๋ ๊ณผ์ ์ ๋ํด ์์ ์ฝ๋๋ฅผ ์์ฑํ๊ฒ ๋ค. ์ฐธ๊ณ ๋ก ๋ด๊ฐ ์์ ์ค์ธ project๋ starbucks, App์ services ์ด๋ค.
- Create
from services.Models import * Menu.objects.create(id=1, name='์๋ฃ')
์๋ Menu table์ id๋ 1, name์ '์๋ฃ'์ธ row๋ฅผ ์ถ๊ฐํ๋ Queryset ์ด๋ค.
- Read
from services.Models import * Menu.objects.get(id=1) # id๊ฐ 1์ธ ๋จ์ผ ๊ฐ์ ์ป์ ๋ Menu.objects.filter(id=1) # id๊ฐ 1์ธ list๋ฅผ ์ป์ ๋
์๋ Menu table์์ id๋ 1, name์ '์๋ฃ'์ธ row๋ฅผ ์ถ๊ฐํ๋ Queryset ์ด๋ค. ์ด Queryset์ ๋ฐ์ดํฐ๊ฐ ์๋ค๋ฉด '.column'์ ํตํด ์์ฑ๊ฐ์ ์ ๊ทผํ ์ ์๋ค.
- Update
from services.Models import * queryset = Menu.objects.get(id=1) queryset.update(name='์๋ฃ') #๋ฐฉ๋ฒ1) queryset์์ updateํจ์ ์คํ ๋๋ queryset.์์ฑ = ๊ฐฑ์ ๋ฐ์ดํฐ #๋ฐฉ๋ฒ2) queryset์ .์ผ๋ก ์์ฑ ์ ๊ทผํ์ฌ ๋ฐ์ดํฐ ๊ฐฑ์ ํ Save queryset.save()
์ฐธ๊ณ ๋ก Queryset์ด ์ฌ๋ฌ๊ฐ์ row์ธ ๊ฒฝ์ฐ ์ ๊ณผ์ ์ ๋ชจ๋ row์ ์ผ๊ด ๋ฐ์๋๋ค.
- Delete
from services.Models import * querySet = Menu.objects.get(id=1) querySet.delete()
๋ง์ฐฌ๊ฐ์ง๋ก querySet์ด ์ฌ๋ฌ๊ฐ์ row๋ก ๊ตฌ์ฑ๋์ด ์๋ค๋ฉด ์ผ๊ด ์ญ์ ๋๋ค.
์ด ์ธ์๋ ์ฌ๋ฌ๊ฐ์ง ๊ธฐ๋ฅ(SQL์ Avg, Max ๊ฐ์)์ querySet์ ํตํด ์ฌ์ฉํ ์ ์๋ค.
querySet ์ฐธ๊ณ ์ฌ์ดํธ