ํด๋ก ํ๋ก์ ํธ๋ ์์ ๊ฐ๋ฐ์๊ฐ์ ๋น์ค์ ๋์ด๊ธฐ ์ํด ์ด๋ฏธ ์๋น์ค ์ค์ธ ์ฌ์ดํธ์
๊ธฐํ์ด๋ ๋์์ธ์ ํด๋ก ํ์ฌ ์งํํ๋ ๊ฒ์ด๋ค. ์ด๋ฒ์ ์งํํ ํ๋ก์ ํธ๋
Clone Colding ํ๋ก์ ํธ๋ก, ๋ฌผ๋ก ๋ก์ง์ด๋ ๊ตฌํ๋ฐฉ๋ฒ์ ์ง์ ์ฝ๋ฉํ๋ค.
๋์ ์ฌ์ดํธ๋ ๋ฐ๋ก ๋ด๊ฐ ์ข์ํ๋ ๋ฌ์ฌ!
2021.3.15 ~ 2021.3.26
Front 3๋ช
+ Back 3๋ช
๊นํ์ค(PM) ์ ์ฌ์ฑ ๊น์ฐ์
๋ชจ๋ธ๋ง์ ์ฒ์ ๊ตฌํํ ๋์ ํ์๋ค๊ณผ ๋ง์ ์๊ฐ์ ํ ์ ํ๋ค.
๋ถ๋ช
StarBucks ๋ชจ๋ธ๋ง์ ํด๋ดค์์๋ ๋ถ๊ตฌํ๊ณ
๊ทธ๋น์ ์ด๋ ค์ํ๋ ๊ทธ ๋ชจ๋ธ๋ง์ ์๋ฌด๊ฒ๋ ์๋์๊ตฌ๋ ์ถ์๋ค.
์๋ํ๋ฉด order
์ product
์ ์ค๊ฐํ
์ด๋ธ์ธ orderproduct
์ฆ '์ฅ๋ฐ๊ตฌ๋'์ ForeignKey
์ M2M
์ ๊ด๊ณ๊ฐ ๋๋ฌด๋๋ ํท๊ฐ๋ ธ๋ค.
์๋ ์ฒ์ ํ๋ก์ ํธ๋ฅผ ์์ํ ๋ ๋ชจ๋ธ๋ง์ ์ ์ผ ๋ง์ ์๊ฐ์ด
์ฐ์ฌ์ง๋ค๊ณ ๋ค์๋๋ฐ ๊ทธ๊ฒ ์ ๋ง ๋ง๋ ๋ง์ด์๋ค.
ํ๋ก์ ํธ ๊ธฐ๊ฐ 3์ผ์ด ์ง๋ฌ์ ๋์๋ ๋ชจ๋ธ๋ง์ด ํท๊ฐ๋ ค
์ ๋๋ก ๋ ๋ก์ง์ ๊ตฌํํ์ง ๋ชปํ์๋ค.
๋, ์ค๊ฐ์ค๊ฐ ๋ง์ ๋ถ๋ถ์ ์์ ํ์๋ค.
table์ ๋ช
์ด๋ผ๋๊ฐ, table์ ์ํ
, ํ์ ๋ถ๋ถ์ ์๊ฐํ๋ฉฐ
๋ค์ ์์ ํ ์ต์ข
๊ฒฐ๊ณผ๋ฌผ๋ก ๋ก์ง์ ๊ตฌํํ๊ธฐ ๊น์ง ๊ฑฐ์ง 1์ฃผ์ผ์ด ๊ฑธ๋ ธ๋ค.
์ฐ๋ฆฌํ์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ ๋ csv
ํ์ผ์ python
์ผ๋ก DB
์ ๋ฃ์ด์ฃผ๋ ๋ฐฉ์์ ํํ๋ค.
์ด ๋ถ๋ถ์ ๋ด๊ฐ ๋งก์๋๋ฐ ๋๋ฌด๋ ์ฌ๋ฐ๋ ๊ฒ ใ
ใ
ใ
๐
Products์ table data๊ฐ ๋ค์ด์จ ๊ฑธ ๋ดค์ ๋์ ์พ๊ฐ์ด๋...๐
import os
import django
import csv
import sys
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'klush.settings')
django.setup()
from product.models import (
Menu,
Category,
SubCategory,
Product,
Image,
Label,
ProductLabel
)
with open(CSV_PATH_PRODUCTS) as in_file:
data_reader = csv.reader(in_file)
next(data_reader, None)
for row in data_reader:
product = Product.objects.create(
sub_category = SubCategory.objects.get(name=row[2]),
name = row[3],
is_new = int(row[4]),
is_vegan = int(row[5]),
is_soldout = int(row[6]),
price = float(row[7]),
weight = float(row[8])
)
with open(CSV_PATH_PRODUCTS) as in_file:
data_reader = csv.reader(in_file)
next(data_reader, None)
for row in data_reader:
Image.objects.create(image_url = row[9][1:-1], product = Product.objects.get(name=row[3]))
์ฒ์์ ์ข ํค๋งค๊ณ ์ดํด๊ฐ ์๋ผ์ ์ข ๋๋ ค์ง๋ ํ์ ์์ฑ
ํ์์ง๋ง ๊ทธ๋ด ๋๋ง๋ค
์ฐ๋ฆฌ ๋ฐฑ๋ฅ์ด ์ง์๋๐ง๊ณผ ์๋น๋๐ง์ด ๊ณ์ ๊ฒฉ๋ คํด์ฃผ๊ณ , ์ฐ๋ฆฌํ ์ ๋ง ์ ํ๊ณ ์๋ค๊ณ
์๋ก์๋ก ๋งํด์ฃผ์ด์ ์์ฒญ๋ ์๋ก๋ฅผ ๋ฐ์๋ค.
# product.models
class Product(models.Model):
name = models.CharField( max_length=50)
price = models.DecimalField(max_digits=10, decimal_places=2)
weight = models.DecimalField(max_digits=5, decimal_places=2)
detail = models.TextField()
is_vegan = models.BooleanField(default=False)
is_new = models.BooleanField(default=False)
is_soldout = models.BooleanField(default=False)
sub_category = models.ForeignKey('SubCategory', on_delete=models.CASCADE)
label = models.ManyToManyField('Label', through='ProductLabel')
class Meta:
db_table = "products"
class Image(models.Model):
image_url = models.CharField(max_length=1000)
product = models.ForeignKey('Product', on_delete=models.CASCADE)
class Label(models.Model):
name = models.CharField(max_length=50)
class Meta:
db_table ='labels'
class ProductLabel(models.Model):
product = models.ForeignKey('Product', on_delete=models.CASCADE)
label = models.ForeignKey('Label', on_delete=models.CASCADE)
class Meta:
db_table='products_labels'
# Views
class ProductListView(View):
def get(self, request):
products = Product.objects.all()
product_list = [{
'product_id' : product.id,
'sub_category' : product.sub_category.name,
'name' : product.name,
'image_url' : [image.image_url for image in product.image_set.all()],
'price' : product.price,
'is_vegan' : product.is_vegan,
'is_new' : product.is_new,
'is_soldout' : product.is_soldout,
'product_label' : [label.label.name for label in product.productlabel_set.all()],
} for product in products]
return JsonResponse({'product_list_data': product_list}, status=200)
์ ๋๋ก ์ฒ์ ๊ตฌํํด๋ดค๋ List Comprehension๊ณผ
์ด๋ ต๊ธฐ๋ง ํ๋ '์ญ์ฐธ์กฐ'.. ์ฌ์ค์ ๋ด๊ฐ ์ ์ผ ํค๋งธ๋ ๊ตฌ๊ฐ... ๐
์ญ์ฐธ์กฐ๋ฅผ ์ดํดํ๋ ค๊ณ shell์ ์์ฒญ๋๊ฒ ๊ดด๋กญํ์๋ค.
์ฌ์ค ์ง๊ธ๋ ์ค๋ช
ํด๋ณด๋ผ๊ณ ํ๋ฉด ์กฐ๊ธ ์ด๋ฒ๋ฒ๋๊ณ
100% ์ดํดํ๋ค๊ณ ์ฅ๋ด ๋ชปํ๋ค.
ํ์ง๋ง 2์ฐจ ํ๋ก์ ํธ ๋์๋ shell์ ๊ดด๋กญํ ์์ ์ด๊ณ ,
๊ฒฐ๊ตญ ๊ณ์ ํ๋ค๋ณด๋ฉด ์ดํด๊ฐ ๋๋ค!
์๋๋ ๊ฑด ์๋ค ์ํ๋ ๊ฒ๋ฟ
๋งค์ผ ์์นจ 11์์ Front์ Back ํ์๋ค์ด ๋ชจ์ฌ Standup Meeting
์ ํ์๋ค.
์๋ก๊ฐ ๋งก์ ๊ตฌํ ๊ธฐ๋ฅ์ ์งํ ์ํฉ์ ์๋
ผํ๊ณ , ๋งก์ ๊ธฐ๋ฅ์ ์ฑ์ ๋ฐ๋ผ front์ back์
ํต์ ์ ๋ง์ถฐ๋ณด๊ธฐ๋ ํ์๋ค. ์ฒ์ ๊ณํํ ๋์ order
, review
๋ฑ ํ๊ณ ์ถ์ ๊ธฐ๋ฅ์ด ๋ง์์ง๋ง,
ํ์ ๋ชจ๋์ ์๋
ผํ ๊ฒฐ๊ณผ ์ด๋ฒ ํ๋ก์ ํธ๋ front์ back์ ํ์
์ ๋ฐฐ์ฐ๋ ๊ณผ์ ์ด๋ผ๊ณ ์๊ฐํ์ฌ
ํ๋์ ๊ธฐ๋ฅ์ด๋ผ๋ ์๋ฒฝํ ๊ตฌํํ๊ณ , ๋จ์ ํ๋ก์ ํธ ๊ธฐ๊ฐ์๋ ์๋ฒ(AWS)์ ๋ฐฐํฌ ํ
์ต์ข
์ ์ผ๋ก ๋ง์ถฐ๋ณด๋ ์๊ฐ์ ๊ฐ๋ ๊ฑธ๋ก ํ์๋ค.
git์ commit์ ํ์ธํ๋ฉฐ ์์
์ ํ์๊ณ , pushํ ๋์ ๊ท์ฝ๊ฒ๋ ๋ค๊ฐ์ด ํ์ธํ๋ฉฐ ํ์๋ค๐
๊ทธ๋์ ๋ฌด์์ ๊ธฐ ๋๋ฌธ์
์ด๊ธฐ์ front์ back ์ํต์ ๋ถ์ฌ๋ก ์ด๊ธฐ ๋ฐฉํฅ์ ์๋ชป ์ก์ ์๊ฐ์ด ๋ง์ด ์ง์ฒด๋์๋ค.
๋ ์ํต์ด ์๋ผ์ ์๊ฒผ๋ ๋ฌธ์ ๋ก๋ ์งํ ์๋์ ์ฐจ์ด๊ฐ ์๋๋ฐ,
back์์๋ order๋ก์ง์ ์ง๊ณ ์์์ง๋ง front์์๋ order ํ์ด์ง๋ฅผ ์์ํ๊ธฐ์ ์๊ฐ์ด ์ด๋ฐํ๋ ๊ฒ.
๋จ์ ์๊ฐ์ ์๋ก์ ์งํ ์๋๋ฅผ ๋ฐฐ๋ คํ๊ณ ํ์๊ณผ์ ์ํต,
back๊ณผ front์ ์ํต ๋ฐฉ๋ฒ์ ๋ฐฐ์ฐ๋ ๊ฒ์ ํ๋ก์ ํธ ๋ฐฉํฅ์ ๋ฐ๊พธ์ด
1์ฐจ ํ๋ก์ ํธ๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ๋ ๋ง์ณค๋ค.๐
Klush-Backend-Presentation
๊ธฐ์น์ ๊ฒฐ ๋๋ ทํ ์ฐ๋ฆฌ klushํ์ ์ฌ๋ฌ๋ถ ์ฌ๋ํจ๋ค๐ธ
์ธ์๋ 1์ฐจ ํ์ ์ด๋ ค์ ๋ง์ผ์ จ์ํ ๋ฐ
์๊ณ ๋ง์ผ์ จ์ต๋๋ค ๐๐