[ToyPJ/Python] django ๋ก ์ธ์คํ๊ทธ๋จ ๋ง๋ค๊ธฐ - 02 django ๊ฐ๋ฐํ๊ฒฝ ์ธํ , ๋๋ง์ ํ์ด์ง ๋์๋ณด๊ธฐ
๐ 01. ํ์ด์ฐธ ์ค์นํ๊ณ ์นํ์ด์ง ๋์๋ณด๊ธฐ
์ด๋ฒ ํ ์ดํ๋ก์ ํธ๋ JetBrains๊ฐ ๋ง๋ ๊ฐ๋ฐ์์ฉ ํ์ด์ฌ IDE์ธ ํ์ด์ฐธ(Pycharm)์ ์ฌ์ฉํ๊ธฐ๋ก ํ๋ค.
์ฅ๊ณ ๋ ์ค์นํ์๋ง์ ๋ฐ๋ก ์นํ์ด์ง๋ฅผ ์คํํ ์ ์๋ค. ์ฅ๊ณ ๋ python manage.py runserver๋ผ๋ ๋ฉ๋ด๋ฅผ ํตํด ๊ฐ๋ฐ ๋ชจ๋๋ก ์น์๋ฒ๋ฅผ ์ง์ํด์ค๋ค.
๐ค ์ด๋ป๊ฒ ์คํ์ด ๋ ์ ์์๊น?
python manage.py runserver๋ฅผ ํ๊ฒ ๋๋ฉด ์ฅ๊ณ ์๋ฒ๊ฐ ๋ด ์ปดํจํฐ์์ ์คํ์ด ๋๊ฒ ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ๋ด ์ปดํจํฐ์์ ์คํ๋๊ณ ์๋ ์๋ฒ์๋ ์ด๋ป๊ฒ ์ ์ํ ๊น?
๋ณดํต ์๋ฒ์ ์ ์ํ๊ธฐ ์ํด์๋ ip์ฃผ์๋ฅผ ์์์ผ ํ๋ค. ํ์ง๋ง ip๋ ์ซ์๋ก ๋์ด์๊ณ , ์ฐ๋ฆฌ๊ฐ ์ธ์ฐ๊ธฐ ์ฝ์ง ์๋ค. ๋ฐ๋ผ์ "๋๋ฉ์ธ ์ด๋ฆ" ์ด๋ผ๋ ๊ฒ์ ์ฌ์ฉํ๋๋ฐ, ์ฐ๋ฆฌ๊ฐ ์๋ google.com, naver.com์ด ๋ฐ๋ก ๋๋ฉ์ธ ์ด๋ฆ์ด๋ค. ์๋ฅผ ๋ค์ด ๋ธ๋ผ์ฐ์ ์ google.com์ ์ ๋ ฅํ๊ฒ ๋๋ฉด, "๋๋ฉ์ธ ์ด๋ฆ ์๋ฒ" ์ฆ, "DNS"์์ google.com์ ip์ฃผ์๋ฅผ ์ฐพ์์ ํ๋ฉด์ ๊ตฌ๊ธ ํ์ด์ง๋ฅผ ๋ณด์ฌ์ฃผ๊ฒ ๋๋ค.
์ฅ๊ณ ๋ฅผ ํตํด ๋์์ง ์นํ์ด์ง์ ์ฃผ์์ฐฝ์ ์ ํ ์๋ ip์ฃผ์๋ฅผ ๋ณด๋ฉด "127.0.0.1"์ด๋ผ๊ณ ์ ํ์๋ค. ์ด๊ฒ์ localhost๋ผ๊ณ ๋ถ๋ฆฌ๋ฉฐ ์๊ธฐ ์์ ์ ๊ฐ๋ฆฌํค๋ ip์ฃผ์์ด๋ค. ์ฆ, ์ฐ๋ฆฌ ์ปดํจํฐ์ ๋ธ๋ผ์ฐ์ ์์ 127.0.0.1์ ์ ๋ ฅํ๊ฒ ๋๋ฉด, ์ฐ๋ฆฌ์ ์ปดํจํฐ์ ์ ์ํ๊ฒ ๋ค๋ ์๋ฆฌ์ด๋ค. ๋ฐ๋ผ์ 127.0.0.1 ์ด๋ผ๋ ip์ฃผ์๋ฅผ ์ ๋ ฅํ๊ฒ ๋๋ฉด, ์ฐ๋ฆฌ ๊ฐ์์ ์ปดํจํฐ์์ ์ฅ๊ณ ํ์ด์ง๋ฅผ ๋ณผ ์ ์๋ ์ด์ ์ด๋ค.
๐ 02. ์ฅ๊ณ ์น ํ๋ ์์ํฌ์ ์ํคํ ์ฒ ํจํด
๐ ๋ค๋ฅธ ์น ํ๋ ์์ํฌ์ ํ์ 3์์ - MVC(Model, View, Controller)
- Model : ์ดํ๋ฆฌ์ผ์ด์ ์ ์ ๋ณด(๋ฐ์ดํฐ)๋ฅผ ๋ํ๋
- View : ํ ์คํธ, ์ฒดํฌ๋ฐ์ค ํญ๋ชฉ ๋ฑ๊ณผ ๊ฐ์ ์ฌ์ฉ์ ์ธํฐํ์ด์ค ์์๋ฅผ ๋ํ๋
- Controller : ๋ฐ์ดํฐ์ ๋น์ฆ๋์ค ๋ก์ง ์ฌ์ด์ ์ํธ ๋์์ ๊ด๋ฆฌํจ
MVC ํจํด : ๋์์ธ ํจํด(์ด๋ค ํน์ ํ ๊ฒ์ ๊ฐ๋ฐํ๋ ์ค ๋ฐ์ํ๋ ๋ฌธ์ ์ ๋ค์ ์ ๋ฆฌํด์ ์ํฉ์ ๋ฐ๋ผ ๊ฐํธํ๊ฒ ์ ์ฉํด์ ์ธ ์ ์๋ ๊ฒ์ ์ ๋ฆฌํ์ฌ ํน์ ํ '๊ท์ฝ'์ ํตํด ์ฝ๊ฒ ์ธ ์ ์๋ ํํ๋ก ๋ง๋ ๊ฒ) ์ค ํ๋๋ก, ํ๋์ ์ดํ๋ฆฌ์ผ์ด์ , ํ๋ก์ ํธ๋ฅผ ๊ตฌ์ฑํ ๋ ๊ทธ ๊ตฌ์ฑ์์๋ฅผ ์ธ ๊ฐ์ง ์ญํ ๋ก ๊ตฌ๋ถํ ํจํด.
MVC ํจํด์ ์ฌ์ฉํ๋ฉด ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ก๋ถํฐ ๋น์ฆ๋์ค ๋ก์ง์ ๋ถ๋ฆฌํ์ฌ ์ดํ๋ฆฌ์ผ์ด์ ์ ์๊ฐ์ ์ธ ์์๋ ๊ทธ ์ด๋ฉด์์ ์คํ๋๋ ๋น์ฆ๋์ค ๋ก์ง์ ์๋ก ์ํฅ ์์ด ์ฝ๊ฒ ๊ณ ์น ์ ์๋ ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์๋ค.
๐ ์ฅ๊ณ ์ MVT ํจํด (Model, View, Template)
- Model : ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋๋ ๋ฐ์ดํฐ (๊ฐ์ฒด๋ฅผ ๋์์ผ๋ก ํ์ํ ์์ ์ ์คํํ๋ฉด ORM์ด ์๋์ผ๋ก ์ ์ ํ SQL ๊ตฌ๋ฌธ์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค API๋ฅผ ํธ์ถํ์ฌ ์ฒ๋ฆฌ)
- Template : ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ง๋ UI ๋ถ๋ถ (MVC ๋ชจ๋ธ์์ View์ ํด๋นํ๋ ํํธ)
- View : ์ค์ง์ ์ผ๋ก ํ๋ก๊ทธ๋จ ๋ก์ง์ด ๋์ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ ์ ์ ํ๊ฒ ์ฒ๋ฆฌํ ๊ฒฐ๊ณผ๋ฅผ ํ ํ๋ฆฟ์ ์ ๋ฌํ๋ ์ญํ (MVC ๋ชจ๋ธ์์ Controller์ ํด๋นํ๋ ํํธ)
๐ ์น ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ฐ๊ณ , ์ฅ๊ณ ์์ MVT ํจํด์ ๋ฐ๋ผ ์ฒ๋ฆฌํ๋ ๊ณผ์
- ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์์ฒญ์ ๋ฐ์ผ๋ฉด URLconf๋ฅผ ์ด์ฉํ์ฌ URL์ ๋ถ์ํ๋ค.
- URL ๋ถ์ ๊ฒฐ๊ณผ๋ฅผ ํตํด ํด๋น URL์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ๋ด๋นํ ๋ทฐ๋ฅผ ๊ฒฐ์ ํ๋ค.
- ๋ทฐ๋ ์์ ์ ๋ก์ง์ ์คํํ๋ฉด์ ๋ง์ผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฒ๋ฆฌ๊ฐ ํ์ํ๋ฉด ๋ชจ๋ธ์ ํตํด ์ฒ๋ฆฌํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ๋ฐ๋๋ค.
- ๋ทฐ๋ ์์ ์ ๋ก์ง ์ฒ๋ฆฌ๊ฐ ๋๋๋ฉด ํ ํ๋ฆฟ์ ์ฌ์ฉํ์ฌ ํด๋ผ์ด์ธํธ์ ์ ์กํ HTML ํ์ผ์ ์์ฑํ๋ค.
- ๋ทฐ๋ ์ต์ข ๊ฒฐ๊ณผ๋ก HTML ํ์ผ์ ํด๋ผ์ด์ธํธ์๊ฒ ๋ณด๋ด ์๋ตํ๋ค.
๐ 03. ์ฌ๋ฌ ์นํ์ด์ง๋ฅผ ๋ง๋๋ ค๋ฉด?
ํ๋ก์ ํธ ์ด๋ฆ๊ณผ ๊ฐ์ ์ด๋ฆ์ ๊ฐ์ง djangoProject๋ผ๋ ํด๋๋ ํ๋ก์ ํธ์ ์ค์ ํด๋ ์ญํ ์ ํ๋ค. ์์ ํด๋๋ฅผ ๋ณด๋ฉด settings.py ๊ฐ ์๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ์๋ urls.py๋ผ๋ ํ์ด์ฌ ์ฝ๋ ํ์ผ์ด ์๋ค. ์ด urls.py๋ผ๋ ํ์ผ์ด ์ฐ๋ฆฌ๊ฐ ๋ง๋๋ ์๋ฒ์ ์ฃผ์๋ฅผ ๊ฒฐ์ ํด์ฃผ๋ ์ค์ํ ํ์ผ์ด๋ค. ์์ค ํ์ผ์ ์ด์ด๋ณด๋ฉด ํ์ฌ๋ ๋ํดํธ๋ก admin์ด๋ผ๋ urlpatterns๊ฐ ๋ฑ๋ก๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. (main/์ ์ถ๊ฐํ url์ด๋ค.)
urlpatterns๋ ์ฐ๋ฆฌ์ ์๋ฒ ์ฃผ์ ๋ค์ ํน์ ์ฃผ์๋ฅผ ๋ํด์ ํ๋ก๊ทธ๋จ์ ์คํ์ํฌ์ง ๊ฒฐ์ ํด์ฃผ๋ ์ญํ ์ ํ๋ค. ์๋ฅผ ๋ค์ด, http://127.0.0.1:8000/admin/ ์ผ๋ก ์ ์ํ๋ฉด admin.site.urls๋ฅผ ์คํํ๋ค๋ ์๋ฏธ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ฅ๊ณ ๋ ๊ธฐ๋ณธ์ผ๋ก admin ํ์ด์ง๋ฅผ ์ ๊ณตํ๋ค. http://127.0.0.1:8000/admin/ ๋ฅผ ์ ๋ ฅํด๋ณด์.
๊ทธ๋ฌ๋๊น ์๋ก์ด ํ์ด์ง๋ฅผ ๋ง๋ค๊ณ ์ถ๋ค๋ฉด, templates ํด๋์ html ํ์ผ์ ์์ฑํ๊ณ (๋๋ main.html์ ๋ง๋ค์๋ค.) ์์ฑ๋ html ํ์ผ์ html์ ์์ฑํ ํ์ urls.py ์ ๋ง๋ html ํ์ผ์ ์ฃผ์๋ฅผ ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ค.
ํ์ง๋ง urls.py๊ฐ ๋ฐ๋ก html์ ์ฐ๊ฒฐํ ์๋ ์๊ณ ์ค๊ฐ์ ์์ค ํ๋๊ฐ ๋ ํ์ํ๋ค. ๋ฐ๋ก views.py๋ผ๋ ํ์ด์ฌ ์์คํ์ผ์ด๋ค.
(APIView๋ djangorestframework๋ผ๋ ํจํค์ง๋ฅผ ์ค์นํด์ผ ์ฌ์ฉํ ์ ์๋ ๊ธฐ๋ฅ์ด๋ค.(ํ์ด์ฌ์ ๋ง์ ์ฌ๋๋ค์ด ๋ง๋ค์ด ๋์ ์ฝ๋๋ฅผ ํจํค์ง ํํ๋ก ๋ค์ด๋ก๋ ํ์ฌ์ ์ฌ์ฉํ ์ ์๋ค.) pip install djangorestframework๋ฅผ ํตํด ํจํค์ง๋ฅผ ์ค์นํ๋ ๊ณผ์ ์ ํฌ์คํ ์๋ตํ๋ค.)
์ฝ๋๋ฅผ ๋ณด๋ฉด Class Sub(APIView): ๋ผ๋ ๊ฒ์ Sub ๋ผ๋ ํด๋์ค(๊ธฐ๋ฅ)๋ฅผ ๋ง๋ค์๋๋ฐ ๊ทธ ํด๋์ค๋ APIView์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ค๋ผ๋ ์๋ฏธ์ด๋ค. APIView๋ ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์๋๋ก ๋์์ฃผ๋ ์ญํ ์ ํ๋ค. ์๋ฒ์ ํด๋ผ์ด์ธํธ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๋๋ฐ, ์ฌ๊ธฐ์๋ HTTP ํต์ ์ด๋ผ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค. ์ฐ๋ฆฌ๊ฐ ํน์ ํํ์ด์ง์ ๋ค์ด๊ฐ ๋ ์ฃผ์ ๋งจ์์ ์ ๋ HTTP๊ฐ ๋ฐ๋ก ์ด HTTP ํต์ ์ด๋ค. HTTP ํต์ ์์๋ ๋ ์ฌ๋ฌ๊ฐ์ง ์ข ๋ฅ๊ฐ ์๋๋ฐ ๊ทธ ์ค ๋ํ์ ์ผ๋ก get, post๊ฐ ์๋ค. ์ผ๋ฐ์ ์ผ๋ก ํํ์ด์ง ์กฐํ๋ get ๋ฐฉ์, ํน์ ์์ ์ ์์ฒญํ ๋๋ post๋ฐฉ์์ ์ฌ์ฉํ๋ค. ์ง๊ธ์ ํ์ด์ง๋ง ์กฐํํ๊ธฐ ๋๋ฌธ์ get์ ์ฌ์ฉํ๋๋ก ํ๋ค.
Class Sub ์์ getํจ์๋ ๋ฐ๋ก "์ด ํด๋์ค๋ get์ผ๋ก ์คํํ์ ๋"๋ฅผ ์๋ฏธํ๋ค. ๊ทธ๋ฆฌ๊ณ return render(request, "hwangstagram/main.html")์ get์ผ๋ก ์คํํ๋ฉด render๋ผ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ค๋ ์๋ฏธ์ด๋ค. render๋ฅผ ์ฌ์ฉํ๋ฉด ์ฐ๋ฆฌ๊ฐ ๋ง๋ html์ ๋ธ๋ผ์ฐ์ ๋ฅผ ํตํด ๋ณด์ฌ์ค ์ ์๋ค. ์ฆ, Sub ๋ผ๋ ํด๋์ค๋ฅผ get์ผ๋ก ์คํํ๋ฉด main.html์ ์คํํ ์ ์๋ค.
์ด์ ์ด Sub๋ฅผ urls.py์ ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ค.
sub.as_view()๋ฅผ ํตํด ์์ฑํ ์น ํ์ด์ง๋ฅผ ์ ์์ ์ผ๋ก ๋ถ๋ฌ์ฌ ์ ์๊ฒ ๋๋ค.
๐์์ฝํ์๋ฉด
- templates ํด๋ ์์ html ํ์ผ์ ๋ง๋ ๋ค.
- ์ด html ํ์ผ์ urls.py์ ์ถ๊ฐํ๋ฉด html ํ์ผ์ ์ด๋ฆ์ ์ฃผ์๋ก ๊ฐ๋ ์นํ์ด์ง์ ์ ์ํ ์ ์๋ค.
- ํ์ง๋ง ๊ทธ ์ ์ view.py์ "html์ ๋ธ๋ผ์ฐ์ ๋ฅผ ํตํด ๋ณด์ฌ์ค"๋ผ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐ ํด์ผ๋๋ค.
- ๊ทธ๋ฆฌ๊ณ views.py์์ ๋ง๋ ํด๋์ค๋ฅผ urls.py์ ์ถ๊ฐํจ์ผ๋ก์จ
<(templates/oo.html) ์ฐ๋ฆฌ๊ฐ ๋ง๋ ์นํ์ด์ง>๋ฅผ <(views.py)html์ ๋ณด์ฌ์ฃผ๋ ๊ธฐ๋ฅ>์ ํตํด <(urls.py)>์ ์ถ๊ฐํ์ฌ ๋ถ๋ฌ์ฌ ์ ์๋ค.
์ถ์ฒ :
https://learning-archive.tistory.com/117
https://butter-shower.tistory.com/49
https://hongong.hanbit.co.kr/์ฅ๊ณ django์-mvt-ํจํดmodel-view-template/
https://cholol.tistory.com/548
์ด ๊ฒ์๋ฌผ์ ๋ชจ๋ ์ ์๊ถ์ ๋ง์ด์ฎธ(mychew__)๋๊ป ์์ผ๋ฉฐ, ์ ๋ ์ค์ง ํ์ต๊ณผ ๊ธฐ๋ก์ ๋ชฉ์ ์ผ๋ก ํฌ์คํ ํ ๊ฒ์์ ์๋ ค๋๋ฆฝ๋๋ค.
์ข์ ๊ฐ์ ์ปจํ ์ธ ๋ฅผ ์ ๊ณตํด์ฃผ์ ๋ง์ด์ฎธ๋๊ป ๊ฐ์ฌ์ ๋ง์ ๋๋ฆฝ๋๋ค. (_ _)