2nd [Hines] ๐Ÿ’ซ9Day

์ด์œ ์ง„ยท2021๋…„ 12์›” 21์ผ
1

2nd_project(Hines)

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

์–ด์ œ ์ถ”๊ฐ€๋กœ ํ”„๋ก ํŠธ๋ถ„๊ป˜์„œ ์ƒํ’ˆ ๋””ํ…Œ์ผ ์ •๋ณด๋ฅผ 2๊ฐ€์ง€ ์ถ”๊ฐ€ ์š”์ฒญ์ด ์™”๋‹ค.
์นดํ…Œ๊ณ ๋ฆฌ ์ด๋ฆ„๊ณผ ์„œ๋ธŒ ์นดํ…Œ๊ณ ๋ฆฌ ์ด๋ฆ„ ์ •๋ณด๋„ ์š”์ฒญํ•˜์…”์„œ ์˜ค๋Š˜ ์•„์นจ์— ์ด์ „ ์ฝ”๋“œ์— ์ถ”๊ฐ€ ๋ฐ postman์œผ๋กœ ํ™•์ธํ•ด๋ณธ ๊ฒฐ๊ณผ์ด๋‹ค(+ Json์œผ๋กœ ๋„˜๊ฒจ์ฃผ๋Š” key๊ฐ’์ด "message"๋กœ ๋˜์–ด ์žˆ์–ด์„œ, "result"๋กœ ๋ช…์นญ๋„ ๊ฐ™์ด ์ˆ˜์ •ํ•˜์˜€๋‹ค.")


์›๋ž˜ ์ˆ˜์š”์ผ ์˜ค์ „ 10์‹œ๋ฐ˜์— ์˜ˆ์ •์ด์—ฟ๋˜ ์ฝ”๋“œ๋ฆฌ๋ทฐ๊ฐ€ ์˜ค๋Š˜ ์˜คํ›„ 2์‹œ๋ฐ˜์œผ๋กœ ์•ž๋‹น๊ฒจ์กŒ๋‹ค.

๋ผ์ด๋ธŒ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์ „๊นŒ์ง€ ์ž‘์„ฑํ•œ ๋ถ€๋ถ„์€
<์ƒํ’ˆ ์ƒ์„ธํŽ˜์ด์ง€ ๊ธฐ๋Šฅ>, <๋ฆฌ๋ทฐ ๋“ฑ๋ก ๊ธฐ๋Šฅ>, <๋ฆฌ๋ทฐ ์ •๋ณด ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ๊ธฐ๋Šฅ ์ž‘์„ฑ์ค‘>...์ƒํƒœ์—ฟ๊ณ ,
์•„์ง ๋ฆฌ๋ทฐ ์ •๋ณด ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์ค‘์—์„œ 5๊ฐœ์”ฉ ๋ฆฌ๋ทฐ ์ „๋‹ฌํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜์ง€ ๋ชปํ•ด์„œ ์ด๋ฒˆ ๋ผ์ด๋ธŒ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์‹œ๊ฐ„์— <์ƒํ’ˆ ์ƒ์„ธํŽ˜์ด์ง€ ๊ธฐ๋Šฅ>๊ณผ <๋ฆฌ๋ทฐ ๋“ฑ๋ก ๊ธฐ๋Šฅ์— ๋ถ€๋ถ„>๋งŒ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ›๊ฒŒ ๋˜์—ˆ๋‹ค.

์šฐ๋ฆฌ ํŒ€์›์˜ <์žฅ๋ฐ”๊ตฌ๋‹ˆ>, <์ฃผ๋ฌธ ๊ธฐ๋Šฅ>๊ณผ ๋‚˜์˜ ๋‚˜๋จธ์ง€ ๋‹ด๋‹น ๋ถ€๋ถ„์ธ <๋ฆฌ๋ทฐ ์ •๋ณด ๋ถˆ๋Ÿฌ์˜ค๊ธฐ>๋Š” ๋ชฉ์š”์ผ์— ๋‹ค์‹œ ๋ผ์ด๋ธŒ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ›๊ธฐ๋กœ ํ–ˆ๋‹ค.

์˜ค๋Š˜ ์ง„ํ–‰ํ•œ ๋ผ์ด๋ธŒ ์ฝ”๋“œ ๋ฆฌ๋ทฐ์— ๋Œ€ํ•ด์„œ ๋‹ค์‹œ ์ •๋ฆฌ๋ฅผ ํ•ด๋ณด๋ ค๊ณ ํ•œ๋‹ค.
(ํŒ€์›๋ถ„๋“ค์ด ๋‹ด๋‹นํ•œ ๊ธฐ๋Šฅ๋“ค์€ ๋‚˜์ค‘์— ๋‹ค์‹œ ์ฝ”๋“œ๋ฅผ ๋œฏ์–ด๋ณด๋ฉด์„œ ์ •๋ฆฌํ•ด๋ณด๊ธฐ๋กœ ํ•˜์ž)


1. products app์˜ veiws.py : ProductDetailView

  1. ๋ถˆํ•„์š”ํ•œ(๋ฏธ์‚ฌ์šฉ) import ์‚ญ์ œ
    [์ˆ˜์ • ์ „]

    [์ˆ˜์ • ํ›„]


1) for๋ฌธ -> list comprension ์ ์šฉํ•ด๋ณด๊ธฐ
2) ๋ถˆํ•„์š”ํ•œ ๊ณต๋ฐฑ(tab) ์‚ญ์ œ
3) (+ ํ”„๋ก ํŠธ์˜ ์š”๊ตฌ : sub_category_name๊ณผ category_name ์ถ”๊ฐ€ํ•˜๊ธฐ,
์ˆ˜์ • ํ•„์š” : ๊ธฐ์กด์˜ 'name' key -> 'product_name' key ์ˆ˜์ •,
json key ์ˆ˜์ • : ๊ธฐ์กด์˜ 'message' -> 'result' ์ˆ˜์ •)

[์ˆ˜์ • ์ „]

[์ˆ˜์ • ํ›„]




2. products app์˜ veiws.py : ReviewView

  1. decorator์˜ error message ์ค‘๋ณต ์‚ญ์ œ ํ•„์š”

[์ˆ˜์ • ์ „]

[์ˆ˜์ • ํ›„]

์• ์ดˆ์— 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๋ฅผ ์ž‘์„ฑํ•ด๋ณด์•˜์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ด๋Ÿฐ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค๋Š” ์ ์„ ๋ฐ˜์„ฑ์˜ ํ•„์š”์„ฑ์„ ๋Š๋‚€๋‹ค...


  1. get() -> filter() ์ˆ˜์ •

[์ˆ˜์ • ์ „]

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()

    • ๋ฐฉ๋ฒ•1) objects.get() ์‚ฌ์šฉ์‹œ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ, exception(์˜ˆ์™ธ)์ฒ˜๋ฆฌ ํ•„์š”
      => ํ•ด๋‹น ์กฐ๊ฑด๋ฌธ์˜ ๋ฐ˜ํ™˜๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ๋ชปํ•˜๊ณ , ์˜ˆ์™ธ ๋ฐœ์ƒ
      (์ฆ‰, ์ง€๊ธˆ ์ž‘์„ฑํ•œ if ์กฐ๊ฑด๋ฌธ์„ ์ž‘์„ฑํ•œ ์˜๋ฏธ X)
    • ๋ฐฉ๋ฒ•2) if ์กฐ๊ฑด๋ฌธ ์‚ฌ์šฉ -> ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ฒŒ ์กฐ๊ฑด ์ž‘์„ฑ ํ•„์š”

    <๊ฒฐ๊ตญ, if๋ฌธ์„ ์ž‘์„ฑํ•˜๋˜์ง€, execpion ์ฒ˜๋ฆฌ ํ•˜๋˜์ง€ ์–ด๋Š ๋ฐฉ๋ฒ•์ด๋“  ๋ฌด๊ด€>

  • ํ•ด๋‹น ์กฐ๊ฑด์„ ์ž‘์„ฑํ–ˆ๋˜ ์ด์œ ๋Š” ๋‹จ์ˆœํ•˜๊ฒŒ,

    "๋งŒ์•ฝ์—
    ํ”„๋ก ํŠธ๋‹จ์—์„œ ๋“ฑ๋ก๋˜์ง€ ์•Š์€ product_id๊ฐ’์ด ์•„๋‹Œ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•ด์ค„ ๊ฒฝ์šฐ๊ฐ€ ํ˜น์‹œ๋ผ๋„ ๋ฐœ์ƒํ•˜๋ฉด,
    ๊ทธ ์—๋Ÿฌ์ฒ˜๋ฆฌ๋Š” ๋”ฐ๋กœ ์•ˆํ•ด์ค˜๋„ ๋ฌด๋ฐฉํ•œ๊ฐ€...?"

    ๋ผ๋Š” ์ƒ๊ฐ์œผ๋กœ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

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




๋‚ด์ผ์€
์˜ค๋Š˜ ์ฝ”๋“œ๊ฐ€ ์ถ”๊ฐ€๋œ ProductDetailView์˜ unit test๊นŒ์ง€ ์™„๋ฃŒํ•˜๊ณ ,
ReviewView์˜ get()๋ฉ”์†Œ๋“œ์˜ offset:limit์„ ์ถ”๊ฐ€์‹œ์ผœ๋ณด๊ธฐ๋กœ...

์šฐ์„ , ๊ธฐ์—…ํ˜‘์—… ์ด๋ ฅ์„œ๋ฅผ ์™„๋ฃŒ์‹œํ‚ค๊ณ  ์ž๋Š”๊ฑธ๋กœ...

profile
์ฐจ๊ทผ์ฐจ๊ทผ ๋ฐฐ์›Œ๋‚˜๊ฐ€๋Š” ์ฃผ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ž

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

comment-user-thumbnail
2021๋…„ 12์›” 26์ผ

๊ณ ๋ฏผ๊ณผ ๋ฐฐ์šด ์ ๋“ค์ด ์ž˜ ๋ฌป์–ด๋‚œ ๊ธ€์ด๋„ค์š”~! ์ž˜ ์ฝ์—ˆ์–ด์š”!!! ๊ณ ์ƒ๋งŽ์•˜์–ด์š”~

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ