๐Ÿ“’ [ TIL ] 2022.06.30_51์ผ์ฐจ # ์œ ํ™”์ œ์ž‘ drf (3)

๋ฌธ๋ช…์ฃผยท2022๋…„ 7์›” 1์ผ
0

[ 2022-06-30 (๋ชฉ) ์˜ค๋Š˜์˜ TIL ]

[ Today Project ]

์œ ํ™”์ œ์ž‘ ๋ฐฑ์—”๋“œ๊ฐœ๋ฐœ + ํ”„๋ก ํŠธ๊ฐœ๋ฐœ
: ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋Š” ํŒ€ํ”„๋กœ์ ํŠธ๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

[ Today Learn ]

  • ์„œ๋ฒ„์™€ ํ”„๋ก ํŠธ ์—ฐ๋™
  • ๊ฒŒ์‹œ๊ธ€ ๋ฐ ๋Œ“๊ธ€ CRUD

โœ๏ธ ๋‚ด๊ฐ€ ๋ฐฐ์šด๊ฒƒ, ์–ป์€๊ฒƒ

* Web Client(ํ”„๋ก ํŠธ์—”๋“œ) ์™€ Django Server(๋ฐฑ์—”๋“œ)์‚ฌ์ด์˜ ์†Œํ†ต๊ณผ์ •

โ“ JSON

์‹œ์Šคํ…œ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ ํฌ๋งท. ํ˜•ํƒœ๋Š” ํŒŒ์ด์ฌ์˜ ๋”•์…”๋„ˆ๋ฆฌ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์˜ค๋ธŒ์ ํŠธ์™€ ๊ฐ™๋‹ค.

HTTP ํ†ต์‹  ์‹œ html ์ „์ฒด๋ฅผ ๋ฆฌ๋กœ๋“œํ•˜๋Š” ๋Œ€์‹ , ๋ณด๋‹ค ๊ฐ€๋ฒผ์šด JSON ํฌ๋งท์œผ๋กœ body์— ๋‹ด์•„ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ์ฃผ๊ณ ๋ฐ›๋Š”๋‹ค. ๊ฐ™์€ ๋ชฉ์ ์œผ๋กœ xml, yaml ๋“ฑ์ด์žˆ๋‹ค.

โ“ Frontend(Web Client)

httpie ์„ค์น˜

brew install httpie

Request ๋ณด๋‚ด๊ธฐ/ httpie๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„๋กœ Request๊ฐ€ ๋ณด๋‚ด์ง„๋‹ค.

http -v POST 127.0.01:8000/

Start line

  • POST : ๋ฐ์ดํ„ฐ๋ฅผ ๋“ฑ๋กํ•˜๋ผ
  • 127.0.0.1 : ๋‚ด PC ์ฃผ์†Œ
  • 8000 : ์žฅ๊ณ  ์ฑ„๋„ ํฌํŠธ
  • ๋ชฉํ‘œ : target
  • ๋‚˜๋จธ์ง€ : JSON ๋ฐ์ดํ„ฐ

Headers

  • Content-Type: body๋ถ€๋ถ„์ด JSON ๋ฐ์ดํ„ฐ๋กœ ๋ณด๋‚ด์ง€๊ณ ์žˆ๋‹ค.
  • User-Agent: ๋ˆ„๊ฐ€์š”์ฒญ์„ ๋ณด๋ƒˆ๋Š”๊ฐ€, httpie/2.2.0์ด ์š”์ฒญ ๋ณด๋ƒ„

body

  • body์˜ json ๋ฐ์ดํ„ฐ๋ฅผ Pythonํ˜•์‹์œผ๋กœ ๋ฐ”๊ฟ”์„œ ๋ฐฑ์—”๋“œ์— ๋ณด๋‚ด์ค€๋‹ค.

โ“ Backend(Web Server)
์œ„์™€ ๊ฐ™์ด ์›นํด๋ผ์ด์–ธํŠธ, ์ฆ‰ ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ์š”์ฒญ์€ ์žฅ๊ณ ์˜ urls.py๋กœ ๋“ค์–ด๊ฐ€๊ฒŒ๋œ๋‹ค.

urls.py
์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ์žฅ๊ณ ๋Š” path list ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ํ™•์ธํ•˜๋ฉฐ ํƒ€๊ฒŸ๊ณผ ์ผ์น˜ํ•˜๋Š” path๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•œ ํ›„, ๋งค์นญ๋˜๋Š” ๊ฒƒ์ด ์žˆ์œผ๋ฉด request๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.

view.py
view ์—์„  ๋ฐ›์€ ์š”์ฒญ์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•  ๊ฒƒ์ธ์ง€(C.R.U.D)๊ฒฐ์ •ํ•œ ํ›„ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณตํ•ด ๋‹ค์‹œ ํ”„๋ก ํŠธ์— ์‘๋‹ตํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ํ”„๋ก ํŠธ์—์„œ ๋ฐ›์€ JSON์„ ํŒŒ์ด์ฌ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ , ๋˜ ์‘๋‹ตํ• ๋•Œ๋Š” ํŒŒ์ด์ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ JSON์œผ๋กœ ๋ณ€ํ™˜์‹œํ‚จ๋‹ค.

view์—์„œ import ํ•ด์•ผํ• ๊ฒƒ๋“ค

import json 
from django.http import JsonResponse 
from django.views import View 
from starbucks.models import Menu, Categories, Drinks
  • json : ํ”„๋ก ํŠธ์—์„œ ๋ฐ›์€ JSON๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์ด์ฌ์ด ์ฝ์„ ์ˆ˜ ์žˆ๊ฒŒ ๋”•์…”๋„ˆ๋ฆฌ๋กœ ๋ฐ”๊พผ๋‹ค
  • JsonResponse : ํŒŒ์ด์ฌ์˜ ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ JSON์œผ๋กœ ๋ฐ”๊พธ์–ด ํ”„๋ก ํŠธ์—์‘๋‹ตํ•œ๋‹ค
  • View : view์˜ ๊ธฐ๋Šฅ์ด ๋‹ด๊ธด ๋ชจ๋“ˆ
  • models: model ํด๋ž˜์Šค๋“ค์„ ๊ฐ€์ ธ์˜จ๋‹ค

view class
ํ”„๋ก ํŠธ์—์„œ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด view๋Š” get/post/put/delete ์ค‘ ๋ฌด์—‡์ธ์ง€ ํŒŒ์•…ํ•˜๊ณ  ํ•ด๋‹นํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

post(self, request)

  • self : StarbucksView์˜ ์ธ์Šคํ„ด์Šค, view๋Š” ์ƒ์†๋ฐ›์€ ๋ชจ๋“ˆ์ด๊ธฐ๋•Œ๋ฌธ์— starbucks view ์ธ์ง€ ๋‹ค๋ฅธ ์•ฑ์˜ view์ธ์ง€ ํ™•์ธ์‹œํ‚ฌ ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ์—ฌ๊ธฐ์„  starbucks์˜ post๋ฉ”์†Œ๋“œ๋ž€๊ฑธ ์•Œ๋ ค์ค€๋‹ค.

  • request : ์žฅ๊ณ ์— ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ, request๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ ๋‹ค์Œ body์—์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์–ด post๋ฉ”์†Œ๋“œ์˜ ์ธ์ž๋กœ ๋„ฃ์–ด์„œ ์ „๋‹ฌํ•ด์ค€๋‹ค

request๊ฐ์ฒด๋Š” JSON์ด๋‹ค. ๋”ฐ๋ผ์„œ ํŒŒ์ด์ฌ์—์„œ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๋Š” ๋”•์…”๋„ˆ๋ฆฌ๋กœ ๋ฐ”๊พธ์–ด์ฃผ์–ด์•ผํ•˜๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ json๋ชจ๋“ˆ์˜ loads()๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•œ๋‹ค.

ํ”„๋ก ํŠธ์˜ ๋ชจ๋“  ์š”์ฒญ์€ request๋ผ๋Š” ํ•˜๋‚˜์˜ ๊ฐ์ฒด์— ๋‹ด๊ฒจ view๋กœ ์ „๋‹ฌ๋˜๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ request ๊ฐ์ฒด์•ˆ์—๋Š” startline, headers, body ๊ฐ€ ๋ชจ๋‘ ๋“ค์–ด์žˆ๋‹ค.

body ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ๋• json.load(request.body)๋กœ ํŒŒ์ด์ฌ ๋”•์…”๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋กœ ๋งŒ๋“ค์–ด์ค€ ๋‹ค์Œ, request ๊ฐ์ฒด์—์„œ ๊บผ๋‚ด์™€ ์‚ฌ์šฉํ•˜๋Šฅํ•˜๋‹ค.

๐ŸŒฑ ๋Š๋‚€ ์ 

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

๐ŸŽ ์ž์„ธํ•œ ์ฝ”๋“œ๋Š” Moonmoo ์— ๊ฒŒ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค

profile
ํ•˜๋ฃจ ํ•œ๊ฑธ์Œ์”ฉ ๊พธ์ค€ํžˆ ๋‚˜์•„๊ฐ€๋Š” ๊ฐœ๋ฐœ์ž๐Ÿ™†โ€โ™€๏ธ https://github.com/Moonmooj

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

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด