2nd [Hines]๐Ÿ’ซ 4Day

์ด์œ ์ง„ยท2021๋…„ 12์›” 16์ผ
0

2nd_project(Hines)

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

3์ผ์ฐจ์— ์˜ฌ๋ ธ๋˜ PR์— ๋ฐ›์€ ๋ฆฌ๋ทฐ ๋‚ด์šฉ์—์„œ

  1. ๊ฒฐ๊ณผ ๊ฐ’์„ ๋ฆฌ์ŠคํŠธ๋กœ ๊ฐ์‹ธ์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?
  2. product ๊ฐ์ฒด๋งŒ ์‚ฌ์šฉํ•ด์„œ image_url์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ์ˆ˜์ •ํ•ด์ฃผ์„ธ์š”.
  • 1๋ฒˆ
    : '{ }๊ฐ€ ํ•œ ๊ฐœ ์ด์ƒ์ผ ๊ฒฝ์šฐ, [ ]์— ๊ฐ์‹ธ์„œ ๋ฐ˜ํ™˜ํ•˜๊ณ 
    { }๊ฐ€ ํ•œ ๊ฐœ์ผ ๊ฒฝ์šฐ, ๋ฐ”๋กœ { } ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.'
    ๋ผ๋Š” ๊ฒƒ์„ ๊ตฌ๊ธ€๋ง์„ ํ†ตํ•ด ํ•ด๊ฒฐํ•˜๊ณ ,

  • 2๋ฒˆ
    : ์—ญ์ฐธ์กฐ์˜ ๊ฐœ๋…์ด ๋ถ€์กฑํ•˜์—ฌ ์ถ”๊ฐ€๋กœ ๊ณต๋ถ€ ํ›„, product.image_set.all()๋กœ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์˜€๋‹ค.


์œ„์˜ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ˜์˜ํ•˜์—ฌ ์ˆ˜์ •๋œ ์ฝ”๋“œ๋Š” ์•„๋ž˜(๐Ÿ‘‡)์™€ ๊ฐ™๋‹ค.

import json

from django.http            import JsonResponse
from django.views           import View

from products.models        import Product

class ProductDetailView(View):
    def get(self, request, product_id):
        try: 
            product = Product.objects.get(id=product_id)

            result = {
                        'name'                : product.name,
                        'price'               : product.price,
                        'brand'               : product.brand,
                        'description'         : product.description,
                        'thumbnail_image_url' : product.thumbnail_image_url,
                        'image_url'           : product.image_set.all()[0].image_url
                    }
                    
            return JsonResponse({'message' : result}, status=200)     

        except Product.DoesNotExist:
            return JsonResponse({'message' : 'PRODUCT_DOESNOT_EXIST'}, status=400) 



์œ„์˜ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ˜์˜ ํ›„์—,
์˜คํ›„ ์ˆ˜์—…๋•Œ ๋ฐฐ์šด unit test๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ณผ์ •์—์„œ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ๊ฒฌํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

์ž‘์„ฑํ–ˆ๋˜ product์˜ views.py๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•  ์ ์„ ๋ฐœ๊ฒฌํ•˜๊ฒŒ ๋œ ๊ฒƒ์ด๋‹ค.

์œ„์˜ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ›์•„ ์ˆ˜์ •ํ–ˆ๋˜ ์ฝ”๋“œ์—์„œ product์˜ image๋ฅผ ํ•œ ๊ฐœ๋งŒ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์žˆ์—ˆ๋˜ ๊ฒƒ์ด๋‹ค!!(์•„๋‹ˆ ์ด๊ฒŒ ๋ฌด์Šจ์ผ์ด์•ผ....?๐Ÿ˜ฑ๐Ÿ˜ฑ๐Ÿ˜ฑ๐Ÿ˜ฑ๐Ÿ˜ฑ๐Ÿ˜ฑ ์ด ์ƒํƒœ์„œ unit test๋ฅผ ํ–ˆ๋‹จ ๋ง์ธ๊ฐ€....

๊ทธ๋ฆฌํ•˜์—ฌ!!
์—ฌ๋Ÿฌ ์ด๋ฏธ์ง€๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ๊ฒŒ for๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋นˆ list[ ]๋ฅผ ๋งŒ๋“ค๊ณ ,
append() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๋Š” ๋กœ์ง์„ ์ž‘์„ฑํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.
(+ ์ถ”๊ฐ€๋กœ list compresion์œผ๋กœ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•ด๋ณด๊ธฐ๋กœ!)




product์˜ image๋ฅผ ํ•œ ๊ฐœ๋งŒ ๋‹ด์•˜๋˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ณผ์ •์„ ์•„๋ž˜์— ์ž‘์„ฑํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

์šฐ์„  image๋ฅผ QuerySet์„ image_url ์ด๋ผ๋Š” ๋ณ€์ˆ˜์— ๋‹ด๋Š”๋‹ค

image_url = product.image_set.all() #--> QuerySet ํ˜•ํƒœ

๋นˆ list์˜ ๋ณ€์ˆ˜์ธ image_result๋ฅผ ์ง€์ •ํ•ด ์ฃผ์—ˆ๋‹ค.

image_result = []

๊ทธ๋ฆฌ๊ณ ,
์ด์ œ for๋ฌธ์„ ํ†ตํ•ด ๋นˆ list์— append( ) ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ๋กœ์ง์„ ์ž‘์„ฑํ•˜๋ฉด, ์•„๋ž˜์˜ ์ฝ”๋“œ(๋ณ€๊ฒฝ ์ „๐Ÿ‘‡)์™€ ๊ฐ™๋‹ค.

import json

from django.http            import JsonResponse
from django.views           import View

from products.models        import Product

class ProductDetailView(View):
    def get(self, request, product_id):
        try: 
            product = Product.objects.get(id=product_id)
            image_url  = product.image_set.all() #--> ์ฟผ๋ฆฌ์…‹[๋ฆฌ์ŠคํŠธํ˜•ํƒœ]
            
            image_result = []
            for image in image_url: #--> ์ฟผ๋ฆฌ์…‹์—์„œ ํ•œ๊ฐœ์”ฉ ๊บผ๋‚ด๋„, ๊ทธ๋ƒฅ ๊ฐ์ฒด๊ฐ€ ๊บผ๋‚ด์ ธ๋‚˜์˜ด...
                image_result.append(image)

์‰˜์—์„œ ํ™•์ธ์„ ํ•ด๋ณธ ๊ฒฐ๊ณผ,
image_url์€ QuerySet type์œผ๋กœ ๋‚˜์˜ค๊ณ 
for๋ฌธ์„ ํ†ตํ•ด ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด์˜จ ๊ฒƒ์€ ๊ฐ์ฒด์ด๋ฉฐ

์œ„์˜ ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋Š” image_result ๋ณ€์ˆ˜์— ๊ณง๋ฐ”๋กœ ๊ฐ์ฒด๋ฅผ ๋‹ด์€ ์ƒํ™ฉ์ด ๋œ๊ฒƒ์ด๋‹ค.

Json์€ ๊ฐ์ฒด๋‚˜ ์ฟผ๋ฆฌ์…‹์˜ type๋กœ๋Š” ๋ณ€ํ™˜์‹œํ‚ฌ ์ˆ˜ ์—†๊ธฐ๋•Œ๋ฌธ์—,
for๋ฌธ์„ ํ†ตํ•ด์„œ image๋ฅผ Json์ด ๋ณ€ํ™˜์ด ๊ฐ€๋Šฅํ•œ [ ] or { } ํ˜•ํƒœ๋กœ ๋งŒ๋“ค์–ด์ค˜์•ผ ํ•œ๋‹ค๋Š”๊ฒƒ!

์œ„์˜ ๊ฐ™์€ ์ฝ”๋“œ๋กœ๋Š” for๋ฌธ์„ ์ž‘์„ฑํ–ˆ์ง€๋งŒ,
Json Serisable Error๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ ๊ฒƒ์ด๋‹ค.


๊ทธ๋ž˜์„œ,
append( ) ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ๋นˆ list์— ๋„ฃ์–ด์ฃผ๊ณ  ์‹ถ์€ ๊ฐ’์€,
ํ•œ ๊ฐœ์”ฉ ๋‚˜์˜จ ๊ทธ ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” image_url์ด๋ผ๋Š” ์ •๋ณด๋ผ๋Š” ๊ฒƒ์ด๋‹ค.


์œ„์˜ ์‚ฌํ•ญ์„ ๋ฐ˜์˜ํ•˜์—ฌ,
์ˆ˜์ •ํ•œ ์ฝ”๋“œ(์ˆ˜์ • ํ›„๐Ÿ‘‡)๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

import json

from django.http            import JsonResponse
from django.views           import View

from products.models        import Product

class ProductDetailView(View):
    def get(self, request, product_id):
        try: 
            product = Product.objects.get(id=product_id)
            image_url  = product.image_set.all() #--> ์ฟผ๋ฆฌ์…‹[๋ฆฌ์ŠคํŠธํ˜•ํƒœ]
            
            image_result = []
            for image in image_url: #--> ์ฟผ๋ฆฌ์…‹์—์„œ ํ•œ๊ฐœ์”ฉ ๊บผ๋‚ด๋„, ๊ทธ๋ƒฅ ๊ฐ์ฒด๊ฐ€ ๊บผ๋‚ด์ ธ๋‚˜์˜ด...
                image_result.append(image.image_url)

์œ„์˜ ์ฝ”๋“œ์— ์ถ”๊ฐ€๋กœ
๋ฉ˜ํ† ๋‹˜์˜

๋ˆ„๊ตฌ๋‚˜ ๋ณ€์ˆ˜๋ช…๋งŒ ๋ณด๊ณ ๋„
ํ•ด๋‹น ๋ณ€์ˆ˜์— ์–ด๋–ค ๊ฐ’์ด ๋‹ด๊ฒผ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๊ฒŒ
๋ณ€์ˆ˜๋ช…์„ ์ˆ˜์ •ํ•˜๋Š”๊ฒŒ ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ผ๋Š” ์กฐ์–ธ์„ ๋ฐ›์•„,

`image_url`     --> `images`
`image_result`  --> `image_list`

์•„๋ž˜(๐Ÿ‘‡)์˜ ์‚ฌ์ง„๊ณผ ์ฝ”๋“œ๊ฐ€ ๋ณ€์ˆ˜๋ช…์— ๋Œ€ํ•œ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ˜์˜ํ•œ ๊ฒƒ์ด๋‹ค.

import json

from django.http            import JsonResponse
from django.views           import View

from products.models        import Product

class ProductDetailView(View):
    def get(self, request, product_id):
        try: 
            product = Product.objects.get(id=product_id)
            images  = product.image_set.all() #--> ์ฟผ๋ฆฌ์…‹[๋ฆฌ์ŠคํŠธํ˜•ํƒœ]
            
            image_list = []
            for image in images: #--> ์ฟผ๋ฆฌ์…‹์—์„œ ํ•œ๊ฐœ์”ฉ ๊บผ๋‚ด๋„, ๊ทธ๋ƒฅ ๊ฐ์ฒด๊ฐ€ ๊บผ๋‚ด์ ธ๋‚˜์˜ด...
            image_list.append(image.image_url)

            result = {
                         'name'                : product.name,
                         'price'               : product.price,
                         'brand'               : product.brand,
                         'description'         : product.description,
                         'thumbnail_image_url' : product.thumbnail_image_url,
                         'image_url'           : image_list
                  }

		return JsonResponse({'message' : result}, status=200)     

	  except Product.DoesNotExist:
      		return JsonResponse({'message' : 'PRODUCT_DOESNOT_EXIST'}, status=400) 
            



product datail view๋ฅผ ์ž‘์„ฑ ์™„๋ฃŒ ํ›„์—,
๋‹ค์‹œ unit test๋ฅผ ์ง„ํ–‰ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

ํ•ด๋‹น unit test code๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ณผ์ •์„ ๋ชจ๋‘ ์ •๋ฆฌํ•˜์ง€ ๋ชปํ–‡์ง€๋งŒ,
๋‚ด๊ฐ€ ์‹ค์ˆ˜ํ•œ ๋ถ€๋ถ„, ๊ณผ์ •์— ๋ฐœ์ƒํ•œ ์—๋Ÿฌ, ํ•ด๊ฒฐ?์— ๋Œ€ํ•œ ์ž‘์„ฑ์€ ๋‚˜์˜ ๋ฒจ๋กœ๊ทธ ๋งํฌ(๐Ÿ‘‡)๋กœ ์ฒจ๋ถ€ํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค.

๐Ÿ‘€ unit test ์ž‘์„ฑ ๊ณผ์ • ๊ธฐ๋ก ๐Ÿ‘€




<์ž ๊น... ๋„์ ์ด๋Š” ๋ง...>
uni test code๋ฅผ ์ž‘์„ฑํ•˜๋ฉด์„œ, ์ด๋ฏธ์ง€์— ๋Œ€ํ•œ for๋ฌธ์„ ๋Œ๋ฆฌ๋Š” ์ด์œ ๋Š” ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

์œ„์—์„œ ๋ฒจ๋กœ๊ทธ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด์„œ ์„ค๋ช…ํ–ˆ์ง€๋งŒ,
all()์€ QuerySet type์ด๊ธฐ ๋•Œ๋ฌธ์— json์ด ๋ณ€ํ™˜์„ ํ•  ์ˆ˜ ์—†๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— for๋ฌธ์„ ํ†ตํ•ด์„œ ๊ฐ์ฒด(์ธ์Šคํ„ด์Šค)๋ฅผ Json์ด ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ์ธ list๋‚˜ dictionary type์œผ๋กœ ๋ฐ”๊ฟ”์ค˜์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐฐ์› ๋‹ค.

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

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