์ด์ ์ถ๊ฐ๋ก ํ๋ก ํธ๋ถ๊ป์ ์ํ ๋ํ
์ผ ์ ๋ณด๋ฅผ 2๊ฐ์ง ์ถ๊ฐ ์์ฒญ์ด ์๋ค.
์นดํ
๊ณ ๋ฆฌ ์ด๋ฆ๊ณผ ์๋ธ ์นดํ
๊ณ ๋ฆฌ ์ด๋ฆ ์ ๋ณด๋ ์์ฒญํ์
์ ์ค๋ ์์นจ์ ์ด์ ์ฝ๋์ ์ถ๊ฐ ๋ฐ postman์ผ๋ก ํ์ธํด๋ณธ ๊ฒฐ๊ณผ์ด๋ค(+ Json์ผ๋ก ๋๊ฒจ์ฃผ๋ key๊ฐ์ด "message"๋ก ๋์ด ์์ด์, "result"๋ก ๋ช
์นญ๋ ๊ฐ์ด ์์ ํ์๋ค.")
์๋ ์์์ผ ์ค์ 10์๋ฐ์ ์์ ์ด์ฟ๋ ์ฝ๋๋ฆฌ๋ทฐ๊ฐ ์ค๋ ์คํ 2์๋ฐ์ผ๋ก ์๋น๊ฒจ์ก๋ค.
๋ผ์ด๋ธ ์ฝ๋ ๋ฆฌ๋ทฐ ์ ๊น์ง ์์ฑํ ๋ถ๋ถ์
<์ํ ์์ธํ์ด์ง ๊ธฐ๋ฅ>, <๋ฆฌ๋ทฐ ๋ฑ๋ก ๊ธฐ๋ฅ>, <๋ฆฌ๋ทฐ ์ ๋ณด ๋ถ๋ฌ์ค๊ธฐ ๊ธฐ๋ฅ ์์ฑ์ค>...์ํ์ฟ๊ณ ,
์์ง ๋ฆฌ๋ทฐ ์ ๋ณด ๋ถ๋ฌ์ค๊ธฐ ๊ธฐ๋ฅ ๊ตฌํ ์ค์์ 5๊ฐ์ฉ ๋ฆฌ๋ทฐ ์ ๋ฌํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํ์ง ๋ชปํด์ ์ด๋ฒ ๋ผ์ด๋ธ ์ฝ๋ ๋ฆฌ๋ทฐ ์๊ฐ์ <์ํ ์์ธํ์ด์ง ๊ธฐ๋ฅ>๊ณผ <๋ฆฌ๋ทฐ ๋ฑ๋ก ๊ธฐ๋ฅ์ ๋ถ๋ถ>๋ง ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ๊ฒ ๋์๋ค.
์ฐ๋ฆฌ ํ์์ <์ฅ๋ฐ๊ตฌ๋>, <์ฃผ๋ฌธ ๊ธฐ๋ฅ>๊ณผ ๋์ ๋๋จธ์ง ๋ด๋น ๋ถ๋ถ์ธ <๋ฆฌ๋ทฐ ์ ๋ณด ๋ถ๋ฌ์ค๊ธฐ>๋ ๋ชฉ์์ผ์ ๋ค์ ๋ผ์ด๋ธ ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ๊ธฐ๋ก ํ๋ค.
์ค๋ ์งํํ ๋ผ์ด๋ธ ์ฝ๋ ๋ฆฌ๋ทฐ์ ๋ํด์ ๋ค์ ์ ๋ฆฌ๋ฅผ ํด๋ณด๋ ค๊ณ ํ๋ค.
(ํ์๋ถ๋ค์ด ๋ด๋นํ ๊ธฐ๋ฅ๋ค์ ๋์ค์ ๋ค์ ์ฝ๋๋ฅผ ๋ฏ์ด๋ณด๋ฉด์ ์ ๋ฆฌํด๋ณด๊ธฐ๋ก ํ์)
๋ถํ์ํ(๋ฏธ์ฌ์ฉ) import ์ญ์
[์์ ์ ]
[์์ ํ]
1) for๋ฌธ -> list comprension ์ ์ฉํด๋ณด๊ธฐ
2) ๋ถํ์ํ ๊ณต๋ฐฑ(tab) ์ญ์
3) (+ ํ๋ก ํธ์ ์๊ตฌ : sub_category_name๊ณผ category_name ์ถ๊ฐํ๊ธฐ,
์์ ํ์ : ๊ธฐ์กด์ 'name' key -> 'product_name' key ์์ ,
json key ์์ : ๊ธฐ์กด์ 'message' -> 'result' ์์ )
[์์ ์ ]
[์์ ํ]
[์์ ์ ]
[์์ ํ]
์ ์ด์ login decorator๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ ๊ฐ ๋ก๊ทธ์ธ์ ์ฑ๊ณตํ์ง ์๋๋ค๋ฉด,
if not User.objects.filter(id=request.user.id).exists(): return JsonResponse({'message':'UNAUTHORIZED_USER'}, status=401)
์์ ์์ฑํ class์ ํจ์๋ฅผ ์คํ๋ ์๊ฐ ์๋ค.
:: login decorator ๋ถ๋ถ์์ ๋ก๊ทธ์ธ ์ ๋ณด๊ฐ ์๋ ์ ์ ๋ฅผ ๋จผ์ ๊ฑธ๋ฌ์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค.
(๊ทธ๋ ๊ธฐ ๋๋ฌธ์, ๋ก๊ทธ์ธ์ ํ์ง ์์ ์ ์ ์ ์ ๋ณด๋ก๋ ReviewView์ ํจ์๊ฐ ์คํ ๋ ์๊ฐ ์์ ๋ฟ๋๋ฌ, ์ ์ ์ฌ๋ถ์ ๋ํ ์กฐ๊ฑด๊ณผ ๋ฉ์ธ์ง๋ Review view์์๋ ์์ฑํ ํ์๊ฐ ์๋ค.)
์๋ง,
login decorator๋ฅผ ๋ค๋ฅธ ํ์์ด ๊ตฌํ์ค์ด์ฌ์...
ํด๋น ๋ฆฌ๋ทฐ ๊ธฐ๋ฅ ๊ตฌํํ ๋,
"์ ์ ์ ๋ณด๊ฐ ์๋ ๊ฒฝ์ฐ์๋??" ์ด๋ผ๋ ๋ฌผ์ํ๊ฐ ์๊ฒจ์ ์์ฑํ ๊ฒ๊ฐ๋ค..
login decorator์ ์์ฑ ์๋๋ฅผ ์ ํํ ์๊ณ ์์๋ค๋ฉด,
๋ถํ์ํ ์ ์ฝ๋๋ฅผ ์์ฑํ์ง ์์์ ๊ฑฐ๋ผ๋ ์๊ฐ์ด ๋ ๋ค... (๋ฐ์ฑ...)
1์ฐจ๋ login decorator๋ฅผ ์์ฑํด๋ณด์์์๋ ๋ถ๊ตฌํ๊ณ ์ด๋ฐ ์ฝ๋๋ฅผ ์์ฑํ๋ค๋ ์ ์ ๋ฐ์ฑ์ ํ์์ฑ์ ๋๋๋ค...
[์์ ์ ]
if not Product.objects.get(id=product_id): return JsonResponse({'message':'NO_PRODUCT'}, status=400)
[์์ ํ]
if not Product.objects.filter(id=product_id).exitsts(): return JsonResponse({'message':'NO_PRODUCT'}, status=400)
get()
๊ณผ filter().exists()
<๊ฒฐ๊ตญ, if๋ฌธ์ ์์ฑํ๋์ง, execpion ์ฒ๋ฆฌ ํ๋์ง ์ด๋ ๋ฐฉ๋ฒ์ด๋ ๋ฌด๊ด>
ํด๋น ์กฐ๊ฑด์ ์์ฑํ๋ ์ด์ ๋ ๋จ์ํ๊ฒ,
"๋ง์ฝ์
ํ๋ก ํธ๋จ์์๋ฑ๋ก๋์ง ์์ product_id๊ฐ
์ด ์๋ ์ ๋ณด๋ฅผ ์ ๋ฌํด์ค ๊ฒฝ์ฐ๊ฐ ํน์๋ผ๋ ๋ฐ์ํ๋ฉด,
๊ทธ ์๋ฌ์ฒ๋ฆฌ๋ ๋ฐ๋ก ์ํด์ค๋ ๋ฌด๋ฐฉํ๊ฐ...?"
๋ผ๋ ์๊ฐ์ผ๋ก ์์ฑํ๊ฒ ๋์๋ค.
์ด๋ ๊ฒ ์์ฑํ๋๊ฒ ๋ง๋๊ฑด์ง ๋๊ธฐ ๋ช๋ช
๊ป ์ฌ์ญค๋ณด์์๋,
"์๋ product๋ ๋ฆฌ๋ทฐ๋ฅผ ์์ฑ๋ ๋ชปํ ํ
๋ฐ ์ ์กฐ๊ฑด์ ์์ฑํ๋๊ฒ ๋ง์ด ์๋๋ ๊ฒ ๊ฐ๋ค...?"๋ผ๋ ๋ฅ์ ๋ต๋ณ์ ๋ฐ์๋ค.
๋๋ ์ด๋ฐ ์๊ฐ์ ๊ฐ์ ธ๋ณด๊ธฐ๋ ํ๊ธฐ๋ ํ๊ณ , ์์ฑํ ์ฝ๋์ ๋ํด์ ํ์ ์ ๊ฐ์ง๊ณ ์์ฑํ๊ฒ ์๋์ฌ์
๋ฉํ ๋๊ป ์ด ์กฐ๊ฑด์์ ์์ฑํ๋๊ฒ ๋ง๋๊ฑด์ง ๊ถ๊ธํด์ ์ฌ์ญค๋ณด๊ธฐ๋ก ํ๋ค.
๋ด์ผ์
์ค๋ ์ฝ๋๊ฐ ์ถ๊ฐ๋ ProductDetailView์ unit test๊น์ง ์๋ฃํ๊ณ ,
ReviewView์ get()๋ฉ์๋์ offset:limit
์ ์ถ๊ฐ์์ผ๋ณด๊ธฐ๋ก...
์ฐ์ , ๊ธฐ์ ํ์ ์ด๋ ฅ์๋ฅผ ์๋ฃ์ํค๊ณ ์๋๊ฑธ๋ก...
๊ณ ๋ฏผ๊ณผ ๋ฐฐ์ด ์ ๋ค์ด ์ ๋ฌป์ด๋ ๊ธ์ด๋ค์~! ์ ์ฝ์์ด์!!! ๊ณ ์๋ง์์ด์~