-
Leader : ์ฅ์ ํ
-
Member : ๊น์ ์ฃผ
-
Member : ์ด์ฌํ
-
Member : ๊น์์ค
-
Team Address : JJJJ
-
Team Notion : notion
-
Reference Page
-
Intro
๊ธฐ์กด์ ๋ชฉํ ํ์ด์ง๋ฅผ ํ ๋๋ก ํ์๊ฐ์ ์ ํตํด ์ ์ํ ์ฌ์ฉ์๋ค์ด ์ํ๋ ์ํ์ ๊ฒ์ํ๊ฑฐ๋ ์ฅ๋ฐ๊ตฌ๋์ ๋ด์ ํธ๋ฆฌํ๊ฒ ์ ๊ทผ ํ ์ ์๋ ํํ์ด์ง ์ ์ ๊ณํ
-
Purpose
Front๊ธฐ๋ฐ์ React์ BackEnd๊ธฐ๋ฐ์ Node.js(express) ๋ฐ DB๋ฅผ ๊ฒฐํฉํ ์น ํ์ด์ง ๊ฐ๋ฐ
-
ํ์๊ด๋ฆฌ
ํ์๊ฐ์ , ๋ก๊ทธ์ธ, ๋ก๊ทธ์์
๋ง์ดํ์ด์ง๋ฅผ ํตํด ์ฑ๋ช , ์ด๋ฉ์ผ, ์ฃผ์, ์ ํ๋ฒํธ, ์ด๋ฉ์ผ ๋ฑ ๊ฐ์ธ์ ๋ณด ์์ ๊ฐ๋ฅ
-
์ํ ์ฅ๋ฐ๊ตฌ๋ ๊ด๋ฆฌ ๊ธฐ๋ฅ
๊ฐ ์ํ ๋ณ๋ก ์ฅ๋ฐ๊ตฌ๋์ ์ถ๊ฐ ๊ธฐ๋ฅ
๊ฐ๊ฐ์ธ์ ์ฅ๋ฐ๊ตฌ๋ ๋ด์ญ
์ํ ์ญ์ ๊ธฐ๋ฅ
-
์ํ ๊ฒ์ ๊ธฐ๋ฅ
์ฌ์ฉ์๊ฐ ์ํ๋ ์ํ์ ์์ ๋กญ๊ฒ ๊ฒ์
์ ๋ ฅํ ๊ฒ์์ด๋ฅผ ํฌํจํ ์ํ๋ค ์ ๋ถ ๋์ด
-
์ํ ๊ตฌ๋งค ๊ธฐ๋ฅ
์ฌ์ฉ์๊ฐ ์ฅ๋ฐ๊ตฌ๋์ ๋ด์ ์ ์ฒด ์ํ ๊ตฌ๋งค
์ฒดํฌ์์์ ํตํด ๊ตฌ๋งคํ ๋ด์ญ์ ๋ง์ดํ์ด์ง์์ ํ์ธ ๊ฐ๋ฅ
-
๊ด๋ฆฌ์ ํ์ด์ง
๊ด๋ฆฌ์ ์ด๋ฉ์ผ์ ํตํด ์ํ๋ฑ๋ก ๊ฐ๋ฅ
๋ชจ๋ ์ํ๋ค์ ๋ชฉ๋ก์ ๋ณผ ์ ์๊ณ , ์ญ์ ๋ํ ๊ฐ๋ฅํ ๊ด๋ฆฌ์ ํ์ด์ง
- DB(Tesla) - Tables(User, Product, Cart, Order)
- ํ
์ด๋ธ์ ๋ฐ๋ฅธ ์ปฌ๋ผ๋ช
ํ์
- User ํ
์ด๋ธ
- columns : userEmail, userPw, userLastName, userFirstName, userAddress, userAddressDetail, userPhone
- Product ํ
์ด๋ธ
- columns : productName, productModel, productPrice, productAccount, productInfo, productImg, productHoverImg, productCategory
- Cart ํ
์ด๋ธ (Product ํ
์ด๋ธ๊ณผ 1:N ๊ด๊ณ, User ํ
์ด๋ธ๊ณผ 1:N ๊ด๊ณ)
- columns : account, productId, userId
- Order ํ
์ด๋ธ (Product ํ
์ด๋ธ๊ณผ 1:N ๊ด๊ณ, User ํ
์ด๋ธ๊ณผ 1:N ๊ด๊ณ)
- columns : account, productId, userId
- User ํ
์ด๋ธ
- ํ
์ด๋ธ์ ๋ฐ๋ฅธ ์ปฌ๋ผ๋ช
ํ์
Visual Studio Code Version 1.73.1
Node.js Version 16.14.2
OS : Window x64 / MacOS : Ventura 13.1
-
In 'express' Directory (express)
- 'config' Directory (config.json ๋ด password ์ค์ )
{ "development": { "username": "root", "password": "password ์ค์ ", "database": "tesla", "host": "127.0.0.1", "dialect": "mysql" }, "test": { "username": "root", "password": "password ์ค์ ", "database": "tesla", "host": "127.0.0.1", "dialect": "mysql" }, "production": { "username": "root", "password": "password ์ค์ ", "database": "tesla", "host": "127.0.0.1", "dialect": "mysql" } }
- 'config' Directory (config.json ๋ด password ์ค์ )
- In 'express' Directory (Express)
npm install
- In 'project' Directory (React)
yarn install
-
Main, Admin Pages
-FrontEnd
-
๐โโ๏ธ์ฅ์ ํ
-
์ ์ ์ธ ํ์ด์ง
-
Header & Body & Footer Component ์์ฑ
-
์ต์๋จ ์คํฌ๋กค์ด ์๋๋ Header color, background-color ์กฐ์
-
Header ์ผ์ชฝ ํด๋ฆญ ์ (โ/โ) ์ฃผ์๋ก ๋ฉ์ธ ํ์ด์ง ์ด๋
-
Header ์ค๋ฅธ์ชฝ RightBanners ํด๋ฆญ ์ ํด๋น ์ปดํฌ๋ํธ๋ก ์ด๋ ๊ฒฝ๋ก ์ค์
-
Body ์ปดํฌ๋ํธ ์ฒซ ์ฌ๋ผ์ด๋ ๋ถํธ์คํธ๋ฉ ํ์ฉํ์ฌ ๊ตฌํ
-
Body ์ปดํฌ๋ํธ์ ๋๋ฒ์งธ ์ฌ๋ผ์ด๋๊ฐ ์๋ ๊ฐ๊ฒฉ์์ผ๋ก 10๊ฐ ์ํ๋ฅผ ์ค๋ฆ/๋ด๋ฆผ์ฐจ์
-
Body ์ปดํฌ๋ํธ ๋ง์ง๋ง ์์ญ์ ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด์ map๋ฅผ ์ด์ฉํ์ฌ ๋ฐฐ์ด ํ๊ณ ๋ง์ง๋ง์ผ๋ก ์๋ฅ ๊ด๋ จ ์์ญ์ ๋ค์ ์ปดํฌ๋ํธํ ํ์ฌ์ ๋ฐฐ์น
-
Header ์๋จ ๋ฐ์ ์ค๋ฅธ์ชฝ ๋ฐฐ๋์์ ๋ฉ๋ด ๋ผ๋ ๊ธ์จ๋ฅผ ๋์ ํ์ฌ ์์ด์ฝ์ ๋ฐฐ์นํ๊ณ ํด๋น ์์ด์ฝ์ ํด๋ฆญ ์ ์ค๋ฅธ์ชฝ์์ ์๋ก์ด ๋ฉ๋ด๋ฐ๊ฐ ๋์ค๊ณ ๋ฉ์ธ ํ์ด์ง๋ ์์์ ์ผ๋ก ๋ฐํฌ๋ช ํจ๊ณผ ์ ์ฉ
-
๋ฉ๋ด ์์ด์ฝ์ด ์ ์ฉ๋ ํ ๋๋ ์ ๋ ๋์ค๋ ์ค๋ฅธ์ชฝ ๋ฉ๋ด๋ฐ์ ๋ก๊ทธ์ธ ๋ฒํผ์ ์ถ๊ฐํ์ฌ ๋ก๊ทธ์ธ(ํ์๊ฐ์ )์ด ๊ฐ๋ฅํ ํ์ด์ง๋ก ๊ฒฝ๋ก ์ค์
-
๋ฉ์ธํ์ด์ง์ Header ๊ฐ์ด๋ฐ Category๋ค์ hover ์ ํด๋น ๋ฉ๋ด์ ์ ๊ทผํ ์ ์๋ dropdown ๋ฉ๋ด ๋ชฉ๋ก ์์ฑ
-
๋ฉ์ธํ์ด์ง์ Header ์ฐ์ธก์ ๋๋ณด๊ธฐ๋ฅผ ํด๋ฆญํ๋ฉด ์ ๋ ฅํ ์ ์๋ ๊ฒ์์ฐฝ์ด ๋ํ๋๊ณ ๋ค์ ๋๋ฅด๋ฉด ์์ด์ง๋ ๊ธฐ๋ฅ ๊ตฌํ
-
๊ฒ์์ฐฝ์ ์ ๋ ฅ๋ ๊ฐ์ queryString์ ๋ด์ ๋ค๋ฅธ ํ์ด์ง์์ ์ ๋ ฅํ ๊ฐ์ ์ฌ์ฉํ ์ ์๋๋ก ์ ๋ฌ
-
๋น๋ก๊ทธ์ธ ์ ์ฅ๋ฐ๊ตฌ๋๋ฅผ ํด๋ฆญ ํด๋ ํด๋น ํ์ด์ง๋ก ๊ฒฝ๋ก ์ด๋ ํ ์ ์๋๋ก ์ฒ๋ฆฌ
-
Admin Page ๊ธฐ๋ณธ ์ ์ ์ UI ๊ตฌ์กฐ ๊ณํ ๋ฐ ๊ตฌํ
-
์ ๋ ฅํ Input ํ๊ทธ๋ค ๊ณํ ๋ฐ ์์ฑ
-
๋ฐ์ํ ์นํ์ด์ง ๊ตฌํ
-
๊ธฐํ ๋ณด์ ์์
-
-
-BackEnd
-
๐โโ๏ธ์ฅ์ ํ
-
๋ฉ์ธ ํ์ด์ง์์ ์ ์ ๋ก๊ทธ์ธ || ๊ด๋ฆฌ์ ๋ก๊ทธ์ธ ์ฟ ํค๋ฅผ ํตํด ํ์ธ ํ ์ํ๋ฑ๋ก ๊ฐ๋ฅํ ๋ฉ๋ด ๋ฒํผ ์ถ๋ ฅ ์ ๋ฌด ์กฐ์
-
๋ฉ์ธ ํ์ด์ง ์ธ๋ฒ์งธ ์์ญ์์ ์ง๊ธ ์ผํํ๊ธฐ ๋ฒํผ์ ๋๋ฌ์ Category๋ณ๋ก ์ด๋ํ ์ ์๊ฒ ๊ฒฝ๋ก ์ค์
-
multer ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํ ๋ชจ๋ ์ ๋ ฅ๊ฐ axios ํต์
-
express server ์ ์ฅ๋ product.json ํ์ผ์ ์ฝ๊ณ axios ํต์ ์ผ๋ก ๋ฐ์ ๋ฐ์ดํฐ ๋ฐฐ์ด์ ๊ด๋ฆฌ ์ํ ๋ชฉ๋ก ํ์ด์ง
-
๊ด๋ฆฌ์ ์ด๋ฉ์ผ๊ณผ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅํ๋ฉด ๊ด๋ฆฌ์ ํ์ด์ง๋ก ์ด๋ํ ์ ์๋๋ก ์ค์
-
๊ด๋ฆฌ์ ํ์ด์ง์์ ์ ์ฒด ์ํ๋ค์ ๊ด๋ฆฌํ ์ ์๋ ๊ด๋ฆฌ์ ์ํ ๋ชฉ๋ก ํ์ด์ง
-
-
Regist, LogIn, LogOut Pages
-FrontEnd
-
๐ฉ๊น์ ์ฃผ
-
์ ์ ์ธ UI ๊ตฌ์กฐ
-
๊ฐ๊ฐ์ ์ ๋ ฅ ์ฐฝ์ ๋ํ ์์ธ์ฒ๋ฆฌ๋ ์ ๊ทํํ์์ ์ด์ฉ, test ๋ฉ์๋๋ฅผ ํตํ์ฌ ๊ฒฝ๊ณ ๋ฉ์์ง ์ถ๋ ฅ
-
๊ฐ์ ์๋ฃ ์ ๋ก๊ทธ์ธ ํ์ด์ง๋ก ์ด๋
-
ํ์๊ฐ์ ํ์ด์ง์์๋ ๋ฉ์ธํ์ด์ง(โ/โ)์ผ๋ก ๊ฐ ์ ์๊ฒ Header์ถ๊ฐ
-
Enter ๊ณ์ ์์ฑํ๊ธฐ onClick
-
์ด๋ฉ์ผ์ ์์ฑํ๊ณ ๋ค์ ๋ฒํผ์ ๋๋ฅด๋ฉด ์ด๋ฉ์ผ์ด ๋ก๊ทธ์ธ ๊ด๋ จ ๋ชจ๋์ ์ ์ฅ
-
๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅํ๊ณ ๋ก๊ทธ์ธ ๋ฒํผ์ ๋๋ฅด๋ฉด ๊ฐ์ ํ ๋ชจ๋์ ํ์์ ๋ณด๋ค์ ๊ฐ์ง๊ณ ์์ ์ด๋ฉ์ผ๊ณผ ๊ต ํ ์ผ์นํ ์ ๋ณด๋ค์ด ์์ผ๋ฉด ๋ฉ์ธํ์ด์ง๋ก ์ด๋
-
๋ก๊ทธ์ธ ํ์ด์ง์์๋ ๋ฉ์ธํ์ด์ง(โ/โ)์ผ๋ก ๊ฐ ์ ์๊ฒ Header์ถ๊ฐ
-
Enter ํค๋ก ๋ก๊ทธ์ธ ๊ฐ๋ฅ
-
๊ธฐํ ๋ณด์ ์์ ๋ฐ ๋ฐ์ํ
-
-
-BackEnd
-
๐ฉ๊น์ ์ฃผ ๐โโ๏ธ์ฅ์ ํ
-
ํ์๊ฐ์ ์ ์ค๋ณต๊ฐ์ ์ ๋ง๊ธฐ ์ํ ์ฒ๋ฆฌ
-
ํ์๊ฐ์ ์ DB ์ ์ฅ(ํด๋น column๋ค์ ๋ง๋ค์ด ์ ์ฅ)
-
๋ก๊ทธ์ธ ์ ์ ๋ ฅํ ์ ๋ณด๋ค์ด ( ์ด๋ฉ์ผ๊ณผ ๋น๋ฐ๋ฒํธ ) ์ผ์น ํ์ง ์์ผ๋ฉด ์ด๋ ์๋๊ฒ ์์ธ์ฒ๋ฆฌ
-
-
Search, Cart Pages
-FrontEnd
-
๐จ์ด์ฌํ
-
react / css ๊ธฐ๋ณธํ ์ก๊ธฐ
-
์์นํ์ด์ง ์ ์ ์ธ ํ์ด์ง ๊ตฌํ
-
Search Page ์ ๋ฌผํ List ํ์ ๋ฐํ
-
๊ฒ์ Input ์ฐฝ์ ๊ฒฐ๊ณผ๋ฅผ Search Page์ ์ ๋ฌ
-
Search Page ๊ฒ์ ๊ฒฐ๊ณผ์ ๋ฐ๋ฅธ ๋ฌผํ ๋ฐฐ์น
-
Search ๋ก์ง๊ตฌํ
-
Search ๋ฌผํ ์์ธํ์ด์ง ์ฐ๊ฒฐ
-
๋ถ๋ถ์ ์ผ๋ก๋ ๊ฒ์์ด ๋๋ search ๋ก์ง
-
-
-BackEnd
-
๐จ์ด์ฌํ ๐ถ๊น์์ค
-
Search Page ๊ฒ์ ๊ฒฐ๊ณผ ์ ๋ณด ์ ๋ฌ
-
Cart Page ๋ฌผํ List ํ์ ๋ฐํ
-
Cart Page ๋ฌผํ List ์ ๊ฑฐ ๊ธฐ๋ฅ ๊ตฌํ
-
Cart Page json ํ์ผ ์ฐ๊ฒฐ
-
Cart Page ์๋ , ๊ฐฏ์์ ๋ฐ๋ฅธ ๊ฐ๊ฒฉ ์ฐ๊ฒฐ(์๋)
-
-
Cart, Chart Pages
-FrontEnd
-
๐ถ๊น์์ค
-
์ด๋ฏธ์ง ์ฌ๋ผ์ด๋ -์ข์ฐ ๋ฒํผ์ผ๋ก ์ฌ๋ผ์ด๋ ํ์ด์ง ์กฐ์ -์ด๋ฏธ์ง ๋ฐ์ ์ชฝ์ ์ปดํฌ๋ํธ ์์ฑ -์ด๋ฏธ์ง ์ฌ์ง์ผ๋ก๋ ์ฌ๋ผ์ด๋ ํ์ด์ง ์กฐ์
-
์ํ์ ๋ฐ๋ฅธ ๊ณ ์ router query ์ฃผ์๊ฐ ๊ตฌํ
-
์ฅ๋ฐ๊ตฌ๋ ๋ชฉ๋กํ ํ๋ ์ปดํฌ๋ํธ ์ ์
-
media query๋ฅผ ํตํ ๋ฐ์ํ ๊ตฌํ
-
-
-BackEnd
-
๐ถ๊น์์ค ๐จ์ด์ฌํ
-
์ฒดํฌ์์ button ํด๋ฆญ ์ ํด๋น ์ฅ๋ฐ๊ตฌ๋ ๋ด์ญ๋ค ์ฃผ๋ฌธ๋ด์ญ ํ ์ด๋ธ๋ก ์ด๋๋๋ฉด์ ์ฅ๋ฐ๊ตฌ๋ ํ ์ด๋ธ์์ ์ญ์
-
DB์์ data ๋ฐ์์ ์ด๋ฏธ์ง ์ฌ๋ผ์ด๋ ๋ฐ ์ํ ์ ๋ณด ๊ตฌํ
-
์ฅ๋ฐ๊ตฌ๋ ์๋์ ๋ฐ๋ฅธ ๊ฐ๊ฒฉ์ ๋ณํ ๊ตฌํ โ ์ฃผ๋ฌธ์์ ์ดํฉ ๊ธ์ก๋ณํ๊น์ง
-
์ฅ๋ฐ๊ตฌ๋ ๋ชฉ๋ก์ ์ ๊ฑฐํ๋ ๊ธฐ๋ฅ ๊ตฌํ
-
์ฅ๋ฐ๊ตฌ๋ ๋ชฉ๋ก๊ณผ DB์ ์ฐ๊ฒฐ
-
์ฅ๋ฐ๊ตฌ๋ DB์ ๋ฐฐ์ด cartList ์ฐ๊ฒฐ
-
-
User Mypage, Order Pages
-FrontEnd
-
๐ฉ๊น์ ์ฃผ
-
์ ์ ์ ๋ง์ดํ์ด์ง์์ ์ ๊ทผํ ์ ์๋ ๋ฐฐ๋์ ๊ฒฝ๋ก ์ค์
-
์ ์ ์ธ UI ํ์ด์ง ๊ตฌ์กฐ ๋ฐ ๊ตฌํ
-
-
-BackEnd
-
๐ฉ๊น์ ์ฃผ ๐โโ๏ธ์ฅ์ ํ ๐ถ๊น์์ค
-
์ฅ๋ฐ๊ตฌ๋์ ๋ด์ ์ํ๋ค์ด ์ฒดํฌ์์์ ๋๋ ์ ๋ db Order ํ ์ด๋ธ์ ์์ฑ
-
Order ํ ์ด๋ธ์ ๋ค์ด๊ฐ ์ํ๋ค์ Cart ํ ์ด๋ธ์์ ์ ๊ฑฐ
-
Order ํ ์ด๋ธ์ ๋ด๊ธด ์ ๋ณด๋ค์ Front์ ์ ์์ ์ผ๋ก ์ถ๋ ฅ
-
-
main
-
dev
-
itemInfo
- itemInfo UI ์์ฑ, orderPage UI์์ฑ
-
search
- ๊ฒ์ํ์ด์ง ์ ์ ์ธ ๊ธฐ๋ณธํ, ๊ฒ์ ํ๋ชฉ๋ค ๋ฐฐ์ด๋ฐฉ์์ผ๋ก ๊ตฌ์กฐ ์ค๊ณ
-
regist
- ํ์๊ฐ์ ํ์ด์ง UI ๊ด๋ จ
-
cart
- ์ฅ๋ฐ๊ตฌ๋ ํ์ด์ง UI
-
mainpage
- ๋ฉ์ธ ํํ์ด์ง UI ๊ด๋ จ
-
dropdown
- Header ์นดํ ๊ณ ๋ฆฌ ์ ๋๋ฉ์ด์ ์ถ๊ฐ
-
productList, gallery
- dummy jsonํ์ผ๊ณผ ๊ฒ์๊ฒฐ๊ณผ ํ์ด์ง ์ฐ๊ฒฐ
-
userclone
- ํ์๊ฐ์ , ๋ก๊ทธ์ธ, ๋ก๊ทธ์์ ๊ธฐ๋ฅ ๊ตฌํ
-
chartpage
- ์ฐจํธํ์ด์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ถ๊ฐ
-
hover
- ์ํ ์ด๋ฏธ์ง ๋ง์ฐ์ค ํธ๋ฒ ์ ๋ค๋ฅธ ์ด๋ฏธ์ง ์ถ๋ ฅ ๊ธฐ๋ฅ ๊ตฌํ
-
adminlist
- ๊ด๋ฆฌ์ ์ํ๋ชฉ๋ก ํ์ด์ง UI ์ถ๊ฐ
-
multerdb
- ๊ด๋ฆฌ์ ์ํ๋ฑ๋ก ํ DB ์ฐ๋ ๊ธฐ๋ฅ ๊ตฌํ
-
cartdb
- ์ฅ๋ฐ๊ตฌ๋ ํ์ด์ง DB ์ฐ๋ ๊ตฌํ
-
cartback
- ์ฅ๋ฐ๊ตฌ๋ ํ์ด์ง express ํต์ ๊ตฌํ
-
productpage
- ์ํ์์ธํ์ด์ง Header, Footer Comp ์ฐ๊ฒฐ
-
associate
- Database ๊ฐ ํ ์ด๋ธ๋ณ ๊ด๊ณํ ์ค์
-
auth
- ์ ์ ์ ๋ณด db์ ์ถ๊ฐํ๋ ๊ธฐ๋ฅ ๊ตฌํ
-
backback
- ๊ฒ์๊ฒฐ๊ณผํ์ด์ง ์ํ ์ด๋ฏธ์ง ๋ฐ์ค ์กฐ์
-
routing
- ์ ์ฒดํ์ด์ง ๊ฒฝ๋ก ์ฌ ์ค์
-
cart-exception, checkcart
- ์ฅ๋ฐ๊ตฌ๋ ํ์ด์ง ์์ธ์ฒ๋ฆฌ
-
user
- ๊ธฐ์กด์ ์๋ loginNext ํด๋ ์ญ์
-
adcookie
- ๊ด๋ฆฌ์ ์ ์ฉ ์ฟ ํค ์์ฑ ๋ฐ ์ญ์ ๊ธฐ๋ฅ ๊ตฌํ
-
cookies
- ์ฌ์ฉ์์ ๊ด๋ฆฌ์ ๋๊ฐ์ ์ฟ ํค ์์ฑ ๋ฐ ์ญ์ ๊ตฌํ
-
authdb
- ์ฌ์ฉ์ ๋น๋ฐ๋ฒํธ ๊ด๋ จ
-
cookieking
- ๊ฐ ํ์ด์ง์์ ์ฟ ํค ์ฌ๋ถ ํ๋จ ๊ธฐ๋ฅ ๊ตฌํ
-
cart-order
- ์ฅ๋ฐ๊ตฌ๋์ ์ฃผ๋ฌธ์ฐฝ ๊ธฐ๋ฅ ์ถ๊ฐ
-
adminui
- ๊ด๋ฆฌ์ ํ์ด์ง UI ๋ณด๊ฐ
-
totalPrice
- ์ฅ๋ฐ๊ตฌ๋ ํ์ด์ง์ ์ฃผ๋ฌธ์ฐฝ ์ด ๊ฐ๊ฒฉ ๊ณ์ฐ ๊ธฐ๋ฅ ์ถ๊ฐ
-
pm
- ํ๋ก์ ํธ ์ ์ฒด ์ด๊ด ๊ธฐ๋ฅ ๋ณด์
-
chartPage
- ์์ธํ์ด์ง UI ์์
-
cartcart, goodcart
- ์ฅ๋ฐ๊ตฌ๋ํ์ด์ง ๊ด๋ จ ๋ณด์
-
authuser
- ์ ์ ๋ง์ดํ์ด์ง ๊ตฌ๋งค๋ด์ญ ํ์ด์ง ์ถ๊ฐ
-
responweb
- ๋ฉ์ธํ์ด์ง ๋ฐ ๊ด๋ฆฌ์ ํ์ด์ง ๋ฐ์ํ ์นํ์ด์ง ๊ตฌํ
-
mediaQuery-cart
- ์ฅ๋ฐ๊ตฌ๋ ์ฃผ๋ฌธ์์ญ ๋ฐ์ํ ์นํ์ด์ง ๊ตฌํ
-
issue-kyj
- buyList ๋ฐ์ํ ์นํ์ด์ง ๊ตฌํ
-
feedback
- ํ ์์ฒด ์ต์ข
dev ์ด๊ด ์์ ๋ณด์ ๊ด๋ จ
- ํ ์์ฒด ์ต์ข
dev ์ด๊ด ์์ ๋ณด์ ๊ด๋ จ
-
-
Notion : RESTFUL API
์ ํ
์ด์์ฌํญ 1)
(22.12.15) ํ๋ก ํธ์์ ๋ก๊ทธ์ธ ์ axios ํต์ ์ ์ด์ฉํ์ฌ ๋ฐฑ์๋ ์๋ฒ์ ์์ฒญ์ ์ฃผ๊ณ ํด๋น ์์ฒญ์ ๋ํ ์ ๋ณด๋ค์ด ์ผ์นํ๋ฉด res.cookie๋ฅผ ํตํด jwt๋ก ์ฟ ํค๋ฅผ ์์ฑ ํ์๋ค. ์ดํ ๋ฐฑ์๋ ์๋ฒ์์ ํ๋ก ํธreact์ชฝ์ผ๋ก ํต์ ์ ์๋ตํ์์ง๋ง, ์ฟ ํค๊ฐ ์๊ฐํ๋๋๋ก ๋ณด์ฌ์ง์ง ์์๋ค. ์์ธํ ๋ณด๋ ๋คํธ์ํฌ ์ชฝ ์ฟ ํค๋ ๋์ด์์ง๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ชฝ์์ ํ์ธ ๋ถ๊ฐ ํ์๋ค.
ํด๊ฒฐ : React ์ต์์ index.js๊ณผ express ์ต์์ index.js์ ํ์ํ ์ฝ๋ ์ถ๊ฐ
axios.defaults.withCredentials = true; app.use(cors({ origin: "http://localhost:3000", credentials: true }));
์ด์์ฌํญ 2)
(22.12.19) ๊ธฐ์กด์ ์ฌ์ฉํ๋ dummy ๋ฐ์ดํฐ ํ์ผ (product.json) axios ํต์ ํด์ jsonํ์ผ ์ ์ฒด๋ฅผ forEach๋ฉ์๋๋ฅผ ํตํด ํต์ ํ ๋ ๋ง๋ค jsonํ์ผ์ ์ฝ๊ณ db์ Product ํ ์ด๋ธ์ ๋ฐ์ดํฐ์ ์๊ด์์ด ๋งค๋ฒ ๋ฐ์ดํฐ ์ฝ์ ๋๋ ์ด์ ๋ฐ์
ํด๊ฒฐ: axios ํต์ ์ ํ์ฌ Product ํ ์ด๋ธ์ ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด dummy ํ์ผ ์ฝ๊ณ ์ปฌ๋ผ๋ช ์ ๋ง์ถฐ์ create๋ฌธ์ผ๋ก ๋ฐ์ดํฐ ์ฝ์ ์๋๋ฉด Product ํ ์ด๋ธ ์ ์ฒด findAll ํ ๋ฆฌ์คํธ๋ฅผ ํ๋ก ํธ ์ชฝ์ผ๋ก ์๋ตํด์ค๋ค.
์ ์ฃผ
์ด์์ฌํญ 1)
(22.12.12) html / css ์๋ ๋ค๋ฅด๊ฒ img ํ๊ทธ์ hover ์ ๋ฐ๋ก ๋ฐ์ํ์ง ์๋๋ค.
ํด๊ฒฐ : ๋ฆฌ์กํธ์์์ hover๋ ๋ถ๋ชจ ํ๊ทธ๋ฅผ ํตํด ์์ ํ๊ทธ์ ์ ์ฉ๋๋ ๊ฒ์ผ๋ก img ํ๊ทธ๋ ์์ ํ๊ทธ๋ฅผ ๊ฐ์ง ๋ชปํ๊ธฐ์ ๋ถ๋ชจ ํ๊ทธ๋ฅผ ๊ฐ๊ฒ ํจ์ผ๋ก hover ๊ฐ ์๋๋๋ ๊ฒ์ ๋ณผ ์ ์์๋ค.
์ด์์ฌํญ 2)
(22.12.27) ๋ฐ์ํ ํ์ด์ง ๊ตฌํ ์ @media only screen and(max-width: **_px) ์ @media only screen and(min-width: _**px)๋ฅผ ๊ฐ์ด ์ฌ์ฉํ ๊ฒฝ์ฐ ๋ฐ์ํ์ด ์ํ๋ ๋๋ก ์ ์ฉ๋์ง ์์๋ค
ํด๊ฒฐ : @media only screen and(max-width: ***px)๋ก ํต์ผํ์ฌ ์ฌ์ฉํ๋ค.
์ด์์ฌํญ 3)
(22.12.28) ๋ก๊ทธ์ธ ์ ๋ณด ์์ ํ๊ธฐ ํด๋ฆญ ์ useState("๋ก๊ทธ์ธ ์ ๋ณด")๋ก ์ค์ ํด๋ ์์ ์ ์ํ ๋ชจ๋ฌ์ฐฝ input ๊ฐ์ด ์ ์ ์ ์ ๋ณด๊ฐ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋ค์ด์์ง ์๊ณ ๋น ๊ฐ์ผ๋ก ๋์ด ์๋ ๋ฌธ์ ๋ฐ์ํ๋ค.
ํด๊ฒฐ : useState์์๋ง ์ค์ ํ ๊ฒฝ์ฐ ๋น๊ฐ์ผ๋ก ๋ค์ด์๋ค๊ฐ ๋ฒํผ์ ํด๋ฆญํ ๋๋ง๋ค ์คํ๋์ง ์๊ธฐ ๋๋ฌธ์ useEffect๋ก ๊ฐ์ ๋ฃ๋ ํจ์๋ฅผ ํ๋ฒ ๋ ์คํํด์ค์ผ ํ๋ค.
์ฌํ
์ด์์ฌํญ 1)
- input ํ๊ทธ์ CSS -> {&:hover>div:nth-child(2){}} ๋ก ๊ทธ๋ฆผ์ ๋ง์ฐ์ค๊ฐ ์ฌ๋ผ๊ฐ์๋ ์ฅ๋ฐ๊ตฌ๋๊ฐ๊ธฐ ์ฐฝ์ ๋์ธ๋ ์ฌ๋ฌ๊ฐ๊ฐ ๋์์ ์ ์ฉ๋จ
- ํด๊ฒฐ : div๋ฅผ ๊ธฐ์ค์ผ๋ก :hover๋ฅผ ์ ์ฉํ๊ณ , ์ฅ๋ฐ๊ตฌ๋ ์ฒซ๋ฒ์งธ ๋ณด์ฌ์ง๋ div๋ฅผ ์๋ณด์ด๊ฒ ํ๊ณ hoverImg๋ฅผ ๊ณ ์ ํ๋ค.
&:hover > div:first-child { display: none; } &:hover > div:last-child { display: block; cursor: pointer; object-fit: cover;
์ด์์ฌํญ 2)
- ๋น์นธ ๊ฒ์์ ์ ์ฒด์ํ์ผ๋ก ์ด๋
- ํด๊ฒฐ : action์ ์กฐ๊ฑด์ผ๋ก ๊ฒ์ ๊ฒฐ๊ณผ๊ฐ ์์ผ๋ฉด ์ ์ฒด ํ์ด์ง๋ก ์ด๋ํ๊ฒ ๋ง๋ฌ
{ !isSearch || ( <form method="get" action={search ? `/search? searchTerm=${search}` : "/all"} > <input type="text" name="search" value={search} onInput={(e) => { setSearch(e.target.value); }} placeholder="๊ฒ์์ด๋ฅผ ์ ๋ ฅํด ์ฃผ์ธ์" ></input> </form> ); }
์ด์์ฌํญ 3)
- media query font-size :1rem ์ ๊ธฐ์ค์ ๋ฐ๊พผ๋ค.
- ํด๊ฒฐ : font-size๋ฅผ 1rem์ผ๋ก ์ ๊ณ media query ์กฐ๊ฑด ์ํฉ์ ๋ฐ๋ผ ๋ณํํ๊ฒ ํ๋ค.
html { font-size: 16px; } @media only screen and (min-width: 1550px) { html { font-size: 21px; }}
์์ค
์ด์์ฌํญ 1 (22.12.21)
- (22.12.21) CSS ์ ์ฉ์ id, className, ์ง์ ์ง์ ์์ด์ ์ฐ๋ค๋ณด๋ ์ ์ฉ์ด ์ํํ๊ฒ ๋์ง ์์.
- ํด๊ฒฐ : CSS ์ ์ฉ ์ฐ์ ์์ ๊ณต๋ถ. ์ถ์ฒ : https://think0wise.tistory.com/24
- ์ฐ์ ๋ {inline > id > class, sudoClass > tag, element}
- ์ด์์ด๋ฉด class๋ก ์์ ๋์ง ์๋ ์คํ์ผ ๋ฐ๊พธ๊ธฐ ์ํด id๋ฅผ ๊ฐ์ ๋ก ๋ฃ๋ ๊ฑด ์ง์.
- ์ด์์ฌํญ 2 (22.12.22)
- DB์ ์ ์ฅ๋ list๋ฅผ ๋ฐ์ ๋ฌผ๊ฑด์ ์ถ๋ ฅํ ๋ Multer library ๋ก DB์ ๋ฑ๋กํ ์ํ์ ์ฌ์ง์ ๋ถ๋ฌ์ค์ง ๋ชปํ๋ค. DB์ ๋ฐ์ด๋ฃ์ ์ ๋ณด๋ ์ด๋ฏธ์ง์ ๊ฒฝ๋ก๊ฐ ํด๋ ์ ๋์ฃผ์๋ก ์ค์ ๋๋ ๋ฐ๋ฉด
multer ๋ก ์ฌ๋ฆฐ ์ ๋ณด์ ์ด๋ฏธ์ง๋ ๊ฒฝ๋ก๊ฐ ํ์ผ ์ด๋ฆ๋ง ์ค์ ๋๋ค.- ํด๊ฒฐ : DB์ ์ ์ฅ๋ img ์ ๊ฒฝ๋ก๊ฐ imgs ํด๋ ์ฃผ์๋ฅผ ํฌํจํ๊ณ ์์ ๋์, ํ์ผ ์ด๋ฆ๋ง ์์๋๋ฅผ ๋๋์ด์ ๋ถ๋ฌ์จ๋ค. multer ๋ก ์ ๋ก๋ํ ํ์ผ์ ์๋ฒํด๋์ upload์ ์ฌ๋ผ๊ฐ๊ฒ๋ ์ค์ ์ ํ๋ค.
// ์ผํญ์ฐ์ฐ์ ์ฌ์ฉ (productImg ๊ฐ์ /imgs๋ฅผ ํฌํจ ? ํฌํจํ ๋ : ํฌํจ ์ํ ๋ ) { item.productImg.includes("/imgs"); }์ฐธ๊ณ ๋ฌธํ: https://any-ting.tistory.com/51
- ์ด์์ฌํญ 3 (22.12.23)
- ํ ์ด๋ธ๊ฐ ๊ด๊ณ DB ์ค๊ณ์ ์ด๋ ค์์ ๊ฒช์๋ค. User, Cart, Product, Order ๋ฑ ๊ฐ๊ฐ์ ํ ์ด๋ธ์ ๋ชจ๋ ์ํ์ ๋ณด์ ์ ์ ์ ๋ณด๋ฅผ ๋ฃ์ด์ ํ๋ํ๋ ๊ด๋ฆฌํ๋ ๊ฑด ๋นํจ์จ์ ์ด๊ธฐ๋ ํ๊ณ , ์ ์ง๋ณด์๋ ์ด๋ ต๊ธฐ์ ๊ด๊ณ์ค์ ์ด ํ์์ ์ด์๋ค.
- ํด๊ฒฐ : User, Product ํ ์ด๋ธ์ ๊ธฐ์ค์ผ๋ก userId์ productId๋ฅผ ์ฎ์ด์ Cart,Order,UserProduct ํ ์ด๋ธ์ ๊ด๊ณ์์ผฐ๋ค.
// Cart Table static associate(db) { db.Cart.belongsTo(db.User, { foreignKey: "userId", targetKey: "id" }); db.Cart.belongsTo(db.Product, { foreignKey: "productId", targetKey: "id" }); } }// Product Table static associate(db) { db.Product.belongsToMany(db.User, { through: "userProduct", foreignKey: "productId", }); db.Product.hasMany(db.Cart, { foreignKey: "productId", sourceKey: "id", }); db.Product.hasMany(db.Order, { foreignKey: "productId", sourceKey: "id", }); } }// User Table static associate(db) { db.User.belongsToMany(db.Product, { through: "userProduct", foreignKey: "userId", }); db.User.hasMany(db.Cart, { foreignKey: "userId", sourceKey: >"id" }); db.User.hasMany(db.Order, { foreignKey: "userId", >sourceKey: "id" }); } }
์ด์์ฌํญ 4 (22.12.24)
๊ด๊ณ๊ฐ ํ์ฑ๋ ํ ์ด๋ธ ์ data์ ์ ๊ทผํ๋ ๋ฐฉ๋ฒ์์ ์ด๋ ค์์ ๊ฒช์๋ค. ๋จ์ํ findOne, findAll ์ด ์๋ ๋ค๋ฅธ ๋ฌธ๋ฒ์ด ํ์ํด ๋ณด์๋ค.
ํด๊ฒฐ : ํ์ ์์ฑ์ผ๋ก include ๋ฌธ๋ฒ์ ์ฌ์ฉํ๋ค.
code
/// Cart ํ ์ด๋ธ์ userid ์ ๋งค์นญ๋๋ userํ ์ด๋ธ์ ํญ๋ชฉ์ attributes์ productid ์ ๋งค์นญ๋๋ product ํ ์ด๋ธ ํญ๋ชฉ์ attributes๋ฅผ ๊ฐ์ ธ์จ๋ค. const temp = await Cart.findOne({ where: { userId: tempUser.id, productId: tempProduct.id }, include: [ { model: Product, attributes: [ "productName", "productPrice", "productImg", "productHoverImg", ], }, { model: User, attributes: ["userEmail"], }, ], });์ฐธ๊ณ ๋ฌธํ : https://gist.github.com/zcaceres/83b554ee08726a734088d90d455bc566
React-Bootstrap : https://react-bootstrap.github.io/
Google ReCaptcha : https://www.npmjs.com/package/react-google-recaptcha-v3 (ํ ์ฌ๋ผ ํ์ด์ง svg Recaptcha ๋์ฒด์)
๋ธ๋์น ์ญ์ ๊ด๋ จ : https://velog.io/@minjeong/git-๋ธ๋์น-์ญ์ ํ๊ธฐ
github readme.md ์ด๋ชจ์ง ๊ด๋ จ : https://www.webfx.com/tools/emoji-cheat-sheet/
github readme.md ์ด๋ฏธ์ง๊ด๋ จ : https://simpleicons.org/
Notion ์์ด์ฝ ๋ฐ ์ด๋ฏธ์ง ๊ด๋ จ GIPHY : https://giphy.com/