Sam Baek, The Dev's Corner

๐ŸŽฉDjango ์ž…๋ฌธ๊ธฐ

24 Dec 2023

SQLD ์ž๊ฒฉ์ฆ์„ ์ทจ๋“ํ•˜๊ณ ,
์ž๋ฐ”๋ฅผ ์ตํžˆ๊ธฐ์— ๊ธ‰๊ธ‰ํ•˜๋‹ค๊ฐ€
ํ™˜๊ธฐ ์‹œํ‚ฌ๊ฒธ ์žฅ๊ณ ๋ฅผ ๊ณต๋ถ€ํ•ด๋ณธ๋‹ค.

Django์—๋Š” ์–ด๋–ค ๋งค๋ ฅ์ด ์žˆ๋Š”๊ฐ€ ?


๋งˆ์ง€๋ง‰ ํฌ์ŠคํŠธ๊ฐ€ ํฌํŠธ๋ฆฌ์˜€๋Š”๋ฐ,
์žฅ๊ณ ๋ฅผ ํฌํŠธ๋ฆฌ๋กœ ๊ตฌ์„ฑํ•œ ๊ฐ€์ƒํ™˜๊ฒฝ์— ์„ค์น˜ํ•˜์—ฌ
๊ฒฝํ—˜ํ•ด๋ดค๋‹ค.

SQLD ์ž๊ฒฉ์ฆ์„ ์ทจ๋“ํ•˜๋Š” ๊ณผ์ •์—์„œ
์ถฉ๋ถ„ํžˆ SQL ์–ธ์–ด์— ๋Œ€ํ•ด ์ตํ˜”๊ณ ,
๊ทธ ๋•๋ถ„์— ์žฅ๊ณ ๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ์–ด๋–ค ๋งค๋ ฅ์ด ์žˆ๋Š”์ง€
๋†€๋ผ์šด ๊ฒฝํ—˜์„ ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์žฅ๊ณ ๋ฅผ ์‚ฌ์šฉํ•ด๋ณด๊ณ  ๊ฐ€์žฅ ์™€๋‹ฟ์•˜๋˜ ๊ฒฝํ—˜์€
SQL ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ DB์™€ ์†Œํ†ต์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์ด์—ˆ๋‹ค.
ํ‰์ƒ์‹œ์—๋Š” ํ† ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค๋ณด๋‹ˆ ์ด ์ ์ด ์ •๋ง ํŠน๋ณ„ํ•˜๊ฒŒ ์™€๋‹ฟ์•˜๋Š”๋ฐ,
ORM์„ ์ž‘์„ฑํ•ด๋ดค์„ ๋•Œ ํŠนํžˆ ๊ทธ๋Ÿฌํ–ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

์˜ˆ์ปจ๋Œ€, DB์˜ ํŠน์ • ํ…Œ์ด๋ธ”์—์„œ ์ •๋ณด๋ฅผ ์กฐํšŒํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•  ๋•Œ
sql๋ฌธ์œผ๋กœ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜๋ฉด

Select * from tableName

์œผ๋กœ ์ž‘์„ฑํ•˜๋˜ ๋ฌธ์žฅ์ด

className.Objects.all()

๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๋ฌผ๋ก , ๋‹จํŽธ์ ์ธ ์˜ˆ์‹œ๊ฒ ์ง€๋งŒ lookup์„ ์‚ฌ์šฉํ•˜๋‹ค๋ณด๋ฉด
์žฅ๊ณ ๊ฐ€ ์–ผ๋งˆ๋‚˜ ํŽธํ•˜๊ฒŒ DB์™€ ์†Œํ†ตํ•˜๋Š”์ง€ ์ฒดํ—˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

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

DB๋ž‘ ์†Œํ†ต์„ ํ•จ์— ์žˆ์–ด ์ฐธ ์žฅ์ ์ด ๋งŽ์€ ์นœ๊ตฌ์˜€๋‹ค.
๊ทธ๋Ÿฐ๋ฐ ๋งŒ์•ฝ DB๊ฐ€ ์ฒ˜์Œ์ด๋ผ๋ฉด, ์žฅ๊ณ ๋กœ ๋จผ์ € ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์€
๊ณ ๋ฏผ์„ ํ•˜๋Š”๊ฒŒ ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

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

์žฅ๊ณ  ์‹œ์ž‘ํ•˜๊ธฐ


์šฐ์„ , ํฌํŠธ๋ฆฌ์— ์žฅ๊ณ ๋ฅผ ์„ค์น˜ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”
์ฝ˜์†”์˜ ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•œ๋‹ค.

poetry add django-admin

ํฌํŠธ๋ฆฌ์— ์žฅ๊ณ ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ๋‚˜๋ฉด
์žฅ๊ณ ์˜ ๋ช…๋ น์–ด๋ฅผ ํฌํŠธ๋ฆฌ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•ด์„œ๋Š” ํฌํŠธ๋ฆฌ ๊ฐ€์ƒํ™˜๊ฒฝ์— ์ž…์žฅํ•˜๋Š” ๊ฒƒ์€
๋งํ•˜์ง€ ์•Š์•„๋„ ๋‹น์—ฐํ•œ ์ˆ˜์ˆœ์ด๋‹ค.
ํ„ฐ๋ฏธ๋„์— poetry shell์„ ์ž…๋ ฅํ•ด ์ž…์žฅํ•œ๋‹ค.

๊ฐ€์ƒํ™˜๊ฒฝ์— ์ž…์žฅํ–ˆ๋‹ค๋ฉด, ์žฅ๊ณ ์˜ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•ด๋ณด์ž.

djnago-admin startproject config .

.์€ ํ˜„์žฌ ํด๋”๋ฅผ ์˜๋ฏธํ•˜๊ณ , config๋ผ๋Š” ์žฅ๊ณ ํ”„๋กœ์ ํŠธ๋ฅผ
์„ค์น˜ํ•ด์ค„ ๊ฒƒ์ด๋‹ค.

ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด config๋ผ๋Š” ํŒจํ‚ค์ง€์™€
manage.py๋ผ๋Š” ํŒŒ์ผ์ด ์ƒ์„ฑ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด์ œ๋ถ€ํ„ฐ ์šฐ๋ฆฌ๋Š” manage.py์— ์šฐ๋ฆฌ๊ฐ€ ํ•  ํ–‰๋™์— ๋Œ€ํ•ด
์ „๋‹ฌํ•  ์˜ˆ์ •์ด๋‹ค.

python manage.py startapp appName

์ด๋Ÿฐ ์‹์œผ๋กœ ๋ง์ด๋‹ค.
์Œโ€ฆ ๋‚ด๊ฐ€ ์ดํ•ดํ•œ ๊ฒƒ์œผ๋กœ ์ •๋ฆฌ๋ฅผ ํ•˜์ž๋ฉด
app์ด๋ผ๋Š” ๊ฒƒ์€ DB์˜ ๊ด€์ ์—์„œ๋Š” ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.
๋งŒ์•ฝ, ๋‚ด๊ฐ€ DB์— ๋ฆฌ๋ทฐ์— ๋Œ€ํ•œ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด
python manage.py startapp reviews๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.
๊ทธ๋Ÿฌ๋ฉด ์žฅ๊ณ ๋Š” reviews์— ๋Œ€ํ•œ ํŒจํ‚ค์ง€๋ฅผ ์ƒ์„ฑํ•ด ์ค„ ๊ฒƒ์ด๊ณ 
๊ทธ ํŒจํ‚ค์ง€์—์„œ ๋ฆฌ๋ทฐ์— ๊ด€ํ•œ ๋ชจ๋ธ๋„ ๋งŒ๋“ค๊ณ 
์›ํ•˜๋Š” ์„ค์ •๋“ค๋„ ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์ด ๋ญ์•ผ


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

๊ฒฐ๊ตญ ๋ณธ์ธ์—๊ฒŒ ๊ฐ€์žฅ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋„๋ก ์ •๋ฆฌ๋ฅผ ํ•ด๋ดค๋Š”๋ฐ
๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์ด๋ผ๋Š” ๊ฒƒ์€ ์žฅ๊ณ ์—๊ฒŒ โ€˜๋‚ด ๋ชจ๋ธ์ด ์ด๋ ‡๊ฒŒ ๋ณ€๊ฒฝ๋์–ด !โ€™
ํ˜น์€ โ€˜๋‚ด ๋ชจ๋ธ์ด ์ด๋ ‡๊ฒŒ ์ƒ์„ฑ๋์–ด! โ€˜ ๋ผ๊ณ 
๋ณ€๊ฒฝ ์ด๋ ฅ์— ๋Œ€ํ•ด ์•Œ๋ฆฌ๋Š” ๊ณผ์ •์ธ ์…ˆ์ด๋‹ค.

์žฅ๊ณ ๋Š” ๋ชจ๋ธ ํด๋ž˜์Šค์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๊ฐ์ง€ํ•˜๊ณ 
ํ•ด๋‹น ๋‚ด์˜น์„ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํŒŒ์ผ๋กœ ๊ธฐ๋กํ•˜๋Š”๋ฐ,
์ด ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํŒŒ์ผ์€ DB ์Šคํ‚ค๋งˆ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ
๋ช…๋ น๋“ค์„ ๋‹ด๊ณ  ์žˆ๋‹ค.
์žฅ๊ณ ๋Š” ์ด ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํŒŒ์ผ๋“ค์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰ํ•ด
DB ์Šคํ‚ค๋งˆ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ๋ชจ๋ธ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด
DB์— ๋ฐ˜์˜๋ผ ์•ฑ๊ณผ DB ๊ฐ„์˜ ์ผ๊ฐ„์„ฑ์„ ์œ ์ง€ํ•˜๋„๋ก ๋•๋Š”๋‹ค.

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

Python manage.py makemigration # ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ƒ์„ฑ
Python manage.py migration # ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์‹คํ–‰