[๐Ÿค Django] Intro

์—ฌ์ฃผ๋งยท2020๋…„ 11์›” 29์ผ

Django

๋ชฉ๋ก ๋ณด๊ธฐ
1/4
post-thumbnail

์žฅ๊ณ (Django) ๋ž€?


๊ฐ€์•„๋‹ˆ๋‹ค...(์ง€๊ธˆ๊นŒ์ง€ ์ด๊ฑฐ๋ž‘ ๊ด€๋ จ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•จ)
์ฐพ์•„๋ณด๋‹ˆ ์žฅ๊ณ ๋ผ๋Š” ์ด๋ฆ„์€ ์ œ์ž‘์ž๊ฐ€ ์ข‹์•„ํ•˜๋˜ ๊ธฐํƒ€๋ฆฌ์ŠคํŠธ ์žฅ๊ณ  ๋ผ์ธํ•˜๋ฅดํŠธ์˜ ์ด๋ฆ„์—์„œ ๋”ฐ์˜จ ๊ฒƒ์ด๋ผ๊ณ ํ•œ๋‹ค.(์—ญ์‹œ ์˜คํƒ€๊ตฌ๊ธฐ์งˆ์ด ์ข€ ์žˆ์–ด์•ผ ํŒŒ์ด์ฌ๋„ ์ข‹์•„ํ•˜๋Š” ๋ฐด๋“œ์ด๋ฆ„์—์„œ ๋”ฐ์˜จ๊ฑธ๋กœ ์•”)

๋ณธ๋ก ์œผ๋กœ ๋„˜์–ด๊ฐ€์„œ

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

Django๋Š” ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ํ•„์š”ํ•œ website๋ฅผ ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ์˜คํ”ˆ์†Œ์Šค์˜ Python Web framework ์ด๋‹ค. ์›น ๊ฐœ๋ฐœ๊ณผ ๊ด€๋ จ๋œ ๊ท€์ฐฎ์€ ๋ฐ˜๋ณต ์ž‘์—…์„ ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ชจ๋“ˆํ™” ํ•˜์—ฌ ์ œ๊ณตํ•จ์œผ๋กœ์จ,๊ฐœ๋ฐœ์ž๋Š” (์ด๋ฏธ ์žˆ๋Š” ๊ฒƒ์„ ๋งŒ๋“œ๋А๋ผ) ์“ธ๋ฐ์—†์ด ์‹œ๊ฐ„์„ ๋‚ญ๋น„ํ•  ํ•„์š”๊ฐ€ ์—†์ด(reinvent the wheel)์ž์‹ ์˜ application ๊ณ ์œ  ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๊ฐœ๋ฐœ์—๋งŒ ์‹ ๊ฒฝ ์“ธ ์ˆ˜ ์žˆ๋‹ค.
ํŒŒ์ด์ฌ์œผ๋กœ ์ž‘์„ฑ๋œ MVC(->์žฅ๊ณ ์—์„œ๋Š” MTV๋ผ๊ณ  ๋ฐ”๊ฟ” ์“ด๋‹ค)ํŒจํ„ด์„ ๋”ฐ๋ฅด๊ณ  ์žˆ๋‹ค.

MTV

์›น ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์˜์—ญ์„ 3๊ฐ€์ง€ ๊ฐœ๋…์œผ๋กœ ๋‚˜๋ˆ  ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐฉ์‹

  • Model : ์•ˆ์ „ํ•˜๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅ
  • Template : ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ๊ณผ ์ด๋ฒคํŠธ์— ๋ฐ˜์‘ํ•˜์—ฌ Model,View๋ฅผ ์—…๋ฐ์ดํŠธ
  • View : ๋ฐ์ดํ„ฐ๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์œ ์ €์—๊ฒŒ ๋ณด์—ฌ์คŒ
    Model/Template(์žฅ๊ณ ์—์„œ๋Š” ์ด๊ฑธ๋กœ ๋Œ€์ฒดํ•ด์„œ ์“ด๋‹ค)/View๊ทธ๋ฆฌ๊ณ  User์™€์˜ ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•œ ๊ทธ๋ฆผ(์œ ๊ธฐ์ ์œผ๋กœ ๋Œ์•„๊ฐ€๋Š” ๊ด€๊ณ„์ธ๊ฒƒ!)

Django์˜ Workflow


์ด๋ ‡๊ฒŒ ๋ณต์žกํ•˜๊ฒŒ ๊ณผ์ •์„ ๋‚˜๋ˆ„๋Š” ์ด์œ ๋Š” ํŠน์ •์˜์—ญ์„ ๋ถ„๋ฆฌํ•˜๋Š”๊ฒŒ ์ค‘์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ!

๋” ๋ณต์žกํ•œ ๋‚ด์šฉ๋“ค์ด ์žˆ๋Š”๋ฐ

์ผ๋‹จ ์ด ๊ฐœ๋…๋“ค์€ ์ฐจ์ฐจ ๋ฐฐ์šธํ…Œ๋‹ˆ ์ด๋Ÿฐ๋А๋‚Œ์ด๊ตฌ๋‚˜ ์ •๋„๋งŒ ์•Œ๋ฉด ๋ ๋“ฏ..

์˜›๋‚ ์—๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—ฃ ์ฟผ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด ๋ฐ›์œผ๋ฉด ๊ทธ๊ฑธ ๋‚ด ๋ณ€์ˆ˜์— ๋„ฃ๊ณ  ํ•˜๋Š” ๊ณผ์ •์„ ๋งค๋ฒˆ ๋ฐ˜๋ณตํ–ˆ์–ด์•ผ ํ–ˆ๋Š”๋ฐ, ์žฅ๊ณ ์—์„œ๋Š” ๋ณ€์ˆ˜๋งŒ ์ง€์ •ํ•˜๋ฉด ์•Œ์•„์„œ ์ด ๋ชจ๋“  ๊ณผ์ •์„ ์ฒ˜๋ฆฌํ•ด์คŒ

Project์™€ App

์ „์ฒด์ ์œผ๋กœ ๋ณด๋ฉด ์ด๋Ÿฐ๋А๋‚Œ์ด๋‹ค

1.project ->๋„ค์ด๋ฒ„

์ผ๋ฐ˜์ ์œผ๋กœ ์ƒ๊ฐ๋˜๋Š” ์›น์‚ฌ์ดํŠธ๋ผ๊ณ  ์ดํ•ดํ•˜๋ฉด ๋œ๋‹ค. ํ”„๋กœ์ ํŠธ ์•ˆ์—๋Š” ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค. ๊ทธ ์˜๋ฏธ์žˆ๋Š” ํ•˜๋‚˜์˜ ๊ธฐ๋Šฅ๋“ค์„ ์•ฑ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š”๊ฒƒ

  • ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ
$django-admin startproject tutorial


๋ผ๊ณ  ์ž…๋ ฅํ•˜๋ฉด ์œ„์™€๊ฐ™์€ ๊ตฌ์กฐ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.

<setting.py๋Š”?>
์ „์ฒด์ ์ธ ํ”„๋กœ์ ํŠธ์˜ ํ™˜๊ฒฝ์— ๊ด€๋ จ๋œ ์„ค์ •์„ ๋‹ด์•„๋‘” ํŒŒ์ผ

  • DEBUG : ์—๋Ÿฌ๋ฅผ ํ™•์ธํ•˜๊ณ  ์‹ถ์„๋•Œ debug๋ฅผ True๋กœ ํ•ด๋†“์œผ๋ฉด๊ฐ€๋Šฅํ•˜๋‹ค(๋Œ€์‹  ๋ฐฐํฌ์‹œ์—๋Š” False)
  • Installed_apps : PIP๋กœ ์„ค์น˜ํ•œ ์•ฑ ๋˜๋Š” ๋ณธ์ด ๋งŒ๋“  app์„ ์ถ”๊ฐ€(๋‚ด๊ฐ€ ๋งŒ๋“ ๊ฑฐ๋‚˜, ๋‚จ์ด ๋งŒ๋“ ๊ฑฐ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ) ๋“ฑ๋ก์•ˆํ•˜๋ฉด ์ธ์‹ ๋ชปํ•  ๊ฐ€๋Šฅ์„ฑ๋†’์Œ
  • Middleware_classes : request์™€ response์‚ฌ์ด์˜ ์ฃผ์š”๊ธฐ๋Šฅ ๋ ˆ์ด์–ด(ํฌ๊ฒŒ๋Š” ์‹ ๊ฒฝ ์•ˆ์จ๋„ ๋จ, ์ธ์ฆ์ด๋‚˜ ๋ณด์•ˆ๊ด€๋ จํ•œ ๊ณณ์œผ๋กœ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ํ•จ)
  • Templates : Django template๊ด€๋ จ ์„ค์ •, ์‹ค์ œ ๋ทฐ(html,๋ณ€์ˆ˜)
  • Datebases : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—”์ง„์˜ ์—ฐ๊ฒฐ์„ค์ •(์–ด๋ށํ„ฐ๋ฅผ ๋‹ค์šด๋ฐ›์„์‹œ ๊ทธ์— ๋งž์ถฐ ์—ฐ๊ฒฐ์„ค์ •์„ ๋ฐ”๊ฟ€์ˆ˜์žˆ๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ ๊ฐ€๋Šฅํ•˜๋‹ค)
  • Static_url : ์ •์  ํŒŒ์ผ์˜ url(css,javascript,image,etc)
  • ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์„ค์ • : ๊ธฐ๋ณธ์ ์œผ๋กœ sqlite3๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์›ํ•˜๋ฉด ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ(๋‚˜์˜ ๊ฒฝ์šฐ MySQL์‚ฌ์šฉ์ค‘์ด๋ผ ๋ณ€๊ฒฝํ•ด์ค˜์•ผํ•จ)
  • ํƒ€์ž„์กด ์ง€์ • : ์ตœ์ดˆ์—๋Š” ์„ธ๊ณ„ํ‘œ์ค€์‹œ(UTC)๋กœ ์„ค์ •. ํ•œ๊ตญ์‹œ๊ฐ„์œผ๋กœ ๋ณ€๊ฒฝํ•ด์ค˜์•ผ ํ•œ๋‹ค

<manage.py?>
ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ ๋ช…๋ น์–ด๋ฅผ ๋ชจ์•„๋†“์€ ๊ณณ์ด๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๊ณณ์—์„œ ๋งŽ์€๊ฑธ ํ•˜๊ฒŒ ๋ ๊ฒƒ์ž„

  • startapp - ์•ฑ์ƒ์„ฑ
  • runserver - ์„œ๋ฒ„ ์‹คํ–‰
  • createsuperuser - ์ดˆ์ฐฝ๊ธฐ์— ๊ด€๋ฆฌ์ž ์ƒ์„ฑ์‹œ ์‚ฌ์šฉ
  • makemigrations app - app์˜ ๋ชจ๋ธ ๋ณ€๊ฒฝ์‚ฌํ•ญ ์ฒดํฌ
  • migrate - ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ DB์— ๋ฐ˜์˜
  • shell - ์‰˜์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธ
  • collectstatic -staticํŒŒ์ผ์„ ํ•œ๊ณณ์— ๋ชจ์Œ
    ex) ์„œ๋ฒ„๋ฅผ ๋Œ๋ฆฌ๊ณ  ์‹ถ๋‹ค?
    ./manage.py runserver 0.0.0.0:8080
    (Django๋Š” ๊ธฐ๋ณธ port๊ฐ€ 8000์ด์ง€๋งŒ, ์ด๊ฑด ์™ธ๋ถ€์ ‘์†์ด ์•ˆ๋จ. ๊ทธ๋ž˜์„œ ์œ„์—์ฒ˜๋Ÿผ ์ž‘์„ฑํ•˜๋Š”๊ฑฐ)

2.app ->๋„ค์ด๋ฒ„์˜ ๋ธ”๋กœ๊ทธ,๋„ค์ด๋ฒ„์‡ผํ•‘,๊ฒŒ์‹œํŒ ๋“ฑ๋“ฑ

project๋‚ด๋ถ€์— ๋‹ค์ˆ˜์˜ app์ด ์ƒ์„ฑ๋œ๋‹ค.

  • app์ƒ์„ฑ
$./manage.py startapp community


ํ”„๋กœ์ ํŠธ ๋‚ด์— ๋‹ค์ˆ˜์˜ app์ด ์ƒ์„ฑ๋œ๋‹ค

<models.py?>
Django Model์ด๋ผ๋Š” ORM์„ ์ œ๊ณตํ•˜๋Š” ๊ณณ์œผ๋กœ(๋‹ค์Œ๋ฒˆ์— ๋ฐฐ์›€!) ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์„ ํ•˜๋‚˜์˜ ํŒŒ์ด์ฌ ๋ชจ๋ธ ํด๋ผ์Šค์™€ ๋งคํ•‘ํ•˜๋ฉฐ django.db.models.Modelํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›๋Š”๋‹ค. Django Model์„ ์“ฐ๋ฉด ์ง์ ‘ SQL์„ ์น  ์ผ์ด ๋งŽ์ด ์ค„์–ด๋“ ๋‹ค.
->ํ˜น์‹œ models.py๋‚ด์— ๋ณ€๋™์ด ์ƒ๊ธฐ๋ฉด ๋ณ€๋™๋‚ด์—ญ์„ ๋ฐ”๋กœ migrate(๋ณ€๋™์„ ๋ฐ˜์˜ํ•ด์ฃผ๋Š”๊ฑธ ๋งํ•จ)ํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ˜์˜ํ•ด์ค˜์•ผํ•จ(์•ˆ๊ทธ๋Ÿฌ๋ฉด ๋‚œ๋ฆฌ๋‚˜๊ฒ ์ง€..?)

์•ˆ์—์„œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๋งค์„œ๋“œ

  • models.CharField : ๊ธ€์ž์ˆ˜๊ฐ€ ์ œํ•œ๋œ ํ…์ŠคํŠธ ์ •์˜, ๊ธ€ ์ œ๋ชฉ ๊ฐ™์ด ์งง์€ ๋ฌธ์ž์—ด ์ •๋ณด ์ €์žฅํ•  ๋•Œ ์‚ฌ์šฉ
  • models.TextField : ๊ธ€์ž์ˆ˜๊ฐ€ ์ œํ•œ์ด ์—†๋Š” ํ…์ŠคํŠธ (๋ธ”๋กœ๊ทธ ์ฝ˜ํ…์ธ ์ฒ˜๋Ÿผ)
  • models.DateTimeField : ๋‚ ์งœ์™€ ์‹œ๊ฐ„์„ ์˜๋ฏธ
  • models.ForeignKey : ๋‹ค๋ฅธ ๋ชจ๋ธ์— ๋Œ€ํ•œ ๋งํฌ

<view.py>
๋จผํ›—๋‚ (๊ฐ€๊นŒ์šด๋ฏธ๋ž˜)ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค๋ฉด์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•  ํŒŒ์ผ...
์‹ค์งˆ์ ์œผ๋กœ ์œ ์ €์˜ ์š”์ฒญ์„ ์‹ค์ œ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ์œ„ํ•œ ํ•จ์ˆ˜์˜ ํ˜•ํƒœ๋กœ ๊ตฌํ˜„ํ•˜๋ฉฐ application์˜ '๋กœ์ง'์„ ๋„ฃ๋Š” ๊ณณ์ด๋‹ค.
๋ชจ๋ธ์—์„œ ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ๋ฐ›์•„์™€(from ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค) ํ…œํ”Œ๋ฆฟ์— ์ „๋‹ฌํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.
->๋กœ์ง ๊ตฌ์„ฑ์— ๋”ฐ๋ผ ํ•จ์ˆ˜๋กœ ์ฝ”๋”ฉํ•˜๋Š” ํ•จ์ˆ˜ํ˜•/ํด๋ž˜์Šค๋กœ ์ฝ”๋”ฉํ•˜๋Š” ํด๋ž˜์Šคํ˜• ๋ทฐ๋กœ ๋‚˜๋‰œ๋‹ค

๊ฐœ๋ฐœ์ž๋Š” Django๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ์„œ ๋ผˆ๋Œ€๋ฅผ ๊ตฌ์ƒํ•ด๋‚ด๋Š” ์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ•  ์ˆ˜ ์žˆ๋‹ค.
๋‚˜๊ฐ™์€ ์ฝ”๋ฆฐ์ด๋“ค์ด ๊ฐœ๋ฐœ์„ ์ข€๋” ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์ด์œ ์ค‘์˜ ํ•˜๋‚˜๊ฐ€ ์•„๋‹๊นŒ? ์‹ถ๋‹ค ใ…Žใ…Ž ๋•กํ ์žฅ๊ณ ~-

profile
๐ŸŒฑBackend Developer๐Ÿ‘ฉโ€๐Ÿ’ป

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

comment-user-thumbnail
2020๋…„ 12์›” 13์ผ

์•ˆ๋…•ํ•˜์„ธ์š”. ์ •๋ง ์ •๋ฆฌ๋ฅผ ์ž˜ ํ•˜์…จ๋„ค์š”. ๋งŽ์ด ๋ฐฐ์šฐ๊ณ  ๊ฐ‘๋‹ˆ๋‹ค. ์ €๋„ ์ด๋ ‡๊ฒŒ ์ฒด๊ณ„์ ์œผ๋กœ ๊น”๋”ํ•˜๊ฒŒ ์ •๋ฆฌํ•˜๊ณ  ์‹ถ๋„ค์š”.

(TMI: ๊ท€๋„ ๋ฐ˜ ๋กœ์ธ์€ 1989๋…„ ํฌ๋ฆฌ์Šค๋งˆ์Šค์— ํ• ๊ฒŒ ์—†์–ด์„œ ์ฝ”๋ฉ”๋”” ๊ทธ๋ฃน Monty Python์˜ ์ด๋ฆ„์„ ๋”ฐ์„œ Python ์ด๋ผ๋Š” ์–ธ์–ด๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. https://www.python.org/doc/essays/foreword/)

1๊ฐœ์˜ ๋‹ต๊ธ€