๐Ÿฆ๋ฉ‹์Ÿ์ด ์‚ฌ์ž์ฒ˜๋Ÿผ 11๊ธฐ/๋ฐฑ์—”๋“œ๋ฅผ ์œ„ํ•œ Django Rest Framework

Chapter 4 - 4.2 Django REST Framework ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ์‚ดํŽด๋ณด๊ธฐ

1son 2023. 4. 13. 19:12

DRF๋กœ ๋งŒ๋“  ํ”„๋กœ์ ํŠธ์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 

 

4.2.1 helloAPI ๋งŒ๋“ค์–ด๋ณด๊ธฐ

์ด์ „ ์žฅ๊ณ  ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•  ๋•Œ์—๋Š” ๋ชจ๋ธ๋ถ€ํ„ฐ ์ž‘์„ฑํ–ˆ๋Š”๋ฐ, ์ด๋ฒˆ ์˜ˆ์ œ์—๋Š” ๋ชจ๋ธ์ด ์—†์–ด ๋ฐ”๋กœ ๋ทฐ๋กœ ๋„˜์–ด๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค. 

 

๋ทฐ

 

์˜ˆ์ „์— ๋งŒ๋“ค์—ˆ๋˜ ๋ทฐ์˜ ํ•จ์ˆ˜์™€ ๋น„์Šทํ•œ๋“ฏ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. 

 

์ œ์ผ ๋‚ฏ์„ ๊ฒƒ์€

@api_view(['GET'])

์ž…๋‹ˆ๋‹ค. 

์ด๋ ‡๊ฒŒ @ํ‘œ์‹œ์™€ ํ•จ๊ป˜ ์ž‘์„ฑ๋˜์–ด ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. 

๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” ํ•จ์ˆ˜๋ฅผ ๊พธ๋ฏธ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. 

-> ํ•ด๋‹น ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์„ฑ๊ฒฉ(์Šคํƒ€์ผ)์„ ํ‘œ์‹œํ•ด์ฃผ๋Š” ํ‘œ๊ธฐ๋ฒ•

 

HelloAPI๋ผ๋Š” ํ•จ์ˆ˜๊ฐ€ GET์š”์ฒญ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” API๋ผ๋Š” ๊ฒƒ์„ 

@api_view๋ผ๋Š” ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ๋‚˜ํƒ€๋‚ธ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. 

 

์š”์ฒญ์ด ์–ด๋–ค ํƒ€์ž…์ธ์ง€ ์•Œ์•„๋‚ด๊ธฐ ์œ„ํ•ด์„œ๋Š” request.method, ๋ฐ์ดํ„ฐ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด์„œ๋Š” request.data๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

๊ทธ๋ฆฌ๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•  ๋•Œ์—๋„ Response๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ์ด๋Š” DRF์˜ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. 

 

 

URL

๋ทฐ๋ฅผ ๋งˆ์ณค๋‹ค๋ฉด? URL์„ ์„ค์ •ํ•  ์ฐจ๋ก€!

myweb/urls.py๋Š” ์œ„์™€ ๊ฐ™์ด ์ž‘์„ฑํ•˜๊ณ , 

 

example์—๋Š” urls.py๋ฅผ ๋งŒ๋“ค์–ด ์œ„์˜ ๋‚ด์šฉ์„ ์ ์–ด์ค๋‹ˆ๋‹ค.

 

์ด์ œ ์ž‘์—…์ด ๋ชจ๋‘ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!

runserver๋ฅผ ํ†ตํ•ด ์‹คํ–‰ํ•˜์—ฌ ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค.

 

 

์‹คํ–‰ํ•ด๋ณด๋‹ˆ, 

page not found ์—๋Ÿฌ๊ฐ€ ๋‚˜์˜ค๋ฉด์„œ ์šฐ๋ฆฌ๊ฐ€ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์ฃผ์†Œ๋ฅผ ์•Œ๋ ค์ฃผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. 

example์ด๋ผ๋Š” ์ฃผ์†Œ๊ฐ€ ์žˆ๋„ค์š”, 127.0.0.1:8000/example/๋กœ ์ด๋™ํ•ด ๋ด…์‹œ๋‹ค. 

 

์Œ,, ๋ญ”๊ฐ€ ๋˜‘๊ฐ™์€ ํ™”๋ฉด์ด ๊ณ„์† ๋˜๋Š” ๊ฒƒ ๊ฐ™์ฃ ?

example/hello/๋กœ ๋“ค์–ด๊ฐ€๋ผ๊ณ  ๋‹ค์‹œ ์•Œ๋ ค์ค๋‹ˆ๋‹ค. 

๋‹ค์‹œ ํ•œ ๋ฒˆ ์‹œ๋„ํ•ด๋ด…์‹œ๋‹ค.

 

์˜ค, ๋ญ”๊ฐ€ ์ฒ˜์Œ ๋ณด๋Š” ๋””์ž์ธ์˜ ํ™”๋ฉด์ด ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. 

๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์šฐ๋ฆฌ๊ฐ€ ๋ทฐ์—์„œ ๋งŒ๋“ค์—ˆ๋˜ Response ์•ˆ์— ๋„ฃ์€ hello world!๋„ ์ž˜๋‚˜ํƒ€๋‚˜๊ณ , 

GET/example/hello/๋ผ๋“ ์ง€ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋“ค๋„ ํ•จ๊ป˜ ์ž˜ ๋‚˜ํƒ€๋‚˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. 

๋ฏธ์•ฝํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ๋ฐฉ๊ธˆ ์ฒ˜์Œ์œผ๋กœ API๋ฅผ ๋งŒ๋“ค์–ด๋ดค์Šต๋‹ˆ๋‹ค!

 

 

 

4.2.2 Django์—์„œ ๋‹ฌ๋ผ์ง„ ์ 

๋ฐฉ๊ธˆ ๋ดค๋˜ ๊ทธ ๋ฉ‹์ง„ ๋ฐ์ดํ„ฐ๋“ค์„ HTTP์˜ ํ—ค๋”๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. 

HTTP๋Š” ์›น์˜ ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ ๊ฐ„ ์š”์ฒญ/์‘๋‹ต์„ ์œ„ํ•œ ํ”„๋กœํ† ์ฝœ์ด์—ˆ์Šต๋‹ˆ๋‹ค. 

 

HTTP๊ฐ€ ์š”์ฒญ/์‘๋‹ต์„ ํ•  ๋•Œ ๋ˆ„๊ตฌ๋‚˜ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ํ†ต์‹ ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ†ต์ผ๋œ ๊ทœ๊ฒฉ์ด ํ•„์š”ํ•˜๊ณ , 

๊ทธ ๊ทœ๊ฒฉ ๋‚ด์— ์žˆ๋Š” ์ฃผ์š” ์ •๋ณด๋ฅผ ๋‹ด์•„ ๋†“๋Š” ๊ฒƒ์ด HTTP์˜ ํ—ค๋”์ž…๋‹ˆ๋‹ค. 

 

๋‹ค์‹œ ๋ณธ๋ฌธ์œผ๋กœ ๋Œ์•„์˜ค๋ฉด, DRF๋Š” ์•ž์—์„œ ๋งŒ๋“  ๊ฒƒ์ฒ˜๋Ÿผ Response๋ฅผ ์ œ๊ณตํ•˜๋Š” 

API์˜ ํ˜•ํƒœ๋กœ ๊ฒฐ๊ณผ๋ฌผ์ด ๋‚˜์˜ต๋‹ˆ๋‹ค. 

 

๊ทธ๋ ‡๋‹ค๋Š” ๊ฑด ์•ž์„œ ๋งŒ๋“ค์–ด์™”๋˜ ํ…œํ”Œ๋ฆฟ์˜ ํ˜•ํƒœ๊ฐ€ ์•„๋‹Œ, 

JSON๊ณผ ๊ฐ™์€ ํ˜•ํƒœ์˜ ์‘๋‹ต์„ ์ œ๊ณตํ•  ํ…๋ฐ

 

๊ทธ๋ ‡๋‹ค๋ฉด ํ…œํ”Œ๋ฆฟ์„ ๋Œ€์‹ ํ•  ๋ฌด์–ธ๊ฐ€๊ฐ€ ํ•„์š”ํ•˜๊ฒ ์ฃ ?

๊ธฐ์กด ๋ทฐ์—์„œ ํ…œํ”Œ๋ฆฟ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•ด ์ฃผ์—ˆ๋‹ค๋ฉด ์ด์ œ ๋‹ค๋ฅธ ๊ณณ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 

 

DRF์—์„œ๋Š” Serializer๊ฐ€ ๊ทธ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. 

 

 

4.3 ๋„์„œ ์ •๋ณด API ์˜ˆ์ œ๋กœ Django REST Framework ๊ธฐ์ดˆ ๊ฐœ๋… ์‚ดํŽด๋ณด๊ธฐ 

๋„์„œ ์ •๋ณด API ์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค๋ฉฐ DRF์˜ ์ฃผ์š” ๊ฐœ๋…์„ ์ฒœ์ฒœํžˆ ์ตํ˜€๋ด…์‹œ๋‹ค. 

 

4.3.1 DRF Serializer

์‹œ๋ฆฌ์–ผ๋ผ์ด์ €๋งŒ ์•Œ๋ฉด Django์™€ DRF์˜ ์ฐจ์ด์ ์„ ๋ชจ๋‘ ํŒŒ์•…ํ•œ ๊ฒƒ์ด๋‚˜ ๋‹ค๋ฆ„์—†์Šต๋‹ˆ๋‹ค. 

Serialize์˜ ์‚ฌ์ „์ ์ธ ์˜๋ฏธ๋Š” ์ง๋ ฌํ™” ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

์ง๋ ฌํ™” ๋Š” Django ํ”„๋กœ์ ํŠธ์—์„œ ๋‚ด๊ฐ€ ๋งŒ๋“  ๋ชจ๋ธ๋กœ๋ถ€ํ„ฐ ๋ฝ‘์€ queryset, ์ฆ‰ ๋ชจ๋ธ ์ธ์Šคํ„ด์Šค๋ฅผ JSON ํƒ€์ž…์œผ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. 

๊ฐ„๋‹จํžˆ Django ๋ชจ๋ธ์„ JSON์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•œ ๋ชจ์–‘ ํ‹€ ์ •๋„๋กœ ์ดํ•ดํ•˜๊ณ  ๋„˜์–ด๊ฐ€๋„ ํฐ ๋ฌธ์ œ๋Š” ์—†์ง€๋งŒ,

์ค‘์š”ํ•œ ๋‚ด์šฉ์ด๋‹ˆ ์ข€ ๋” ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 

 

DRF ๋‚ด์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋•Œ์—๋Š” Django์˜ ๋ชจ๋ธ์„ ํ†ตํ•ด ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. 

๋ชจ๋ธ์€ ์•ž์„œ ์‚ดํŽด๋ณธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์„ ์ถ”์ƒํ™”ํ•œ ๊ฐœ๋…์ด๋ฉฐ, 

Django์˜ ORM์„ ํ†ตํ•ด ํŒŒ์ด์ฌ ๋ฌธ๋ฒ•์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. 

 

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— Django์—์„œ์˜ ๋ฐ์ดํ„ฐ๋Š” JSON์ด๋‚˜ ์ด๋Ÿฐ ํฌ๋งท์ด ์•„๋‹Œ, 

ํŒŒ์ด์ฌ ๊ฐ์ฒด์˜ ํ˜•ํƒœ๋กœ ์ €์žฅ์ด ๋ฉ๋‹ˆ๋‹ค. 

 

์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“ค API๋Š” ์ด๋Ÿฐ ๋ฐ์ดํ„ฐ๋ฅผ ํด๋ผ์ด์–ธํŠธ์— ๋ณด๋‚ด์ฃผ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. 

์ด๋•Œ ์–ด๋–ค ์ž‘์—…๋„ ํ•˜์ง€ ์•Š๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋Œ€๋กœ ๋ณด๋‚ด์ค€๋‹ค๋ฉด?

 

ํด๋ผ์ด์–ธํŠธ๋Š” ์ฝ์ง€๋„ ๋ชปํ•˜๋Š” ํŒŒ์ด์ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๊ฒŒ ๋  ๊ฒƒ ์ž…๋‹ˆ๋‹ค. 

๋‹น์—ฐํžˆ ์ด๋ฅผ ์œ„ํ•ด ํŒŒ์ด์ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ž์—ด(JSON๋“ฑ)๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ณด๋‚ด์ฃผ์–ด์•ผ ํ•˜๊ณ , 

 

์ด๋ ‡๊ฒŒ ํŒŒ์ด์ฌ ๋ฐ์ดํ„ฐ ๊ฐ์ฒด๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ž‘์—…์„ ์ง๋ ฌํ™”, 

Serialize ๋ผ๊ณ  ์ดํ•ดํ•˜๋ฉด ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค. 

 


 

๋ฐ˜๋Œ€๋กœ, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ DRF ์„œ๋ฒ„์— ๋ณด๋‚ด์ฃผ๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. 

POST ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” API๋ฅผ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋Š” ๊ฒฝ์šฐ,

 

ํด๋ผ์ด์–ธํŠธ๋Š” API ์š”์ฒญ์— ๋ฐ์ดํ„ฐ๋ฅผ JSON ๋“ฑ ๋ฌธ์ž์—ด ํ˜•ํƒœ๋กœ ์ž…๋ ฅํ•˜์—ฌ ๋ณด๋‚ด์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 DRF์„œ๋ฒ„ ์ž…์žฅ์—์„œ๋Š” ์ด ๋ฌธ์ž์—ด์„ ๊ทธ๋Œ€๋กœ ๋ชจ๋ธ์„ ํ†ตํ•ด ์ €์žฅํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. 

 

๋ชจ๋ธ์„ ํ†ตํ•ด ์ €์žฅํ•˜๋ ค๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ํŒŒ์ด์ฌ ๊ฐ์ฒด์˜ ํ˜•ํƒœ์—ฌ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. 

๋”ฐ๋ผ์„œ ์•ž์„  ๊ฒฝ์šฐ์™€ ๋ฐ˜๋Œ€๋กœ JSON ๋“ฑ ๋ฌธ์ž์—ด์„ ํŒŒ์ด์ฌ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ž‘์—…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. 

์ด๊ฒƒ์„ ์—ญ์ง๋ ฌํ™”, ๋””์‹œ๋ฆฌ์–ผ๋ผ์ด์ฆˆใ…ก๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. 

 

 

์šฐ๋ฆฌ๊ฐ€ ์•ž์œผ๋กœ ๋ฐฐ์šฐ๋ฉฐ ๋งŒ๋“ค ์‹œ๋ฆฌ์–ผ๋ผ์ด์ €๋Š” ์ง๋ ฌํ™”์™€ ์—ญ์ง๋ ฌํ™” ๊ธฐ๋Šฅ์„ ๋™์‹œ์— ๊ฐ–๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ API๊ฐ„ ๋ฐ์ดํ„ฐ ์–‘์‹์„ ๋งž์ถฐ์ฃผ๋Š” ๋ณ€ํ™˜๊ธฐ ๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค๋ฉด ์‹œ๋ฆฌ์–ผ๋ผ์ด์ €์— ๋Œ€ํ•œ ์ดํ•ด๋Š” ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. 

 

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ฅผ ํ•จ๊ป˜ ๋งŒ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 

์šฐ๋ฆฌ๊ฐ€ ์ด๋ฒˆ์— DRF ๊ฐœ๋… ์„ค๋ช…๊ณผ ๋ณ‘ํ–‰ํ•˜๋ฉฐ ๋งŒ๋“ค ์˜ˆ์ œ๋Š” ๋„์„œ ์ •๋ณด API์ž…๋‹ˆ๋‹ค. 

 

๋ณ„๋„์˜ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ์•„๊นŒ ๋งŒ๋“ค์—ˆ๋˜ ํ”„๋กœ์ ํŠธ์— ์ด์–ด์„œ ๋‚ด์šฉ์„ ๋งŒ๋“ค์–ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. 

 

 

 

 

 

 

 

 

 

 

 

 

 

๋ฐฑ์—”๋“œ๋ฅผ ์œ„ํ•œ Django REST Framework with ํŒŒ์ด์ฌ

COUPANG

www.coupang.com

 

 

"์ด ํฌ์ŠคํŒ…์€ ์ฟ ํŒก ํŒŒํŠธ๋„ˆ์Šค ํ™œ๋™์˜ ์ผํ™˜์œผ๋กœ, ์ด์— ๋”ฐ๋ฅธ ์ผ์ •์•ก์˜ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์ œ๊ณต๋ฐ›์Šต๋‹ˆ๋‹ค."