3 ๋ถ„ ์†Œ์š”

๐Ÿ“‘ 1์ฐจ ํ”„๋กœ์ ํŠธ output ๋ฐ ์†Œ๊ฐœ


๋ฐฐํฌ ์™„๋ฃŒ : click โžก๏ธWETOWN

์ง์ ‘ ํ•ด๋ณด๊ธฐ โฌ†๏ธ





ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ ๐ŸŽฅ

ํด๋ก  ์‚ฌ์ดํŠธ : SMTOWN &STORE

ํŒ€ ๋ช… : WETOWN

ํ”„๋กœ์ ํŠธ ๋ชฉํ‘œ : Wecode์—์„œ ๋ฐฐ์šด๋‚ด์šฉ์„ ํ™œ์šฉํ•˜์—ฌ ํด๋ก  ์‚ฌ์ดํŠธ์˜ ๊ธฐ๋Šฅ๊ฐœ๋ฐœ ๋ฐ ๋ ˆ์ด์•„์›ƒ ๊ทธ๋ฆฌ๊ธฐ

์ง„ํ–‰๊ธฐ๊ฐ„ : 2021๋…„ 12์›” 27์ผ ~ 2022๋…„ 1์›” 7์ผ ( total : 14days )

wetown-1

ํ”„๋กœ์ ํŠธ ์ฐธ์—ฌ์ž : ์ด์ค€ํ˜, ๋ฐ•ํƒœ์ค€, ์ตœ์€๋น„, ํ™ฉํฌ์œค

Position : ๋‚˜์˜ ํฌ์ง€์…˜์€ backend ์˜€์œผ๋‚˜ ํŒ€ํšŒ์˜๋ฅผ ๊ฑฐ์ณ ๋‚˜์˜จ database tables์˜ ์ˆ˜๊ฐ€ ์ƒ๊ฐ๋ณด๋‹ค ์ ์—ˆ๊ณ  ํด๋ผ์ด์–ธํŠธ๋กœ ๋ณด๋‚ด์ค˜์•ผ ํ•  API ๋˜ํ•œ ๋ช‡๊ฐ€์ง€ ์—†์—ˆ๊ธฐ์— front๋„ ๊ฒธํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.


- ๊ธฐ์ˆ ์Šคํƒ -

FrontEnd ๊ธฐ์ˆ  ์Šคํƒ
โญ• [React]โญ• [Router]โญ• [Sass]โญ• [Restful API]โญ• [Git & GitHub]

BackEnd ๊ธฐ์ˆ  ์Šคํƒ
โญ• [Node.js]โญ• [Express]โญ• [MySQL]โญ• [Bcrypt, JWT]โญ• [Prisma]โญ• [babel]โญ• [Git & GitHub]

- Page & API -

์ด์ค€ํ˜
[front] ์ƒํ’ˆ์ƒ์„ธํŽ˜์ด์ง€, ์นดํŠธํŽ˜์ด์ง€[back] detail API, filter API

๋ฐ•ํƒœ์ค€
[front] ์ƒํ’ˆ๋ฆฌ์ŠคํŠธํŽ˜์ด์ง€, footer[back] cart API

์ตœ์€๋น„
[front] ๋กœ๊ทธ์ธํŽ˜์ด์ง€, ํšŒ์›๊ฐ€์ž…ํŽ˜์ด์ง€[PM] ํ”„๋กœ์ ํŠธ ์ „์ฒด์ ์ธ ์ผ์ •๊ณผ ๋ฐฉํ–ฅ์„ ์กฐ์œจ

ํ™ฉํฌ์œค
[front] ๋ฉ”์ธํŽ˜์ด์ง€, Nav[back] signin API, signup API

๐Ÿง‘โ€๐Ÿ’ป Backend (WETOWN)

ํŒ€ํšŒ์˜๋ฅผ ๊ฑฐ์ณ ๋‚˜์˜จ ์ฒซ Database schema modeling
wetown-2


๋ฆฌํŒฉํ† ๋ง์„ ํ•˜๋ฉฐ ๊ฐ€์žฅ ์žฌ๋ฐŒ์—ˆ๋˜ ์ฝ”๋“œ
wetown-3


const productFilter = async (
  category,
  is_subcategory,
  subcategory,
  sortMethod
) => {
  return await prisma.$queryRaw`
    SELECT
      products.id,
      eng_name,
      price,
      is_new,
      sale_rate,
      categories.name as cate_name,
      subcategories.name as subcate_name,
      url
    FROM
      products
    JOIN
      categories on category_id = categories.id
    JOIN
      images on products.id = images.product_id
    JOIN
      subcategories on subcategories.id = subcategory_id
    WHERE
      if(${is_subcategory},
        categories.name = ${category} and subcategories.name = ${subcategory} and images.is_main = true,
        categories.name = ${category} and  images.is_main = true)
    ORDER BY
      case WHEN ${sortMethod} = 1 then created_at end ASC,
      case WHEN ${sortMethod} = 2 then eng_name end ASC,
      case WHEN ${sortMethod} = 3 then price end ASC,
      case WHEN ${sortMethod} = 4 then price end DESC;
  `;
};

์›๋ž˜๋Š” API ์ฃผ์†Œ๋ฅผ category, subcategory ๊ฐ๊ฐ ์‚ฌ์šฉํ•˜์˜€๋Š”๋ฐ ๋ฉ˜ํ† ๋‹˜์ด ํ•˜๋‚˜๋กœ ํ•ฉ์ณ๋ณด๋ผ๊ณ  ํ•˜์˜€๋‹ค.

๊ทธ๋ž˜์„œ subcategory๊ฐ’๊ณผ sortMethod๊ฐ’์„ Query String์œผ๋กœ ๋ฐ›์•˜๊ณ  category๊ฐ’์€ Path Variable๋กœ ๋ฐ›์•˜๋‹ค.

subcategory๊ฐ’์˜ ์œ ๋ฌด์— ๋”ฐ๋ผ ํด๋ผ์ด์–ธํŠธ์— ์ฃผ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ฌ๋ฆฌํ•˜์˜€๊ณ 

order by์— case๋ฌธ์„ ์ฃผ์–ด sortMethod๊ฐ’์— ๋”ฐ๋ผ ์ •๋ ฌ๊ธฐ์ค€์„ ์ฃผ์—ˆ๋‹ค.

์ฒ˜์Œ์˜ ๋ฐฉ๋Œ€ํ•œ ์–‘์˜ ์ฝ”๋“œ๊ฐ€ ๋ฆฌํŒฉํ† ๋ง ํ›„ ํ™• ์ค„์–ด๋“ ๊ฒƒ์„ ๋ณด๋‹ˆ ๋ฟŒ๋“ฏํ•˜๋‹ค.

๐Ÿง‘โ€๐Ÿ’ป Front (WETOWN)

๋””ํ…Œ์ผํŽ˜์ด์ง€์™€ ์นดํŠธํŽ˜์ด์ง€๋ฅผ ๋งก์•˜๊ณ  ์ตœ๋Œ€ํ•œ ๋˜‘๊ฐ™์ด ๊ทธ๋ฆฌ๊ณ  ๊ธฐ๋Šฅ๋˜ํ•œ 90%์ •๋„๋กœ ๊ตฌํ˜„ํ•˜์˜€๋‹ค.
wetown-2


์—ฌ๋Ÿฌ๊ฐ€์ง€ ์žฌ๋ฐŒ๋Š” ์ฝ”๋“œ๋“ค์ด ์žˆ์—ˆ์ง€๋งŒ ์นดํŠธํŽ˜์ด์ง€์˜ ๊ฐ ์ƒํ’ˆ์˜ ์ˆ˜๋Ÿ‰๋ถ€๋ถ„์„ useState์˜ ๋ฐฐ์—ด๋กœ ๋‹ด์•„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์งค๋•Œ ๊ฐ€์žฅ ์žฌ๋ฐŒ์—ˆ๋‹ค.

wetown-2 wetown-2

DB์˜ carts ํ…Œ์ด๋ธ”์— ์ €์žฅ๋˜์–ด์žˆ๋Š” ๊ฐ ์ƒํ’ˆ์˜ ์ˆ˜๋Ÿ‰์„ fetchํ•จ์ˆ˜๋กœ ๋ถˆ๋Ÿฌ์˜ฌ๋•Œ

map์„ ๋Œ๋ ค productQuantity state์— ๋‹ด์•„ ๋ณด๊ด€ํ•œ๋‹ค.

CartList ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉ๋œ button์„ ํด๋ฆญ์‹œ์— ์ƒํ’ˆ์˜ ์ˆ˜๋Ÿ‰์ด ๊ฐœ๋ณ„์ ์œผ๋กœ ๋ฐ”๋€Œ์–ด์•ผํ•˜๋Š”๋ฐ

์ด๋•Œ productQuantity๋ฅผ Spread Opertor๋ฅผ ํ†ตํ•ด ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ๋Š์–ด copyํ•˜์—ฌ ํ•ด๋‹น ์ธ๋ฑ์Šค๋ฒˆ์งธ์˜ ๊ฐ’๋งŒ ๋ฐ”๊พธ์–ด set์‹œํ‚จ๋‹ค

front์ชฝ์„ ํ•˜๋‹ค๋ณด๋‹ˆ ์ข€ ๋” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šด ๋ชจ์–‘์œผ๋กœ API๋ฅผ ๋งŒ๋“ค์–ด์•ผํ•จ์„ ๋Š๊ผˆ๊ณ  ๋ฒ„ํŠผ ํ•˜๋‚˜ํ•˜๋‚˜์— hover๋“ฑ ๋””ํ…Œ์ผ์ด ์‚ด์•„์žˆ์–ด์•ผ์ง€๋งŒ ์œ„ํ™”๊ฐ์„ ๋Š๋ผ์ง€์•Š๋Š”๊ฒƒ์„ ์•Œ๊ฒŒ๋˜์—ˆ๋‹ค.

๐Ÿง‘ ํ˜‘์—… Git & Github

Communication ์Šคํƒ

Slack wetown-7 & Github wetown-7 & Notionwetown-7


wetown-7 wetown-8 wetown-8 wetown-8 wetown-8 wetown-8


ํ˜‘์—…์„ ์ง„ํ–‰ํ•˜๋ฉฐ ๊นจ๋‹ฌ์€์  ๋ฐ ์ข‹์€์ 


๐Ÿ”น ์ฝ”๋“œ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ›์œผ๋ฉฐ ๋‚ด๊ฐ€ ๋ชฐ๋ž๋˜๊ฒƒ๋“ค, ๊นœ๋นกํ–ˆ๋˜๊ฒƒ๋“ค ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ›์•„ ์—…๊ทธ๋ ˆ์ด๋“œ ๋˜๋Š” code๋ฅผ ๋ง›๋ณผ์ˆ˜์žˆ๋‹ค.

๐Ÿ”น ๋‚˜์™€๋Š” ๋‹ค๋ฅธ์ƒ๊ฐ์„ ๊ฐ–๊ณ  ์ง  ์ƒˆ๋กœ์šด code๋ฅผ ๊ฒฝํ—˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ”น ์‹œ๊ฐ„์•ฝ์†์„ ์ž˜์ง€ํ‚ค๋Š”๊ฒƒ์ด ์ •๋ง ์ค‘์š”ํ•˜๊ณ  ๊ทธ ์‚ฌ๋žŒ์— ๋Œ€ํ•œ ์‹ ๋ขฐ๋„๋ฅผ ๊ฒฐ์ •์ง“๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๋Š๋ผ๊ฒŒ๋˜์—ˆ๋‹ค.

๐Ÿ”น ๋‚ด ์ฝ”๋“œ๋ฅผ ๋‚ด๊ฐ€ ๋ฆฌ๋ทฐํ•˜๋ฉฐ ์–ด๋Š๋ถ€๋ถ„์€ ์ดํ•ด๊ฐ€ ์ž˜๋˜๊ณ  ์–ด๋Š๋ถ€๋ถ„์€ ์–ด๋ ต๋‹ค๋Š”๊ฒƒ์„ ์•Œ๊ฒŒ๋๊ณ  ์ฝ”๋“œ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์งœ๋Š”๊ฒƒ ๋ณด๋‹ค ๋‚จ๋“ค์ด ๋ดค์„๋•Œ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ์“ฐ๊ฒŒ ๋˜์—ˆ๋‹ค.

๐Ÿง‘ ํšŒ๊ณ 


ํŒ€์› ๋ชจ๋‘ ํ”„๋กœ์ ํŠธ ๊ฒฝํ—˜์ด ์ „๋ฌดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ดˆ๋ฐ˜์— ๊ณ ์ƒ์„ ์ข€ ํ•˜์˜€๋‹ค.

ํ•˜์ง€๋งŒ ํŒ€์›๋ถ„๋“ค์ด ๋ชจ๋‘ ์˜จํ™”ํ•œ ์„ฑ๊ฒฉ์„ ๊ฐ€์ง€๊ณ  ๊ณ„์‹ ํƒ“์ธ์ง€ ๋ถ„์œ„๊ธฐ ๋งŒํผ์€ ์ข‹์•˜๊ณ 

๋‹ค๋ฅธํŒ€๋“ค์— ๋น„ํ•ด ์˜๊ฒฌ์ถฉ๋Œ๋„ ๊ฑฐ์˜ ์—†์—ˆ๋‹ค.

( ์ฒซ ํ”„๋กœ์ ํŠธ๋ผ ์š•์‹ฌ๋ถ€๋ฆฌ์ง€๋ง๊ณ  ๊ธฐ๋ณธ์—๋งŒ ์ถฉ์‹คํ•˜์ž๋ผ๋Š” ์ƒ๊ฐ์œผ๋กœ ํšŒ์˜๋ฅผ ํ•ด์„œ ๊ทธ๋Ÿฐ๊ฐ€? )

๋ชจ๋‘๋“ค ์ž˜ํ•ด์ฃผ์—ˆ๊ณ  ๋ฌธ์ œ์—†์ด ์ง„ํ–‰๋˜๊ณ  ์žˆ์—ˆ๋‹ค.


ํ•˜์ง€๋งŒ ๊ทธ ์ˆœ๊ฐ„์ด ํƒœํ’์ด ๋ˆˆ์ด์—ˆ์„๊นŒโ€ฆ

back์€ ์ฝ”๋“œ๊ฐ€ ๊น”๋”ํ•˜๊ฒŒ ์ž˜์งœ์ ธ์„œ ๊ณง ๋ฐ”๋กœ ์ปค๋ฐ‹, ํ‘ธ์‰ฌ๋ฅผ ํ•˜์˜€์ง€๋งŒ

front๋Š” ์ฝ”๋“œ๊ฐ€ ๋”๋Ÿฝ๊ณ  ์•Œ์•„๋ณด๊ธฐ ํž˜๋“ค๊ฒƒ ๊ฐ™์•„ ๋‚ด์„ ์—์„œ ์•ฝ๊ฐ„์˜ ๋ฆฌํŒฉํ† ๋ง์„ ๊ฑฐ์น˜๊ณ  ์ปค๋ฐ‹์„ ํ•œ๋‹ค๋Š”๊ฒŒ

ํ•˜๋ฃจ..์ดํ‹€..์ผ์ฃผ์ผ์ด ์ง€๋‚˜๋„๋ก ํ•œ๋ฒˆ๋„ ์ปค๋ฐ‹์„ ํ•˜์ง€ ์•Š๊ณ  ์žˆ์—ˆ๋˜ ๊ฒƒ์ด๋‹ค.

๊ทธ์ œ์„œ์•ผ ๋‚ด๊ฐ€ํ•œ๊ฒƒ์„ ํ‘ธ์‹œํ•˜๊ธฐ ์œ„ํ•ด develop ๋ธŒ๋žœ์น˜์—์„œ pull์„ ๋ฐ›์•˜๋Š”๋ฐ ์ถฉ๋Œ์ด ๋‚ฌ๊ณ 

pull, branch ๋“ฑ Git์— ๋Œ€ํ•ด ์ œ๋Œ€๋กœ๋œ ์ˆ™์ง€๋ฅผ ๋ชปํ•˜๊ณ  ์žˆ๋˜ ๋‚˜๋Š” ์ด๊ฒƒ์ €๊ฒƒ ์‹œ๋„ํ•ด๋ณด๋‹ค

์ผ์ฃผ์ผ์น˜์˜ ํŒŒ์ผ์ด ํ†ต์งธ๋กœ ์‚ฌ๋ผ์ง€๊ฒŒ ๋˜์—ˆ๋‹ค..


๋ˆˆ์•ž์ด ์บ„์บ„ํ•ด์กŒ๊ณ  ํ˜„์‹ค์„ ๋ฐ›์•„๋“ค์ด๊ธฐ ์–ด๋ ค์› ์ง€๋งŒ

ํŒ€์›๋“ค์—๊ฒŒ ๋„ˆ๋ฌด ๋ฏธ์•ˆํ•œ ๋งˆ์Œ์— ์ดˆ์ธ์ ์ธ ์Šคํ”ผ๋“œ๋กœ ๋‹ค์‹œ ๊ทธ๋ฆฌ๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค.

๋ฐฑ์—…ํŒŒ์ผ์˜ ํ•„์š”์„ฑ์„ ๋ผˆ์ €๋ฆฌ๊ฒŒ ๋Š๊ผˆ๊ณ  ๊ฒฐ๊ตญ ๊ทธ ๋‚  ๋ฐค์„ ์ƒˆ์›Œ ๋˜‘๊ฐ™์ด ๋‹ค์‹œ ๊ตฌํ˜„ํ•ด๋ƒˆ๋‹ค.


๊ทผ๋ฐ ์˜คํžˆ๋ ค ์‹ค์ˆ˜๋ฅผ ํ•˜๊ณ  ๋‚˜๋‹ˆ ์ข‹์€์ ๋“ค์ด ๋” ๋งŽ์ด ํŒŒ์ƒ๋˜์—ˆ๋‹ค.

๊ทธ ๋‚  ์ดํ›„ ๊ธฐ๋Šฅ๋‹จ์œ„๋กœ ์ปค๋ฐ‹์„ ๋ฌด์กฐ๊ฑดํ•˜์˜€๊ณ  ๋…ธํŠธ๋ถ์„ ๋‹ซ๊ธฐ์ „์—๋Š” backupํŒŒ์ผ์„ ๋งŒ๋“ค์–ด ๋‘๋Š”๊ฒƒ์ด ์Šต๊ด€ํ™” ๋˜์—ˆ๋‹ค.

๋˜ํ•œ ์†์ด ๋นจ๋ฆฌ์ง€๊ฒŒ ๋˜์—ˆ๊ณ  Git์— ๋Œ€ํ•ด ์ œ๋Œ€๋กœ ์ˆ™์ง€๊ฐ€ ๋˜์—ˆ๋‹ค. ( ๋ชจ๋ฅผ๋• ์‹ ์ค‘ํ•˜๊ฒŒ ๋Œ€์ฒ˜ํ•˜๋Š”๊ฑด ๋ค )


์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ํ†ตํ•ด ์ •๋ง ๋งŽ์€๊ฒƒ์„ ์–ป๊ฒŒ๋˜์—ˆ๊ณ 

ํ•จ๊ป˜ํ•œ ํƒœ์ค€๋‹˜, ์€๋น„๋‹˜, ํฌ์œค๋‹˜ ๋ชจ๋‘ ์ž˜ํ•ด์ฃผ์…”์„œ ๊ณ ๋ง™์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

์—…๋ฐ์ดํŠธ: