๐Ÿ”ฅ Django๋ž‘ ์นœํ•ด์ง€๊ธฐ

yeeun leeยท2020๋…„ 4์›” 2์ผ
4

Django

๋ชฉ๋ก ๋ณด๊ธฐ
1/8

Django์—์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•  ๋•Œ, ๋‚ด๊ฐ€ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๊ฑฐ์˜ ์—†๊ณ  ๋‹ค ๊ฐ€์ ธ์™€์„œ ์“ฐ๋Š” ๊ฒƒ์ด๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด ๋ชจ๋“ˆ์—์„œ ๋นŒ๋ ค ์“ฐ๋Š” ๊ฒƒ์ด์ด๊ธฐ ๋•Œ๋ฌธ์— Django์˜ ๊ทœ์น™์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

๊ทธ๋ž˜์„œ ์ž…๋ฌธ ์ž๋ฃŒ๋ฅผ ์ •๋ฆฌํ•˜๋ฉด์„œ ์–ด๋–ค flow์ธ์ง€ ์ตํžˆ๊ณ , ๋‚ด๊ฐ€ ๊ถ๊ธˆํ–ˆ๋˜ ๊ฐœ๋…๋“ค๋งŒ ์šฐ์„ ์ ์œผ๋กœ ์ •๋ฆฌํ•ด๋†“์œผ๋ ค๊ณ  ํ•œ๋‹ค. (์‚ฌ์‹ค tutorial์„ ๋„ˆ๋ฌด ๋ฐœ๋ฒˆ์—ญ ํ•ด๋†”์„œ ๊ฐœ๋…์„ ๋‹ค์‹œ ์ •๋ฆฌํ•˜๋Š” ๊ฑฐ...)

0. Django?

์žฅ๊ณ ๋Š” ํŒŒ์ด์ฌ์œผ๋กœ ์ž‘์„ฑ๋œ ์˜คํ”ˆ ์†Œ์Šค ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ, ๋ชจ๋ธ-๋ทฐ-์ปจํŠธ๋กค๋Ÿฌ ํŒจํ„ด์„ ๋”ฐ๋ฅด๊ณ  ์žˆ๋‹ค. ํ˜„์žฌ๋Š” ์žฅ๊ณ  ์†Œํ”„ํŠธ์›จ์–ด ์žฌ๋‹จ์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๊ณ  ์žˆ๋‹ค. ๊ณ ๋„์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ธฐ๋ฐ˜ ์›น์‚ฌ์ดํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ์žˆ์–ด์„œ ์ˆ˜๊ณ ๋ฅผ ๋”๋Š” ๊ฒƒ์ด ์žฅ๊ณ ์˜ ์ฃผ๋œ ๋ชฉํ‘œ์ด๋‹ค.

  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ: ๋‚ด ์ฝ”๋“œ์— ๋ถˆ๋Ÿฌ์™€์„œ ์“ฐ๋Š” ๊ฒƒ ๋ชจ๋“ˆ๊ณผ ๊ฐ™์€ ๊ฒƒ์ด๋‹ค.
  • ํ”„๋ ˆ์ž„์›Œํฌ: ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์›ํ•˜๋Š” ์ƒํƒœ๊ฐ€ ์žˆ๋”. ํ‹€ ์•ˆ์—์„œ ์„ค๋ช…์„œ๋Œ€๋กœ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.
  • ๋งˆ์ดํฌ๋กœ ํ”„๋ ˆ์ž„์›Œํฌ: ๋‹จ์ˆœํ•œ ๊ธฐ๋Šฅ์œผ๋กœ๋งŒ ๋งŒ๋“ค์–ด์ ธ ์žˆ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ. ์˜ˆ)ํ”Œ๋ผ์Šคํฌ

MVC

๋ชจ๋ธ-๋ทฐ-์ปจํŠธ๋กค๋Ÿฌ๋Š” ์†Œํ”„ํŠธ์›จ์–ด ๊ณตํ•™์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด ๋””์ž์ธ ํŒจํ„ด์ด๋‹ค. ์œ„ํ‚ค์˜ ๊ฐœ๋… ์„ค๋ช…์„ ์ฐธ๊ณ ํ•ด๋ณด์ž.

๋ชจ๋ธ, ๋ทฐ, ์ปจํŠธ๋กค๋Ÿฌ์˜ ๊ด€๊ณ„๋ฅผ ๋ฌ˜์‚ฌํ•˜๋Š” ๊ฐ„๋‹จํ•œ ๋‹ค์ด์–ด๊ทธ๋žจ. ์ฃผ: ๊ตต์€ ์„ ์€ ์ง์ ‘์ ์ธ ๊ด€๊ณ„๋ฅผ, ์ ์„ ์€ ๊ฐ„์ ‘์ ์ธ ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค

  • Model: ๋ชจ๋ธ์˜ ์ƒํƒœ์— ๋ณ€ํ™”๊ฐ€ ์žˆ์„ ๋•Œ ์ปจํŠธ๋กค๋Ÿฌ์™€ ๋ทฐ์— ์ด๋ฅผ ํ†ต๋ณดํ•œ๋‹ค. ์ด์™€ ๊ฐ™์€ ํ†ต๋ณด๋ฅผ ํ†ตํ•ด์„œ ๋ทฐ๋Š” ์ตœ์‹ ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๊ณ , ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋ชจ๋ธ์˜ ๋ณ€ํ™”์— ๋”ฐ๋ฅธ ์ ์šฉ ๊ฐ€๋Šฅํ•œ ๋ช…๋ น์„ ์ถ”๊ฐ€ยท์ œ๊ฑฐยท์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์–ด๋–ค MVC ๊ตฌํ˜„์—์„œ๋Š” ํ†ต๋ณด ๋Œ€์‹  ๋ทฐ๋‚˜ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์ง์ ‘ ๋ชจ๋ธ์˜ ์ƒํƒœ๋ฅผ ์ฝ์–ด ์˜ค๊ธฐ๋„ ํ•œ๋‹ค.
  • View: ์‚ฌ์šฉ์ž๊ฐ€ ๋ณผ ๊ฒฐ๊ณผ๋ฌผ์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋ธ๋กœ๋ถ€ํ„ฐ ์ •๋ณด๋ฅผ ์–ป์–ด ์˜จ๋‹ค.
  • Controller: ๋ชจ๋ธ์— ๋ช…๋ น์„ ๋ณด๋ƒ„์œผ๋กœ์จ ๋ชจ๋ธ์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค. (์˜ˆ: ์›Œ๋“œ ํ”„๋กœ์„ธ์„œ์—์„œ ๋ฌธ์„œ๋ฅผ ํŽธ์ง‘ํ•˜๋Š” ๊ฒƒ) ๋˜, ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๊ด€๋ จ๋œ ๋ทฐ์— ๋ช…๋ น์„ ๋ณด๋ƒ„์œผ๋กœ์จ ๋ชจ๋ธ์˜ ํ‘œ์‹œ ๋ฐฉ๋ฒ•์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค. (๋ฌธ์„œ๋ฅผ ์Šคํฌ๋กคํ•˜๋Š” ๊ฒƒ)

1. setup

๋ณธ๊ฒฉ์ ์œผ๋กœ django๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์ž. ์•„๋ž˜๋ถ€ํ„ฐ๋Š” ๋ฏธ๋‹ˆ์ฝ˜๋‹ค3์ด ๊น”๋ ค์žˆ๋Š” ๊ฒƒ์„ ์ „์ œ๋กœ ํ•œ๋‹ค. ๊ฐ€์ƒํ™˜๊ฒฝ์— ํŒจํ‚ค์ง€๋ฅผ ๊น”๊ณ  ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ๋กœ ๋งŒ๋“ค์–ด๋ณด์ž.

1.1 ๊ฐ€์ƒํ™˜๊ฒฝ

๋‚ด๊ฐ€ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ ๋งŒ์•ฝ ์›ํ•˜๋Š” ๋ฒ„์ „์˜ ๊ฐ€์ƒํ™˜๊ฒฝ์ด ์ด๋ฏธ ๋งŒ๋“ค์–ด์ ธ ์žˆ๋‹ค๋ฉด, ๊ตณ์ด ์ƒˆ๋กœ์šด env๋ฅผ ๋งŒ๋“ค ํ•„์š”๋Š” ์—†์„ ๊ฒƒ์ด๋‹ค. ๋‹ค๋งŒ ๋ฏธ๋””์ฝ˜๋‹ค3์„ ํ†ตํ•ด ๊ฐ€์ƒํ™˜๊ฒฝ ๋งŒ๋“œ๋Š” ๊ฒƒ์— ์ต์ˆ™ํ•ด์ง€๊ธฐ ์œ„ํ•ด์„œ ํ”„๋กœ์ ํŠธ๋งˆ๋‹ค ํ™˜๊ฒฝ์„ ๋งŒ๋“ค๊ณ  Django๋ฅผ ์„ค์น˜ํ•˜๋Š” ์Šต๊ด€์„ ๋“ค์ด๊ณ  ์žˆ๋‹ค.

- ๊ฐ€์ƒํ™˜๊ฒฝ ์ƒ์„ฑ

conda create -n myenv python=3.8 django 

conda create -n myenv --clone base
# ์ƒˆ ๊ฐ€์ƒํ™˜๊ฒฝ์„ ๋งŒ๋“ค ๋•Œ ๋กœ์ปฌ์˜ ๊ธฐ์กด ๊ฐ€์ƒํ™˜๊ฒฝ์— ์„ค์น˜๋œ ํŒจํ‚ค์ง€ ๋˜‘๊ฐ™์ด ์„ค์น˜ํ•˜๋ฉด์„œ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฐ€์ƒํ™˜๊ฒฝ ์ƒ์„ฑ ์‹œ ํŒŒ์ด์ฌ ๋ฒ„์ „์„ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค. ํ˜„์žฌ ๊ธฐ์ค€์œผ๋กœ ์•ˆ์ •ํ™”๋œ ์ตœ์‹  ๋ฒ„์ „์€ 3.8์ด๋‹ค. ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด conda์— ๊ธฐ๋ณธ ํฌํ•จ๋œ ํŒŒ์ด์ฌ ๋ฒ„์ „์œผ๋กœ ์ƒ์„ฑ๋˜๋‹ˆ ๋ฒ„์ „ ์„ค์ •์„ ๊นŒ๋จน์ง€ ๋ง์ž!

-n ์˜ต์…˜์€ --name๊ณผ ๋™์ผํ•œ ๋ช…๋ น์–ด๋‹ค. ๊ฐ€์ƒํ™˜๊ฒฝ ์ด๋ฆ„์„ ์ •ํ•œ๋‹ค.

์—”ํ„ฐ๋ฅผ ๋ˆ„๋ฅด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ํ•ด๋‹น ๊ฒฝ๋กœ์— ์„ค์น˜ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์•ˆ๋‚ด ํ•ด์ฃผ๋Š” ํ™”๋ฉด์ด ๋œฌ๋‹ค. ์ด์ƒ ์—†์œผ๋ฉด y๋ฅผ ๋ˆŒ๋Ÿฌ ์ตœ์ข…์ ์œผ๋กœ ์„ค์น˜๋ฅผ ์™„๋ฃŒํ•œ๋‹ค.

## Package Plan ##

  environment location: /Users/yeni/miniconda3/envs/myenv
conda env list

Proceed ([y]/n)? y

- ์ƒ์„ฑ ํ™•์ธ

์ดํ›„ ๋Œ€์ถฉ ์„ค์น˜ ์™„๋ฃŒ๋๋‹ค๋Š” ํ™”๋ฉด์ด ๋œฌ๋‹ค. ์ด์ œ conda env list ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด conda์— ์„ค์น˜๋˜์–ด ์žˆ๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ƒํ™˜๊ฒฝ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

conda env list ๋ช…๋ น์–ด๋Š” ๋‚ด๊ฐ€ ๋งŒ๋“  env(environment) ์ฆ‰ ๊ฐ€์ƒ ํ™˜๊ฒฝ์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ณด์—ฌ์ค€๋‹ค. ํ™œ์„ฑํ™”๋˜์–ด์žˆ๋Š” ๊ฐ€์ƒํ™˜๊ฒฝ ์˜†์— *์ด ํ‘œ์‹œ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

conda env list 
''' 
conda environments:

base                  *  /Users/yeni/miniconda3
test01                   /Users/yeni/miniconda3/envs/test01
yeni                     /Users/yeni/miniconda3/envs/yeni
'''

- ๊ฐ€์ƒํ™˜๊ฒฝ ์‹คํ–‰

์‚ฌ์‹ค ์„ค์น˜ ์™„๋ฃŒ ํ™”๋ฉด์— ๊ฐ€์ƒํ™˜๊ฒฝ์„ ํ™œ์„ฑํ™”ํ•˜๋Š” ๋ช…๋ น์–ด๊ฐ€ ๋‚˜์˜ค๊ธด ํ•œ๋‹ค. ํ”„๋กœ์„ธ์Šค์ƒ ๋งˆ์ง€๋ง‰์ด๋‹ˆ ๊ทธ๋ƒฅ ๋”ฐ๋กœ ๋„ฃ์–ด๋ณด์•˜๋‹ค.

conda activate myenv 
conda deactivate

- django ์„ค์น˜

๋งŒ์•ฝ ๊ฐ€์ƒํ™˜๊ฒฝ์„ ๋งŒ๋“ค ๋•Œ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜์ง€ ๋ชปํ–ˆ๋‹ค๋ฉด, ๊ฐ€์ƒํ™˜๊ฒฝ์ด ์‹คํ–‰๋œ ๋’ค์— ์ถ”๊ฐ€๋กœ ์›ํ•˜๋Š” ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค. conda list ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ํŒจํ‚ค์ง€ ์„ค์น˜๊ฐ€ ์ž˜ ๋˜์–ด ์žˆ๋Š”์ง€ ๋ฆฌ์ŠคํŠธ์—์„œ ํ™•์ธํ•œ๋‹ค.

conda install django # django ์„ค์น˜ํ•ด์ฃผ์„ธ์š”
conda list #์„ค์น˜๋˜์–ด ์žˆ๋Š” ํŒจํ‚ค์ง€ ๋ฆฌ์ŠคํŠธ ๋ณด์—ฌ์ฃผ์„ธ์š” 

1.2 project

conda activate ๊ฐ€์ƒํ™˜๊ฒฝ์ด๋ฆ„ ์„ ์ž…๋ ฅํ•˜๋ฉด ์ด์ œ ๊ฐ€์ƒํ™˜๊ฒฝ์ด ๋Œ์•„๊ฐˆ ๊ฒƒ์ด๋‹ค. ๋กœ์ปฌ์—์„œ ๋‚ด๊ฐ€ ํ”„๋กœ์ ํŠธ๋ฅผ ์ €์žฅํ•  ๊ฒฝ๋กœ์— ๋“ค์–ด๊ฐ€์ž.

- project ๋งŒ๋“ค๊ธฐ

์›ํ•˜๋Š” ๊ฒฝ๋กœ์— ์ ‘์†ํ•ด ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜๋ฉด, django๊ฐ€ ์•Œ์•„์„œ myapp์ด๋ผ๋Š” ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋งŒ๋“ ๋‹ค. tree๋ฅผ ํ†ตํ•ด ํ™•์ธํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. (tree๋Š” mac์—์„œ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ํŠธ๋ฆฌ ๊ตฌ์กฐ๋กœ ๋ณด๊ธฐ ์œ„ํ•ด ๋”ฐ๋กœ ์„ค์น˜ํ•ด์•ผ ํ•œ๋‹ค. brew install tree ์ž…๋ ฅ ํ›„ ์„ค์น˜ํ•˜์ž!)

django-admin startproject myapp # myapp ํ”„๋กœ์ ํŠธ ๋งŒ๋“ค์–ด์ค˜

โฏ myapp 
โฏ tree
.
โ”œโ”€โ”€ manage.py 
โ””โ”€โ”€ myapp 
    โ”œโ”€โ”€ __init__.py
    โ”œโ”€โ”€ asgi.py
    โ”œโ”€โ”€ settings.py
    โ”œโ”€โ”€ urls.py
    โ””โ”€โ”€ wsgi.py

1 directory, 6 files

- root directory

django project๋ฅผ ๋งŒ๋“ค๋ฉด root directory๋Š” manage.py ํŒŒ์ผ์ด ์žˆ๋Š” ๊ณณ์ด๋‹ค. manage.py๊ฐ€ commnad line utility์ด๊ธฐ ๋•Œ๋ฌธ์—, ์„œ๋ฒ„ ์‹คํ–‰์„ ํ•˜๋ ค๋ฉด ๊ผญ ํ•ด๋‹น ๋””๋ ‰ํ† ๋ฆฌ์— ์œ„์น˜ํ•ด์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•˜์ž.

- app ๋งŒ๋“ค๊ธฐ

root dir์—์„œ polls๋ผ๋Š” ์•ฑ์„ ๋งŒ๋“ค์–ด๋ณด์ž. ๋ช…๋ น์–ด๋Š” project์™€ ๋น„์Šทํ•˜๋‹ค. startproject๋ฅผ startapp์œผ๋กœ ๋ฐ”๊พธ๋ฉด ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด root dir์— ์ƒˆ๋กœ์šด ํŒŒ์ผ์ด ์ƒ๊ธฐ๊ณ , project์—๋Š” ์—†์—ˆ๋˜ admin.py, apps.py, models.py๊ฐ€ ์ƒ๊ธด๋‹ค.

app์„ ๋งŒ๋“ค๋ฉด root dir์™€๋Š” ๋‹ค๋ฅด๊ฒŒ urls.py ํŒŒ์ผ์ด ์ƒ๊ธฐ์ง€ ์•Š๋Š”๋‹ค. ๋ผ์šฐํŒ…์„ ํ•ด์ฃผ๋ ค๋ฉด ๋‚ด๊ฐ€ ํŒŒ์ผ์„ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค!

โฏ python manage.py startapp polls # polls๋ผ๋Š” app ๋งŒ๋“ค์–ด์ฃผ์„ธ์š”
โฏ ls # ๋ฆฌ์ŠคํŠธ์ข€ ๋ณด์—ฌ์ฃผ์„ธ์š” 
manage.py myapp polls # root dir์— polls๊ฐ€ ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค.
โฏ cd polls # polls์— ๋“ค์–ด๊ฐ€๋ณด์•„์š” 
โฏ tree # ๋””๋ ‰ํ† ๋ฆฌ๋Š” ์ด๋ ‡๊ฒŒ ์ƒ๊ฒผ์–ด์š”!
.
โ”œโ”€โ”€ __init__.py
โ”œโ”€โ”€ admin.py
โ”œโ”€โ”€ apps.py
โ”œโ”€โ”€ migrations
โ”‚   โ””โ”€โ”€ __init__.py
โ”œโ”€โ”€ models.py
โ”œโ”€โ”€ tests.py
โ””โ”€โ”€ views.py

1 directory, 7 files

2. what files do

์œ„ root directory์— ๊ธฐ๋ณธ์ ์œผ๋กœ ์žˆ๋Š” ํŒŒ์ผ์˜ ์—ญํ• ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž. part1์„ ์ •๋ฆฌํ•  ๋•Œ ํ–ˆ์ง€๋งŒ ์ดํ•ด๊ฐ€ ์•ˆ๊ฐ€๋‹ˆ^^ ๋˜^^ ํ•ด๋ณด์ž^^

2.1 default

  • outer myapp: ํ”„๋กœ์ ํŠธ๋ฅผ ๋‹ด๋Š” ๊ทธ๋ฆ‡. ์ด๋ฆ„์€ ์ƒ๊ด€ ์—†๊ณ  ๋‚ด ๋งˆ์Œ๋Œ€๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.
  • inner myapp: ์‹ค์ œ ํŒŒ์ด์ฌ ํŒจํ‚ค์ง€๋กœ, ๋ฐ”๊นฅ myapp๊ณผ๋Š” ์ „ํ˜€ ๋‹ค๋ฅด๋‹ค. ์–ด๋–ค ๊ฒƒ์ด๋“  myapp ์•ˆ์— ๋„ฃ๊ธฐ ์œ„ํ•ด ํ•ด๋‹น ์ด๋ฆ„์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • manage.py: ์ปค๋งจ๋“œ๋ผ์ธ *์œ ํ‹ธ๋ฆฌํ‹ฐ. django ํ”„๋กœ์ ํŠธ์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค.
  • __init__.py: ์š” ํŒŒ์ผ์ด ํฌํ•จ๋œ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ python package๋กœ ์ธ์‹๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์•Œ๋ ค์ค€๋‹ค.
  • asgi.py : ๋น„๋™๊ธฐ ํ†ต์‹ (์ฑ„ํŒ… ๊ฐ™์ด ๋™์‹œ ๋‹ค๋ฐœ์ ์œผ๋กœ ๋ฐœ์ƒํ•˜๋Š”)์„ ์œ„ํ•œ ๋ชจ๋“ˆ์ด๋‹ค.
  • wsgi.py : python ์›น ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“ˆ์ด๋‹ค. ํ‘œ์ค€ ๊ฐ™์€ ๊ฒƒ์œผ๋กœ flask์—์„œ๋„ ์“ด๋‹ค. ์ฆ‰ django์—ฌ์„œ ์žˆ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ, ๊ฐ–๋‹ค ์“ฐ๋Š” ๊ฒƒ์ด๋ผ๋Š” ๋œป์ด๋‹ค.

์žฅ๊ณ  ๊ณต์‹ ๋ฌธ์„œ์˜ ์„ค๋ช…์ด ๊ฐ„๊ฒฐํ•ด์„œ ๋ช‡ ๊ฐœ๋Š” ์˜๋ฌธ๋„ ํ•จ๊ป˜ ๋„ฃ์—ˆ๋‹ค.

outer myapp - container of project. its name doesn't matter.

inner myapp - actual python package. you need to use this name to import anything insde it (e.g. myapp.urls)

manage.py - command line utility. lets you interact with django project

์œ ํ‹ธ๋ฆฌํ‹ฐ: ์ปดํ“จํ„ฐ์—์„œ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ž€ ์šด์˜์ฒด๊ณ„์—์„œ ์ œ๊ณต๋˜๋Š” ๊ฒƒ ์™ธ์— ์ถ”๊ฐ€์˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ์ž‘์€ ํ”„๋กœ๊ทธ๋žจ์„ ์˜๋ฏธํ•œ๋‹ค.

2.2 ์‚ฌ์šฉ ํŒŒ์ผ

settings.py / views.py / migrations / models.py / urls.py ์— ๋Œ€ํ•ด์„œ ์ž์„ธํžˆ ๋งค์šฐ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๋„๋ก ํ•˜์ž. ์•ž์œผ๋กœ ์ž์ฃผ ์จ์•ผ๋˜๋‹ˆ๊นŒ ํ™•์‹คํžˆ ์•Œ๊ณ  ๋„˜์–ด๊ฐ€์ž๐Ÿ˜Ž

- settings.py

ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  ๊ฐ€์žฅ ๋จผ์ € ๋ด์•ผ ํ• , ์ฒ˜์Œ์— ๊ฐ€์žฅ ์ค‘์š”ํ•œ ํŒŒ์ผ์ด๋‹ค. settings, configuration ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋‹ค. ๋“ค์–ด๊ฐ€์„œ ์ฝ์–ด๋ณด๋ฉด ์ค‘์š”ํ•œ ์„ค์ •์„ ๋‚ด ํ”„๋กœ์ ํŠธ์— ์–ด๋–ป๊ฒŒ ์ ์šฉํ• ์ง€๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ๋‹ค. ๋Œ€์ถฉ ์•„๋ž˜ ๋‚ด์šฉ์„ ํฌํ•จํ•œ๋‹ค.

  • ๋””๋ฒ„๊ทธ : ๊ฐœ๋ฐœํ•  ๋•Œ๋Š” True ์ƒํƒœ๋กœ ํ•ด์•ผ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ณ , ๋ฐฐํฌ ์‹œ์—๋Š” False๋กœ ๋ฐ”๊พผ๋‹ค. ๋ฐฐํฌ ํ–ˆ๋Š”๋ฐ True ์ƒํƒœ์ด๋ฉด ์—†๋Š” ๊ฒฝ๋กœ์— ๋“ค์–ด๊ฐ”์„ ๋•Œ ์•„๋ฌด์—๊ฒŒ๋‚˜ ์ฝ”๋“œ์™€ ๊ฒฝ๋กœ๋ฅผ ๊ณต๊ฐœํ•˜๋Š” ๋ถˆ์ƒ์‚ฌ๊ฐ€ ์ƒ๊ธด๋‹ค ๐Ÿ˜ž

  • ์ ‘๊ทผ๊ถŒํ•œ : '*'๋กœ ์„ค์ •ํ•˜๋ฉด ๋ชจ๋‘์—๊ฒŒ ํ—ˆ์šฉํ•˜๊ฒŒ ๋˜๊ณ , ์•„๋ฌด ๊ฒƒ๋„ ์“ฐ์ง€ ์•Š์œผ๋ฉด ๋‚˜๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฃผ์†Œ๋‚˜ ip๋Œ€์—ญ์„ ๋„ฃ์–ด ํŠน์ • ๊ตญ๊ฐ€ ๋“ฑ์œผ๋กœ ๊ถŒํ•œ์„ ์ œํ•œํ•  ์ˆ˜ ์žˆ๋‹ค.

  • INSTALLED_APPS : admin, auth, session ๋“ฑ ์ฒ˜์Œ ์„ค์น˜ํ•˜๋ฉด ๋‚ด์žฅ ์•ฑ์ด ๊น”๋ ค์žˆ๋‹ค. project ๋‚ด์— app์„ ๋งŒ๋“ค๋ฉด ํ•ด๋‹น ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

  • ROOT_URLCONF: localhost:8000์— host๋กœ ๋“ค์–ด์˜ค๋ฉด ํ•ด๋‹น urls๋ฅผ ๋ฐ”๋ผ๋ณด๊ฒŒ ํ•˜๊ฒ ๋‹ค๋Š” ๋œป์ด๋‹ค.

ROOT_URLCONF = 'test01.urls' 
# localhost:8000(=/)๋กœ ๋“ค์–ด์˜ค๋ฉด test01.urls๋ฅผ ํ˜ธ์ถœํ• ๊ฒŒ!
  • ํƒฌํ”Œ๋ฆฟ: html, css๋ฅผ ๋ฟŒ๋ฆฌ๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๋‚ด์šฉ์ด๋‹ค. ์•ž์œผ๋กœ ์ง„ํ–‰ํ•  ํ”„๋กœ์ ํŠธ์—์„œ ํ™”๋ฉด ๊ตฌํ˜„์€ ๋‹ค๋ฃจ์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ ๋„˜์–ด๊ฐ”์ง€๋งŒ, ์ถ”ํ›„ ์–ด๋–ค ๋‚ด์šฉ์ธ์ง€ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ํ•„์š”ํ•˜๋‹ค.

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค: django๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—†์ด ๋Œ์•„๊ฐˆ ์ˆ˜ ์—†๋‹ค. default์ผ ๊ฒฝ์šฐ python์„ ์„ค์น˜ํ•  ๋•Œ ํฌํ•จ๋œ sqlite3์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ํƒ€์ž„์กด: ํ•œ๊ตญ์€ Asia/seoul๋กœ ์„ค์ •ํ•œ๋‹ค. ๊ทธ๋ฆฌ๋‹ˆ์น˜ ๊ธฐ์ค€์‹œ๋กœ ์„ค์ •ํ•˜๋ฉด ํŒŒ์ด์ฌ์—์„œ ํƒ€์ž„์กด์„ ์ธ์‹ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ๋‹ค๋ฅธ ๊ฒƒ์ธ์ง€ ์ฝ์–ด๋“ค์ด์ง€ ๋ชปํ•œ๋‹ค.

  • ๋‹ค๊ตญ์–ด์ง€์› ๋“ฑ ๋“ฑ ๋“ฑ

- views.py

๋กœ์ง์„ ๋‹ด๋‹นํ•˜๋Š” ํŒŒ์ผ. ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค๋ฉด์„œ ๊ฐ€์žฅ ๋งŽ์ด ๋“ค์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค. vies.py์—์„œ ์–ด๋–ค ํ–‰๋™์„ ํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ function์ด ์•„๋‹Œ class๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

๋กœ์ง์„ ์งค ๋•Œ์—๋Š” ๋‚ด๊ฐ€ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์€ ํ–‰๋™์ด ๋ฌด์Šจ method์— ํ•ด๋‹นํ•˜๋Š”์ง€ ์ž˜ ์•Œ์•„์•ผ ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐ์ดํ„ฐ ์กฐํšŒ๋Š” ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด๋‹ˆ๊นŒ get์ด๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด post๋‹ค. ๋‚ด๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๋Š”๊ฑด์ง€, ์ˆ˜์ •ํ•˜๋Š”์ง€, ์ง€์šฐ๋Š”๊ฑด์ง€ ๊ฒƒ์ธ์ง€ ๋“ฑ ํ–‰์œ„์— ๋งž๊ฒŒ ๋ฉ”์†Œ๋“œ๋ฅผ ์ง€์ •ํ•ด์ค˜์•ผ ํ•œ๋‹ค!

๋‹ค์Œ ๋‹จ๊ณ„์—์„œ ๋งŽ์ด ๋‹ค๋ฃจ๊ฒŒ ๋  ๊ฒƒ์ด๋ฏ€๋กœ ์šฐ์„  ์ด์ •๋„๋กœ๋งŒ ์ •๋ฆฌํ•˜๊ฒ ๋‹ค.

class based view
๋ทฐ์—๋Š” ํ•จ์ˆ˜ํ˜• ๋ทฐ, ํด๋ž˜์Šคํ˜• ๋ทฐ๊ฐ€ ์žˆ๋‹ค. ํ•จ์ˆ˜ํ˜• ๋ทฐ๋Š” method๊ฐ€ ๋ญ”์ง€ ์•Œ ์ˆ˜ ์—†๋Š” ๋ฐ˜๋ฉด, ํด๋ž˜์Šคํ˜• ๋ทฐ๋Š” class ์•ˆ์—์„œ get, post ๋“ฑ ๋กœ์ง์„ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ์–ด ๋ฉ”์†Œ๋“œ๊ฐ€ ๋ช…ํ™•ํ•˜๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

class ๋‚ด์—์„œ post, get ํ•จ์ˆ˜๋ฅผ ์ค‘๋ณตํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— class๋Š” ํ•˜๋‚˜์˜ ๋กœ์ง์— ๋Œ€ํ•ด์„œ๋งŒ ์“ฐ๊ณ , ๋‚ด๊ฐ€ ์›ํ•˜๋Š” endpoint๊ฐ€ ์žˆ๋‹ค๋ฉด class๋ฅผ ๋งŒ๋“ค์–ด urls.py์—์„œ ๋ผ์šฐํŒ…ํ•œ๋‹ค. class ์•ˆ์˜ as_view ํ•จ์ˆ˜๊ฐ€ ์•Œ์•„์„œ ๋ผ์šฐํŒ…์„ ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ํŽธํ•˜๋‹ค.

- models.py

์žฅ๊ณ ์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์ค‘ ํ•˜๋‚˜์ธ ORM๊ณผ ๊ด€๋ จ๋œ ํŒŒ์ผ. ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ์˜ ๊ตฌ์กฐ๋ฅผ ์ •ํ•œ๋‹ค. ๋ชจ๋ธ์—์„œ ๊ตฌ์กฐ์™€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด, Django๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์†Œํ†ตํ•˜๋Š” ๋ชจ๋“  ๋”๋Ÿฌ์šด ์ž‘์—…์„ ๋Œ€์‹  ํ•ด์ค€๋‹ค. ๊ตฌ์„ฑํ•˜๊ณ  ์žˆ๋Š” ์š”์†Œ๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ํ•„๋“œ ํƒ€์ž…
  • ๋ฐ์ดํ„ฐ์˜ ์ตœ๋Œ€ ํฌ๊ธฐ
  • ๊ธฐ๋ณธ๊ฐ’
  • ์„ ํƒ ๋ฆฌ์ŠคํŠธ ์˜ต์…˜
  • ๋ฌธ์„œ๋ฅผ ์œ„ํ•œ ๋„์›€ ํ…์ŠคํŠธ
  • ํผ์„ ์œ„ํ•œ ๋ผ๋ฒจ ํ…์ŠคํŠธ

- migrations ํŒŒ์ผ

models.py์—์„œ ์ •์˜ํ•œ ํ…Œ์ด๋ธ” ๊ตฌ์กฐ๋ฅผ manage.py์˜ makemigrations ์˜ต์…˜์„ ํ†ตํ•ด ์ƒˆ์„ฑํ•ด ์ €์žฅํ•˜๋Š” ๋””๋ ‰ํ† ๋ฆฌ. ์—ฌ๊ธฐ์„œ ๊ถ๊ธˆํ•œ ๊ฒƒ๋„ ๋งŽ๊ณ  ์ •๋ฆฌํ•  ๊ฒƒ๋„ ๋งŽ์•„์„œ ๋‹ค๋ฅธ ๊ฒŒ์‹œ๋ฌผ์— ๋”ฐ๋กœ ์ •๋ฆฌํ–ˆ๋‹ค.

https://velog.io/@matisse/Django-migrations-์ง‘์ค‘-ํƒ๊ตฌ

- urls.py

๊ฒฝ๋กœ๋ฅผ ๋ผ์šฐํŒ…์„ ํ•ด์ฃผ๋Š” ํŒŒ์ผ์ด๋‹ค. root dir์˜ urls.py ํŒŒ์ผ์— ๋“ค์–ด๊ฐ€๋ฉด, urlpatterns = [] ๋ผ๋Š” ๋นˆ ๋ฆฌ์ŠคํŠธ ํŒŒ์ผ์ด ์žˆ๋‹ค.

localhost8000์—์„œ ๊ฐ–๊ณ  ์žˆ๋Š” ์ฃผ์†Œ๋Š” /๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ๋ฐ›๋Š”๋‹ค. ๋ฌด์กฐ๊ฑด ๋ฐ›๋Š” ๊ณ ์œ  ์ฃผ์†Œ์ด๋‹ค. ๋งŒ์•ฝ root dir์—์„œ app์˜ url์„ ์ง€์ •ํ•˜๋ฉด, ๋‚˜๋จธ์ง€๋Š” ์•ฑ์— ์œ„์ž„ํ•˜๊ฒŒ ๋œ๋‹ค.

์ฃผ์˜์‚ฌํ•ญ

root urls.py์—์„œ path๋ฅผ 'user'๋กœ ์ง€์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, app urls.py์—์„œ๋Š” path ์•ž์— ์Šฌ๋ž˜์ด์‹œ๋ฅผ ๋ถ™์—ฌ์•ผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฃผ์†Œ๊ฐ€ ์„ค์ •๋œ๋‹ค.

๋งŒ์•ฝ myproject root ๋””๋ ‰ํ† ๋ฆฌ์˜ urls ํŒŒ์ผ์—์„œ ์•ฑ์œผ๋กœ ์—ฐ๊ฒฐํ–ˆ๋‹ค๋ฉด, app(์•„๋ž˜ ์˜ˆ์‹œ์—์„œ app์˜ ์ด๋ฆ„์€ comment๋กœ ๊ฐ€์ •)์˜ urls.py์—์„œ๋Š” ์•ž์— /๋ฅผ ๋ถ™์—ฌ์ค˜์•ผ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ž˜์•ผ 127.0.0.1:8000/uesr/comment ๋กœ ์—ฐ๊ฒฐ๋  ์ˆ˜ ์žˆ๋‹ค.

# my project root directory urls.py
urlpatterns = [ path('user', include ('user.urls')) ] 

# comment urls,py
urlpatterns = [ path('/comment', CommentView.as_view()) ]

์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ

์œ„์ฒ˜๋Ÿผ app์˜ path์— /๋ฅผ ๋ถ™์ด๊ณ  runserver์—์„œ include, slash ๊ด€๋ จ ์—๋Ÿฌ๊ฐ€ ๋œฌ๋‹ค๋ฉด root directory settings.py์—์„œ ์•„๋ž˜ ์„ค์ •์„ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋œ๋‹ค. (์ถ”๊ฐ€ ํ•˜์ง€ ์•Š์œผ๋ฉด ๋””ํดํŠธ๋Š” True์ด๋‹ค)

APPEND_SLASH = False

๋ง์ด ๊ธธ์–ด์กŒ๋Š”๋ฐ ๊ฒฐ๋ก ์€! django์—์„œ ์ž‘์—…ํ•  ๋•Œ urls์— ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•œ ๊ฒƒ์„ enpoint๋กœ ๋ณด๋ฉด ๋œ๋‹ค.

endpoint?

http ํ†ต์‹ ์—์„œ request๋ฅผ ๋ฐ›๋Š” ๊ณณ์ด๋‹ค. request์— ๋Œ€ํ•œ response๊ฐ€ ์žˆ์–ด์•ผ ์™„์ „ํ•œ http ํ†ต์‹ ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, endpoint๋ผ๋Š” ์ ‘์ ์— ์ ‘๊ทผํ•˜๋ฉด์„œ ํ–‰์œ„์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ(POST, GET ๋“ฑ)๋ฅผ ๋ฐ›๊ฒŒ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ๋ถˆํ•„์š”ํ•œ end point, ์ฆ‰ urls ๊ฒฝ๋กœ์— ์“ธ๋ฐ ์—†์ด ๋งŽ์€ ๊ฒฝ๋กœ๋ฅผ ๋„ฃ์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

์‚ฌ์ „์  ์ •์˜:

data๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด, ํ˜น์€ API๋ฅผ ํ†ตํ•ด ์–ด๋–ค actin์„ ํ•  ๋•Œ ์ ‘๊ทผํ•˜๋Š” URL. endpoint๋Š” ์›น ์„œ๋น„์Šค๋กœ ๊ฐ€๋Š” ์ฃผ์†Œ๋‚˜ ์—ฐ๊ฒฐ ์ง€์ ๋ฅผ ์ •์˜ํ•œ๋‹ค.

ENDPOINT Defines the address or connection point to a Web service. It is typically represented by a simple HTTP URL string.

3. workflow

๐Ÿ™„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ผํ•˜๋Š” ์ˆœ์„œ์™€ ์žฅ๊ณ ๊ฐ€ ์ผํ•˜๋Š” ์ˆœ์„œ๋Š” ๋ฐ˜๋Œ€๋ผ๊ณ  ํ•œ๋‹ค ๐Ÿ™„

  • ๋ณดํ†ต ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค ๋•Œ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ผ ํ•˜๊ฒŒ ๋˜๋Š” ์ˆœ์„œ: ํ…Œ์ด๋ธ” ๋งŒ๋“ค๊ณ  ๋กœ์ง ์งœ์„œ ์—ฐ๊ฒฐ ์‹œ์ผœ์ฃผ๊ธฐ
    models.py -> views.py -> urls

  • ์žฅ๊ณ  ํ”„๋กœ๊ทธ๋žจ์ด ์ž‘๋™ํ•˜๋Š” ์ˆœ์„œ: url(๊ฒฝ๋กœ)์„ ๋ณด๊ณ  ๋กœ์ง์„ ํ™•์ธํ•ด ํ…Œ์ด๋ธ”์—์„œ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ
    urls -> views -> models

+++ ์ถ”๊ฐ€: python shell์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋“ค์–ด๊ฐ€๋Š”์ง€ ๊ฒ€์ฆ์„ ํ•œ ๋‹ค์Œ์—, view์— ๊ฐ€์„œ ๋กœ์ง์„ ์ž‘์„ฑํ•˜๋ฉด ์ข‹๋‹ค.

3.1 ๊ฐœ๋ฐœ ์ˆœ์„œ

์•„์ง ์ •๋ฆฌ๊ฐ€ ๋‹ค ์•ˆ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์•„๋งˆ ๊ณ„์† ์ˆ˜์ •ํ•  ๊ฒƒ ๊ฐ™๋‹ค. ์šฐ์„  ์ง€๊ธˆ ํ•˜๊ณ  ์žˆ๋Š” ์ž‘์—…์„ ๊ธฐ์ค€์œผ๋กœ ์ •๋ฆฌํ•ด๋ณด์ž.

- root dir.

  1. ๊ฐ€์ƒ ํ™˜๊ฒฝ ์‹คํ–‰ ํ›„ project ๋ฅผ ๋งŒ๋“ค๊ณ , ํ”„๋กœ์ ํŠธ ์•ˆ์— app์„ ๋งŒ๋“ ๋‹ค.
  2. root dir. settings์˜ INSTALLED_APPS์— ๋‚ด๊ฐ€ ๋งŒ๋“  app์„ ๋ฆฌ์ŠคํŠธ ๋งˆ์ง€๋ง‰์— ๊ปด์ฃผ๊ณ , ํ”„๋กœ์ ํŠธ ๊ด€๋ จ ์„ค์ •(์‹œ๊ฐ„๋Œ€ ๋“ฑ)์„ ๋ฐ”๊ฟ”์ค€๋‹ค.
  3. root dic. urls์—์„œ app์˜ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ด์ค€๋‹ค.

- app dir.

  1. models: ๋ฐ์ดํ„ฐ ํ‹€์„ ๋งŒ๋“ ๋‹ค.(=๋ชจ๋ธ์„ ์ •์˜ํ•œ๋‹ค)
  2. views: models์—์„œ ๋งŒ๋“  ๋ฐ์ดํ„ฐ์˜ ํ–‰๋™(=method)์„ ์ •์˜ํ•œ๋‹ค. python shell์—์„œ models๋ฅผ ๊ฐ€์ง€๊ณ  ๊ฒ€์ฆ๋„ ํ•ด๋ณธ๋‹ค.
  3. urls: views์—์„œ ๋งŒ๋“  ํ–‰๋™๊ณผ endpoint๋ฅผ ์—ฐ๊ฒฐํ•œ๋‹ค. urls.py์—์„œ ์ •๋ฆฌํ•  ๋•Œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ /์— ์ฃผ์˜ํ•˜์ž.

root, app์ด ์…‹ํŒ…๋๋‹ค๋ฉด

makemigrations & migrate๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์„ค์น˜ ๋ฐ ์ ์šฉํ•œ๋‹ค. ์ด์ œ models์—์„œ ๋งŒ๋“  class๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๋งŒ๋“ค์–ด์ง€๊ณ , ๊ฑฐ๊ธฐ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค.


httpie ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ›์•„์ง€๊ณ  200์ด ๋œจ๋ฉด ์ •๋ง ์‹ ๊ธฐํ•˜๊ณ  ๋ฟŒ๋“ฏํ•˜๋‹ค. ์—๋Ÿฌ๋„ ๋ฐ›๋‹ค๋ณด๋‹ˆ ์–ด๋””์„œ ์ž˜๋ชป๋๋Š”์ง€ ์กฐ๊ธˆ ๊ฐ์ด ์žกํžŒ๋‹ค. ๐Ÿ˜Ž
profile
์ด์‚ฌ๊ฐ„ ๋ธ”๋กœ๊ทธ: yenilee.github.io

2๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2020๋…„ 4์›” 10์ผ

๐Ÿ‘๐Ÿ‘

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ
comment-user-thumbnail
2020๋…„ 6์›” 5์ผ

์ •๋ง ํฐ๋„์›€ ๋˜๊ณ ์žˆ์Šต๋‹ˆ๋‹ค ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ