๋๋ฌ๊ฐ์ ํ๋ณตํ ๊ณ ๋ช
์ด ์ฌ์ง์ผ๋ก ๊ณผ์ ์์ํ๊ธฐ~~ ์ธ๊ฐ์ด๋ ๊ฐ๋ ๋๋ฌ๊ฐ๋๊ฒ ์ต์ค๊ตฌ๋...
์ด๋ฒ ๊ณผ์ ๋ ์ง๋ 7๋ฒ์งธ ํ๋๊ณผ ์ด์ด์ ์งํ๋๋ค.
์ฐ๋ฆฌ๊ฐ ์๋ก์ด Todo๋ฅผ ์ ๋ก๋ ํ๋ ค๋ฉด ๊ด๋ฆฌ์ ํ์ด์ง์์ ๋ฑ๋กํ๋ ๋ฐฉ๋ฒ๋ ์์ง๋ง ์ด ๋ฐฉ๋ฒ์ ๋นํจ์จ์ ์ด๋ค. ๊ด๋ฆฌ์ ๊ณ์ ์ ๋ชจ๋ฅด๋ ์ฌ๋์ ์ ๋ ฅํ ์ ์๋ค๋ ๋จ์ ์ด ์์ด ์์ฑ ๋ฒํผ๋ง ํด๋ฆญํ๊ณ ์ฐ๋ฆฌ๊ฐ ์ค์ ํด๋์ ์์์ ๋ง๊ฒ ์์ฑ๋ง ํ๋ฉด ๋๊ตฌ๋ ์ฝ๊ฒ Todo๋ฅผ ์ ๋ก๋ ํ ์ ์๋๋ก ํผ์ ์ด์ฉํ๋ค. ์์ฑ์ CRUD ์ค C์ ํด๋นํ๋ค.
๋จผ์ todo์ฑ ์์ forms.py ํ์ผ์ ์์ฑํ๊ณ ์ฅ๊ณ ์ ModelForm์ ์์๋ฐ๋ ํด๋์ค๋ฅผ ๋ง๋ ๋ค.
MTV ํจํด์ ๋ฐ๋ผ T์ ํด๋นํ๋ ํ ํ๋ฆฟ์ ๋จผ์ ๋ง๋ ๋ค. ํผ์ POST ๋ฐฉ์์ด๋ฏ๋ก CSRF ๊ณต๊ฒฉ์ ๋ฐฉ์งํ๊ธฐ ์ํด csrf_token์ด ํ์๋ก ๋ค์ด๊ฐ์ผํ๋ค. ๊ทธ๋๊ณ form.as_pํํ๋ก ์์ฑํด ํ ํ๋ ๋น pํ๊ทธ๋ก ์ถ๋ ฅ๋๋ ํ ํ๋ฆฟ์ ๋ง๋ ๋ค.
todo/templates/todo/todo_post.html์ ์์ฑํ๊ณ ์ฝ๋๋ฅผ ์
๋ ฅํ๋ค.
MTV ํจํด์ ๋ฐ๋ผ V์ ํด๋นํ๋ ๋ทฐ๋ฅผ ๋ง๋ ๋ค. ์์ฑ์ ์ํด form method๊ฐ POST ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์์ด์ผํ๋ค.
๋ทฐ๋ฅผ ์์ฑํ์ผ๋ url์ ์ฐ๊ฒฐํ๋ค. ๋จผ์ todo/urls.py ํ์ผ์ path๋ฅผ ์ถ๊ฐํ๋ค.
MTV ํจํด์ ๋ฐ๋ผ T์ ํด๋นํ๋ ํ
ํ๋ฆฟ์ ๋จผ์ ์์ฑํ๋ค.
todo/templates/todo/todo_update.html์ ์์ฑํ๊ณ ์ฝ๋๋ฅผ ์
๋ ฅํ๋ค.
์ฝ๋๊ฐ todo_post.html๊ณผ ๊ฑฐ์ ์ ์ฌํ๋ค.
MTV ํจํด์ ๋ฐ๋ผ V์ ํด๋นํ๋ ๋ทฐ๋ฅผ ์์ฑํ๋ค. ์์ฑ ๋ทฐ์๋ ๋ค๋ฅด๊ฒ ๋ง๋ค์๋ Todo๋ฅผ ํด๋ฆญํ์ ๋ ๊ธฐ์กด์ ์
๋ ฅํ๋ ๋ฐ์ดํฐ๊ฐ ๊ฐ์ด ์ ๋ฌ๋์ด์ผ ํ๋ค.
instance ๋ณ์๋ก ์์ ๋์์ด ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ ํ๊ณ , ํผ์ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ ๋ instance๋ฅผ ํตํด ์ ๋ฌํ๋ค.
๋ทฐ๋ฅผ ์์ฑํ์ผ๋ url์ ์ฐ๊ฒฐํ๋ค. todo/urls.py์ edit path๋ฅผ ์ถ๊ฐํ๋ค.
์ฐ๋ฆฌ๋ ๋ชฉ๋กํ๋ฉด์์ ์๋ฃ ๋ฒํผ์ ๋๋ฅด๋ฉด ์์ ์๋ฃํ Todo ๋ชฉ๋ก์ผ๋ก ๋์ด๊ฐ๋๋ก ๊ตฌํํ๋ ค๊ณ ํ๋ค. ์ฆ, ์๋ฃ ๋ฒํผ์ ๋๋ฅด๋ฉด Todo ๋ชจ๋ธ์ ์์ฑํ ๋ ์ ์ธํ ํ๋์ธ complete๋ฅผ True๋ก ์ค์ ํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํด์ผํ๋ค.
MTV ํจํด์ ๋ฐ๋ผ T์ ํด๋นํ๋ ํ
ํ๋ฆฟ์ ์์ฑํ๋ค. Todo ๋ชฉ๋ก ํ์ด์ง์ ์ ์ฌํ๋ค.
todo/templates/todo/done_list.html ํ์ผ์ ์์ฑํด ์ฝ๋๋ฅผ ์
๋ ฅํ๋ค.
MTV ํจํด์ ๋ฐ๋ผ V์ ํด๋นํ๋ ๋ทฐ๋ฅผ ์์ฑํ๋ค. ์ฌ๊ธฐ์ ์ฐ๋ ๋ทฐ๋ฅผ 2๊ฐ ๋ง๋ค์ด์ผ ํ๋๋ฐ ์๋ฃ๋ ๋ชฉ๋ก์ ๋ณด์ฌ์ฃผ๋ ๊ธฐ๋ฅ๊ณผ Todo๋ฅผ ์๋ฃ๋ก ๋ฐ๊ฟ์ฃผ๋ ๊ธฐ๋ฅ์ด๋ค.
๋จผ์ ์๋ฃ๋ ๋ชฉ๋ก์ ๋ณด์ฌ์ฃผ๋ ๋ทฐ๋ฅผ ์์ฑํ๋ค.
๋ทฐ๋ฅผ ์์ฑํ์ผ๋ ์๋ฃ url์ ์ฐ๊ฒฐํ๋ค. todo/urls.py ํ์ผ์ done path๋ฅผ ์ถ๊ฐํ๋ค.
๋ชฉ๋กํ๋ฉด์์ ์๋ฃ๋ฅผ ํด๋ฆญํ๋ฉด url ํ
ํ๋ฆฟํ๊ทธ์ ์ํด name='todo_done'์ด๊ณ ๋ช๋ฒ์งธ pk์ธ์ง ๊ตฌ๋ถํด path๋ฅผ ์ฐพ์ ์ ์๋์ด์๋ ๋ทฐ๋ฅผ ์คํํ๋ค.
๋ชฉ๋กํ๋ฉด์์ ์๋ฃํ Todo ๋ชฉ๋ก์ ํด๋ฆญํ๋ฉด url ํ
ํ๋ฆฟ ํ๊ทธ์ ์ํด name='done_list'์ธ path๋ฅผ urls.py์์ ์ฐพ์ ํด๋น ๊ฒฝ๋ก์ ์ง์ ํ ๋ทฐ๋ฅผ ์คํํ๋ค.
์ฌ๊ธฐ๊น์ง๊ฐ TodoList ์ค์ต์ด๋ค!!!
์ ๋ง ๊ธฐ๋ณธ์ ์ธ ์ค์ต์ด์ง๋ง ์ฒ์ ๋ฐฐ์ฐ๋ ์ฌ๋์ ์ ์ฅ์์๋ ์ด๋ ต๊ฒ ๋๊ปด์ง ๊ฒ ๊ฐ๋ค. ๊ทธ๋๋ ํด์ผ์ง ์ด์ฉ๊ฒ ์ด.......
์ด์ ๋ด๊ฐ ์งํํ๊ธฐ ์ ๋ง ๋๋ ค์ ๋ API์ Serializer........ ๋จธ๋ฆฌ๋ก๋ ์ดํดํ์ง๋ง ์ค๋ช ํ๊ธฐ ๋ฒ ์ฐจ๊ณ ..... ์.. ์์๋ฅผ ๋ค์ด๋ ์ด๊ฒ ๋ง๋ ์ถ์... ์ฐธ.......... ๋๋ ๋ ๊ณต๋ถํด์ผ์ง...
API๋ Application Programming Interface์ ์ฝ์๋ก ๋ ์ํํธ์จ์ด ๊ตฌ์ฑ์์๊ฐ ์๋ก ํต์ ํ ์ ์๊ฒ ํ๋ ๋ฉ์ปค๋์ฆ์ ๋งํ๋ค. ์ฆ, ์ด์์ฒด์ ์ ์์ฉ ํ๋ก๊ทธ๋จ ์ฌ์ด์ ํต์ ์ ์ฌ์ฉ๋๋ ์ธ์ด๋ ๋ฉ์์ง ํ์์ ๋งํ๋๋ฐ 2๊ฐ์ง ์์๋ฅผ ๋ค์ด ์ดํดํด๋ณด๋๋ก ํ์.
์ค๊ฐ์์ ์์ชฝ์ ์๋ฒ๋ฅผ ์ฐ๊ฒฐํด์ฃผ๋ ์ญํ ์ ๋งํ๋ค.
API ์ํคํ ์ฒ๋ ์ผ๋ฐ์ ์ผ๋ก ํด๋ผ์ด์ธํธ์ ์๋ฒ ์ธก๋ฉด์์ ์ค๋ช ๋๋ค.
ํด๋ผ์ด์ธํธ = ๊ณ ๊ฐ, ๋ ์จ ์ดํ
์๋ฒ = ์ฃผ๋ฐฉ, ๊ธฐ์์ฒญ ๋ ์จ ๋ฐ์ดํฐ๋ฒ ์ด์ค
์ด๋ ๊ฒ ์ดํดํ ์์๋ค.
API๋ ์ด 4๊ฐ์ง ๋ฐฉ์์ผ๋ก ์๋ํ๋๋ฐ ๊ฐ๋จํ๊ฒ ์ดํด๋ณด๋๋ก ํ๊ฒ ๋ค.
๋จ์ ๊ฐ์ฒด ์ ๊ทผ ํ๋กํ ์ฝ์ ์ฌ์ฉํ๋ค.
์๊ฒฉ ํ๋ก์์ ํธ์ถ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
JSON ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ์ต์ ์น API ๊ฐ๋ฐ์ด๋ค.
Representational State Transfer์ ์ฝ์๋ก ์ค๋๋ ์น์์ ๋ณผ ์ ์๋ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๊ณ ์๋ ์ ์ฐํ API์ด์ ๊ฐ์ฅ ๋ํ์ ์ธ ๋ฐฉ์์ด๋ค.
๋๊ตฌ๋ ์ธ ์ ์๋๋ก ๊ณต๊ฐ๋ API๋ค.
๋ํ์ ์ธ ์์๋ก ์ ๋ถ์ ๊ณต๊ณต ๋ฐ์ดํฐ ํฌํธ (www.data.go.kr)์ ํตํด ๊ตญ๊ฐ ๊ธฐ๊ด์ด ๋ณด์ ํ ์๋ง์ ๋ฐ์ดํฐ๋ฅผ API ํํ๋ก ๋ฌด๋ฃ๋ก ๊ณต๊ฐํ๊ณ ์๋ค.
๋ ๋ค๋ฅธ ์์๋ก ์ฝ๋ก๋ ํ์ง์, ์์ธ์ ๋ฐ๋ฆ์ด ์ด์ฉ ํํฉ ๋ฑ์ด ์๊ณ , ์นด์นด์ค, ๋ค์ด๋ฒ, ๊ตฌ๊ธ์์๋ ๋ฌด๋ฃ๋ก Open API๋ฅผ ์ ๊ณตํ๊ณ ์๋ค.
API์ ์ ํ์ ์ด 4๊ฐ์ง๊ฐ ์๋ค.
๊ธฐ์ ๋ด๋ถ์ ์์ผ๋ฉฐ ๋น์ฆ๋์ค ๋ด์์ ์์คํ ๊ณผ ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ฒฐํ๋๋ฐ์๋ง ์ฌ์ฉํ๋ค.
์๋น์ค๊ฐ ์ด๋ป๊ฒ ๊ตฌํ๋์๋์ง ๋ชฐ๋ผ๋ ์ฐ๋ฆฌ๋ ๊ทธ์ ๊ทธ๋๋ก ๊ฐ์ ธ๋ค๊ฐ ์ฌ์ฉํ ์ ์๋ค.
๋งค๋ฒ ์๋ก์ด ๊ฐ๋ฐ์ ํ ํ์ ์ ์ด ์ด๋ฏธ ๋ง๋ค์ด์ง ๊ธฐ๋ฅ์ ๊ทธ๋๋ก ๊ฐ์ ธ๋ค ์ธ ์ ์๋ค.
Django REST Framework์ ์ฝ์๋ก Django๋ฅผ ๊ธฐ๋ฐ์ผ๋ก REST API ์๋ฒ๋ฅผ ๋ง๋ค๊ธฐ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค.
์ฌ์ ์ ์ ์๋ ์ง๋ ฌํ
๋ผ๊ณ ๋ถ๋ฆฌ๋ฉฐ Django ํ๋ก์ ํธ์์ ๋ง๋ ๋ชจ๋ธ๋ก๋ถํฐ ๋ฝ์ ์ฟผ๋ฆฌ์
์ธ ๋ชจ๋ธ ์ธ์คํด์ค๋ฅผ JSON ํ์
์ผ๋ก ๋ฐ๊พธ๋ ์์
์ด๋ค.
ํ์ด์ฌ ๋ฐ์ดํฐ ๊ฐ์ฒด๋ฅผ ๋ฌธ์์ด(JSON)๋ก ๋ณํํ๋ ์์ ์ผ ์ง๋ ฌํ๋ผ๊ณ ํ๋ค.
ํด๋ผ์ด์ธํธ์ ์๋ฒ API ๊ฐ ๋ฐ์ดํฐ ์์์ ๋ง์ถฐ์ฃผ๋ ๋ณํ๊ธฐ๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
์ด๋ฏธ์ง๋ฅผ ์ฐธ๊ณ ํด์ ๋ณด์๋ฉด ์ผ์ชฝ์ ๊ธฐ์กด์ ์ฐ๋ฆฌ๊ฐ ์ค์ตํ๋ ๋ด์ฉ์ด๊ณ ์ค๋ฅธ์ชฝ์ ์ดํ์ ์ค์ตํ ๋ด์ฉ์ด๋ค.
๋ชจ๋ธ๋ก๋ถํฐ Field๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋๊ฐ์ง๋ง ๊ธฐ์กด์ ์ฐ๋ฆฌ๋ HTML Form์ ๋ง๋ค์ด ํผ์ ์ด์ฉํด ํผ์ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์งํํ๋๋ฐ Serializer๋ฅผ ์ด์ฉํ๋ฉด JSON ๊ฐ์ ๋ฌธ์์ด์ ์ด์ํด์ ๊ฐ๋จํ๊ฒ ํผ์ ์ ํจ์ฑ์ ๊ฒ์ฌํ ์ ์๋ค๋ ๋ป์ด๋ค.
์ฐ๋ฆฌ๋ startapp ๋ช ๋ น์ผ๋ก ๊ธฐ๋ฅ์ ๋ด๋นํ ์ฑ์ ๋ง๋ค๊ฒ ๋๋๋ฐ ์ด๋ ๋ง๋ค์ด์ง ์ฑ ํด๋ ์์ serializers.py ํ์ผ์ ์์ฑํ๊ณ ์์ ๋ด์ฉ์ ์์ฑํ๋ฉด ๋๋ค. ์ฐ๋ฆฌ๊ฐ models.py์ ์ ์ํ ๋ชจ๋ธ์ ์ด๋ค ํ๋๋ฅผ JSON์ ๋ฃ์ด์ค์ง ์ฌ๊ธฐ์ ๋ค์ํ๋ฒ ์ ์ธํด์ผํ๋ค.
Function Based View์ ์ฝ์๋ก @api_view
์ ๊ฐ์ด ๋ฐ์ฝ๋ ์ดํฐ ํํ๋ก API View๋ฅผ ์ฌ์ฉํ๋ค.
์ฌ๊ธฐ์ ๋ฐ์ฝ๋ ์ดํฐ๋ ํจ์๋ฅผ ๊พธ๋ฏธ๋ ์ญํ ๋ก @ ํ์์ ํจ๊ผ ์์ฑ๋๋ ์ฝ๋๋ค.
ํด๋น ํจ์์ ๋ํ ์คํ์ผ์ ํ์ํด์ฃผ๋ ํ๊ธฐ๋ฒ์ด๋ค.
์๋ฅผ ๋ค๋ฉด @api_view(['GET']) ์ GET ์์ฒญ์ ์ฒ๋ฆฌํ๊ฒ ๋ง๋๋ ๋ฐ์ฝ๋ ์ดํฐ์ด๋ค.
from rest_framework import viewsets, permissions, generics, status
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework.decorators import api_view
ํจ์ํ ๋ทฐ๋ฅผ API View์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ด ๋ฏธ๋ฆฌ ์ํฌํธ ๋์ด์์ด์ผํ๋ค.
Class Based View์ ์ฝ์๋ก APIView ํด๋์ค๋ฅผ ์์๋ฐ๋ ํํ๋ก ์์ฑํ๋ค.
๊ธฐ๋ฅ์ ์ธ ๋ถ๋ถ์์ ํฐ ์ฐจ์ด๋ ์์ง๋ง ํด๋์ค ๋ด์ get๊ณผ post๋ฅผ ๋ฐ๋ก ์ ์ํ๋ฏ๋ก FBV์ ๋ฌ๋ฆฌ ๋ฐ์ฝ๋ ์ดํฐ๊ฐ ํ์์๋ค.
์์ฒญ์ด GET์ธ์ง POST์ธ์ง ์กฐ๊ฑด๋ฌธ์ผ๋ก ๋ฐ์ ธ๋ณผ ํ์๊ฐ ์๋ค.
์ฐ๋ฆฌ๋ ์ํฉ์ ๋ฐ๋ผ ์ด๋ค ๋ทฐ๊ฐ ๋ ๊ด์ฐฎ์์ง ํ๋จํด์ผํ๊ธฐ ๋๋ฌธ์ ๋ ๋ฐฉ๋ฒ ๋ชจ๋ ๋ค ์๊ณ ์์ด์ผ ํ๋ค.
from rest_framework import viewsets, permissions, generics, status
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework.decorators import api_view
์์์ APIView ํด๋์ค๋ฅผ ๋ฏธ๋ฆฌ ์ํฌํธ ํด ์ด ํด๋์ค๋ฅผ ์์๋ฐ๋ ํํ๋ก ์์ฑํ๋ค.
์ฑ ์ ๋ณด๋ฅผ ์ ๋ ฅํด์ BookAPI๋ฅผ ๋ง๋ค์ด๋ณด๋ ์ค์ต์ ํ๋ ค๊ณ ํ๋ค.
1) ๊ฐ์ํ๊ฒฝ์ ํ์ฑํํ๊ณ ํ์ด์ฌ์ ๋ฒ์ ์ ํ์ธํ๋ค.
python --version
2) ํ์ฑํ๋ ๊ฐ์ํ๊ฒฝ์์ Django์ DRF ํจํค์ง๋ฅผ ์ค์นํ๋ค.
pip install django djangorestframework
3) ํ์ฌ์์น์ ํ๋ก์ ํธ๋ฅผ ์์ฑํ๋ค.
django-admin startproject bookInfo .
๊ธฐ๋ฅ์ ๋ด๋นํ ์ฑ์ ์์ฑํ๋ค.
python manage.py startapp book
์์ฑํ ์ฑ์ ํ๋ก์ ํธ ํด๋์ settings.py์ ๋ฑ๋กํ๋ค.
INSTALLED_APPS = [] ๋ถ๋ถ์ 'rest_framework'์ 'book'์ ์ถ๊ฐํ๋ค.
๋ณ๊ฒฝ์ฌํญ์ DB์ ๋ฐ์ํ๋ค.
python manage.py migrate
python manage.py createsuperuser
๋ชจ๋ Djano ํ๋ก์ ํธ ๊ฐ๋ฐ์ ์์์ ํญ์ ๋ชจ๋ธ์ด๋ค. book/models.py ํ์ผ์ ๋ชจ๋ธ์ ์์ฑํ๋ค.
bid ํด๋์ค ๋ณ์๋ primary_key=True๋ก ์ค์ ํ๋๋ฐ bid๋ณ์๋ฅผ ๊ธฐ๋ณธํค๋ก ์ค์ ํ๋ค๋ ์๋ฏธ๋ค. ๊ธฐ๋ณธํค๋ ํ๋ ์ค์์ ์ค๋ณต๊ฐ์ ๊ฐ์ง ์ ์๊ณ ์ด ๊ฐ์ฒด๋ฅผ ๋ํ๋ก ์๋ณํ ์ ์๋ ํค๋ฅผ ๋งํ๋ค.
๋๋จธ์ง ํ๋๋ค์ ๊ทธ ์ ์๋ ์์ฑํ๋ ๋ถ๋ถ์ด๊ธฐ๋๋ฌธ์ ๋ณ๋ค๋ฅธ ์ค๋ช
์ด ํ์์์ผ๋ฏ๋ก ์๋ตํ๋ค.
์ฌ๊ธฐ๊น์ง๊ฐ ์ง๋์๊ฐ์ ์งํํ ์คํฐ๋ ๋ด์ฉ์ด๋ค. ๋๋ ์์ง๋ ๋๋ฌด ํท๊ฐ๋ฆฌ๊ณ ์ด๋ ค์ด๊ฒ ๋ง์๋ฐ ๋ถ์ ๋ถ๋ค์ด ์ดํด๋ฅผ ํ์ จ์๊น..... ๋ ๊ณต๋ถํด์ผ๊ฒ ๋ค.. ์ค์ํ๊ณ ์ ์ฉํ ๋ถ๋ถ์ธ๋งํผ ๋ ๋ง์ ๋ ธ๋ ฅ์ด ํ์ํ๋ค..!!!! ๋งจ๋ ๋ฐค์์ ๊ฐ์์๋ฃ ๋ง๋ค๊ณ ๊ณต๋ถํ๊ณ ์๋๋ฐ ์์ง ๋ถ์กฑํ ๊ฒ ๊ฐ๋ค...... ์ด์ฌํ ํด์ผ์ง...๐ค๐ค