[Django] DRF - view of DRF

๊น€์˜ํ™˜ยท2021๋…„ 3์›” 15์ผ
2

django rest framework

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

๐Ÿง view of DRF

DRF์—๋Š” view๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์—ฌ๋ ค๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž.

1. APIView

APIView๋ฅผ ์ƒ์†ํ•ด์„œ ์งœ๋Š” ํ˜•ํƒœ์™€ ๋งŽ์ด ๋น„์Šทํ•˜๋‹ค๊ณ  ์ƒ๊ฐ๋œ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด class productReview(request): ๋งŒ๋“ค์–ด์„œ get post delete patch rest method ๋ฅผ ์ด์šฉํ•ด์„œ ํด๋ž˜์Šค์•ˆ์˜ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•ด์„œ ๊ตฌํ˜„ํ•œ ๋ฐฉ์‹์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด๋œ๋‹ค. ๊ตฌ์„ฑ์€ Pure Django๋ฅผ ํ†ตํ•ด ๊ตฌ์„ฑํ–ˆ๋˜ view์—์„œ serializer๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ ์ฒ˜๋ฆฌํ•ด์ค€๊ฒƒ๋ฟ ๋™์ผํ•˜๋‹ค.

ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ๋ทฐ์ด๋“  ํ•จ์ˆ˜ ๊ธฐ๋ฐ˜ ๋ทฐ์ด๋“  ๋ทฐ๊ฐ€ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์€ ํ•จ์ˆ˜์ด๋‹ค. ์šฐ๋ฆฌ๊ฐ€ View.as_view() ํด๋ž˜์Šค ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ URL ์ •์˜์— ๋ทฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์ด๋Š” view๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค. as_veiw() ๋ฉ”์†Œ๋“œ๊ฐ€ ์–ด๋–ป๊ฒŒ ์งœ์—ฌ ์žˆ๋Š”์ง€๋ณด๋ฉด

APIView Wrapping

  • ํ•จ์ˆ˜ํ˜• view๋ฅผ ์œ„ํ•œ @api_view : FBV(ํ•จ์ˆ˜๊ธฐ๋ฐ˜๋ทฐ)
  • ํด๋ž˜์Šคํ˜• ๋ทฐ๋ฅผ ์œ„ํ•œ APIView : CBV(ํด๋ž˜์Šค๊ธฐ๋ฐ˜๋ทฐ)

1-1. APIView : class based view

CBV ์ค‘ ํ•˜๋‚˜์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•˜๋‚˜์˜ URL ์— ๋Œ€ํ•ด์„œ๋งŒ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • /user/ ์— ๋Œ€ํ•œ CBV
    • get : ์ „์ฒด user ์ •๋ณด ์กฐํšŒ
    • post : ์ƒˆ๋กœ์šด user ์ƒ์„ฑ

  • /user/<int:pk>/ ์— ๋Œ€ํ•œ CBV
    • get : pk๋ฒˆ user ์ •๋ณด ์กฐํšŒ
    • patch : pk๋ฒˆ user ์ •๋ณด ๋ณ€๊ฒฝ
    • delete : pk๋ฒˆ user ์ •๋ณด ์‚ญ์ œ

      view.py
      urls.py ๊ฐ ํด๋ž˜์Šค์— ๋Œ€ํ•ด as_view()๋กœ ๋ผ์šฐํŒ…

1-2. @api_view ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ : function based view

method๋“ค์„ ๋ฌถ์–ด์„œ ์“ฐ๋Š” ๋ฒ•์„ ๋ชฐ๋ผ์„œ ์ฒ˜์Œ์—๋Š” ๋”ฐ๋กœ ๊ตฌํ˜„ํ•˜๋‹ค๋ณด๋‹ˆ ๊ทธ๋ƒฅ pure django์—์„œ ํ•˜๋Š”๊ฑฐ๋ž‘ ๋ฌด์—‡์ด ๋‹ค๋ฅธ๊ฐ€๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์ง€๋งŒ ์•Œ๊ณ ๋ณด๋‹ˆ ๊ธฐ๋Šฅ์ด ํ•จ์ˆ˜๋‹จ์œ„๋กœ ๊ธฐ๋Šฅ์ด ๋น„์Šทํ•œ ๊ฒƒ๋“ค๋ผ๋ฆฌ ๋ฌถ์–ด์„œ ์‚ฌ์šฉํ•˜๊ณ , cbv ์™€ class๊ธฐ๋ฐ˜์ด๋‚˜, function๊ธฐ๋ฐ˜์ด๋‚˜ ์ฐจ์ด ์ผ๋ฟ ๊ตฌ์กฐ๋Š” ๋น„์Šทํ–ˆ๋‹ค.

๐Ÿ˜ก ์ด๋ ‡๊ฒŒ ํ•œํŽ˜์ด์ง€์—์„œ method๋งŒ ๋‹ค๋ฅด๋‹ค๋ฉด ํ•œ๋ฒˆ์— ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค. ์•„๋ž˜ ๋ฐฉ์‹์€ ๋น„ํšจ์œจ์ ์ธ ๋ฐฉ์‹์ด๋‹ค.
userDetail ๋กœ ๋ฌถ์„์ˆ˜ ์žˆ๋Š” method๋ฅผ ๊ฐ™์ด ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค.

view.pyurls.py๊ฒฐ๊ณผํ™”๋ฉด

2. Mixins ์ƒ์†

APIView๋Š” ๊ฐ request method ๋งˆ๋‹ค ์ง์ ‘ serializer ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ์–ด์•ผ๋˜๋Š”๋ฐ, ์ด๋Ÿฌํ•œ ๋ถ€๋ถ„๋“ค์ด ๋งŽ์ด ์‚ฌ์šฉ๋˜๋ฉด ์—ฌ๋Ÿฌ serializer์— ๋Œ€ํ•œ ์ค‘์กฑ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ rest_framework.mixins ์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ๋“ค์ด ๋ฏธ๋ฆฌ ๊ตฌํ˜„์ด ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • CreateModelMixin
  • ListModelMixin
  • RetrieveModelMixin
  • UpdateModelMixin
  • DestroyModelMixin

queryset ๊ณผ serializer_class ๋ฅผ ์ง€์ •ํ•ด์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ๋‚˜๋จธ์ง€๋Š” ์ƒ์†๋ฐ›์€ Mixin ๊ณผ ์—ฐ๊ฒฐํ•ด์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

3. generics APIView

Mixin ์„ ์ƒ์†ํ•จ์œผ๋กœ์„œ ๋ฐ˜๋ณต๋˜๋Š” ๋‚ด์šฉ์„ ๋งŽ์ด ์ค„์ผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ์ƒ์†ํ•ด์•ผ ํ•˜๋‹ค๋ณด๋‹ˆ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง‘๋‹ˆ๋‹ค. ๋‹คํ–‰ํžˆ๋„ rest_framework ์—์„œ๋Š” ์ €๋“ค์„ ์ƒ์†ํ•œ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•ด๋†จ์Šต๋‹ˆ๋‹ค.

  • generics.CreateAPIView : ์ƒ์„ฑ
  • generics.ListAPIView : ๋ชฉ๋ก
  • generics.RetrieveAPIView : ์กฐํšŒ
  • generics.DestroyAPIView : ์‚ญ์ œ
  • generics.UpdateAPIView : ์ˆ˜์ •
  • generics.RetrieveUpdateAPIView : ์กฐํšŒ/์ˆ˜์ •
  • generics.RetrieveDestroyAPIView : ์กฐํšŒ/์‚ญ์ œ
  • generics.ListCreateAPIView : ๋ชฉ๋ก/์ƒ์„ฑ
  • generics.RetrieveUpdateDestroyAPIView : ์กฐํšŒ/์ˆ˜์ •/์‚ญ์ œ

view.py
generics.py

4.ViewSet

์•„์ง queryset ๊ณผ serializer_class๊ฐ€ ๊ณตํ†ต์ ์ธ๋ฐ๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋”ฐ๋กœ ๊ธฐ์žฌํ•ด์ฃผ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š”๊ฒŒ ๋ฐ”๋กœ ViewSet ์ž…๋‹ˆ๋‹ค
ViewSet์€ CBV ๊ฐ€ ์•„๋‹Œ ํ—ฌํผํด๋ž˜์Šค๋กœ ๋‘ ๊ฐ€์ง€ ์ข…๋ฅ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

view.pyurls.py

  • ์ผ๋ฐ˜์ ์ธ CBV ์™€ ๋‹ค๋ฅด๊ฒŒ as_view๋ฅผ ํ†ตํ•ด์„œ ๋ทฐ๋ฅผ ์—ฐ๊ฒฐํ•˜์ง€ ์•Š๊ณ , router๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์—ฐ๊ฒฐํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • ViewSet์€ ํ•˜๋‚˜์˜ ๋ทฐ๊ฐ€ ์•„๋‹Œ set, ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ทฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ํ™•์žฅ๋œ CBV์ž…๋‹ˆ๋‹ค.

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