๐ ํธ๋๋ง์ผ ๋ฐฐํฌ URL : https://hodumarket.netlify.app/
ํธ๋๋ง์ผ์ ๋๊ตฌ๋ ์์ ๋กญ๊ฒ ์ํ์ ๊ฒ์ํ์ฌ ํ๋งคํ๊ณ ๊ตฌ๋งคํ ์ ์๋ ์คํ๋ง์ผ ์๋น์ค์
๋๋ค.
ํ์์ ํ๋งค์/๊ตฌ๋งค์ ์ ํ์ผ๋ก ๋๋๋ฉฐ ํ๋งค์๋ ์ํ ์ ๋ณด๋ฅผ ๊ฒ์,์์ ,์ญ์ ํ ์ ์์ต๋๋ค.
๊ตฌ๋งค์๋ ์ํ๋ ์ํ์ ์ํ๋ ์๋๋งํผ ์ฅ๋ฐ๊ตฌ๋์ ๋ด๊ฑฐ๋ ๋ฐ๋ก ๊ตฌ๋งค๋ฅผ ํ ์ ์์ต๋๋ค.
๐ BackEnd : ์ ๊ณต๋ API ์ฌ์ฉ
๐ Daum Postcode Service API ์ฌ์ฉ
๐ Version :
react : "18.2.0"
react-router-dom : "6.3.0"
axios: "0.27.2",
react-daum-postcode: "3.1.1"
react-intersection-observer: "9.4.0"
react-query: "3.39.2"
tailwindcss: "3.1.8"
vite: "3.0.7"
-
๐ ๊ณ์
- ๋ก๊ทธ์ธ/๋ก๊ทธ์์
- ๊ตฌ๋งค์ / ํ๋งค์ ํ์๊ฐ์
- ์ ํจ์ฑ ๊ฒ์ฆ
- ํ ํฐ ๊ฒ์ฆ
-
๐ ํ
- ์ํ ๊ฒ์
- ์ํ ๋ชฉ๋ก
- ๋ฌดํ ์คํฌ๋กค
-
๐ ์ํ
- ์ํ ์์ธ ํ์ด์ง
- ์ํ ์๋ ์ ํ
- ์ฅ๋ฐ๊ตฌ๋ ์ํ ๋ด๊ธฐ
- ์ํ ์ฃผ๋ฌธ ๋ฐ ๊ฒฐ์
- ์ํ ์ฌ๊ณ ์ ํจ ๊ฒ์ฌ
-
๐ ์ฅ๋ฐ๊ตฌ๋
- ์ฅ๋ฐ๊ตฌ๋์ ๋ด๊ธด ์ํ ๋ชฉ๋ก ํ์ธ
- ์ํ ์๋ ์์ ๋ฐ ์ํ ์ญ์
- ์ํ ๊ฐ๋ณ / ์ ์ฒด ์ ํ
- ์ ํ๋ ์ํ์ ์ด ํ ์ธ / ๋ฐฐ์ก๋น / ์ํ๊ฐ๊ฒฉ ํ์ธ
- ์ ํ๋ ์ํ ํน์ ๊ฐ๋ณ ์ฃผ๋ฌธ
-
๐จโ๐พ ํ๋งค์ ์ผํฐ
- ์ํ ๋ฑ๋ก ๋ฐ ์ญ์
- ๋ฑ๋ก๋ ์ํ ์์
-
ETC
- ๋ชจ๋ฐ์ผ ์ ์ ๋ฅผ ์ํ ๋ฐ์ํ ๋์์ธ ๊ตฌํ
- api ๋ฐ์ดํฐ ๋ก๋ฉ ์ค ๋ก๋ฉ ์คํผ๋ ํ๋ฉด ๊ตฌํ
hodu-open-market/src/pages/myCart/MyCart.jsx
Lines 26 to 63 in b53b800
๊ตฌ๋งค์๊ฐ ์ฅ๋ฐ๊ตฌ๋์ ๋ด์ ์ํ๋ชฉ๋ก์ ๋ถ๋ฌ์จ ํ,
์ํ ์ด๋ฆ, ์ํ ๊ฐ๊ฒฉ, ๋ฐฐ์ก๋น, ํ๋งค์ ์ด๋ฆ, ์ด๋ฏธ์ง ์ ๋ณด๋ฅผ ๋ฐ์์ค๊ธฐ ์ํด ์ฅ๋ฐ๊ตฌ๋ ์ํ๋ชฉ๋ก์ ์ํ id๋ก ๋ค์ ํ๋ฒ ์ํ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์์ต๋๋ค.
์ด ๋ ์๋์ ๊ฐ์ด promise all์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
async function getCartList() {
try {
const res = await axios.get(url + "cart/", {
headers: { Authorization: `JWT ${token}` }
});
const items = res.data.results.map((item, idx) =>
axios.get(url + "products/" + item.product_id + "/")
);
const itemsArr = await Promise.all(items);
} catch (err) {
console.errir(err);
}
}
์ด์ฒ๋ผ Promise.all์ ๊ตฌํํ๊ธฐ ์ํด react-query์ useQueries ํ
์ ๋์ ์ผ๋ก ์ฌ์ฉํ์์ต๋๋ค.
hodu-open-market/src/pages/home/Products.jsx
Lines 27 to 57 in 3d59cf8
ํํ์ด์ง์์ first page ์ํ api ๋ฐ์ดํฐ์์ ์ํ์ ์ด ๊ฐ์๋ฅผ ํ๋ฒ์ ๋ถ๋ฌ์์ง๋ ์ํ๋ชฉ๋ก ๊ฐ์(15)๋ก ๋๋๊ณ ์ฌ๋ฆผํด์ค๋๋ค. ์ด๋ฅผ dataLength์ ํ ๋นํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ dataLength ๋งํผ for ๋ฐ๋ณต๋ฌธ์ผ๋ก queryClient.prefetchQueryํ ์ ์ฌ์ฉํฉ๋๋ค. prefetch๋ ๋ชจ๋ ์ํ์ ๋ฐ์ดํฐ๋ cached๋์ด ์ํ ๊ฒ์์์ ์ฌ์ฉ๋ฉ๋๋ค.
hodu-open-market/src/pages/productDetail/ProductOverview.jsx
Lines 23 to 49 in 9786c51
๊ตฌ๋งค์๊ฐ ์ฅ๋ฐ๊ตฌ๋์ ์ํ ์ถ๊ฐ ์, ์ฅ๋ฐ๊ตฌ๋์ ํด๋น ์ํ์ด ๊ธฐ์กด์ ์กด์ฌํ๋์ง ๊ฒ์ฆํ๊ธฐ ์ํด ์ฌ์ฉ์ ์ฅ๋ฐ๊ตฌ๋ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ต๋๋ค. ์ด ๋, ์ฌ์ฉ์๊ฐ ์ฅ๋ฐ๊ตฌ๋ ํ์ด์ง๋ฅผ ์ด๋ฏธ ๋ฐฉ๋ฌธํ ์ ์ด ์์ผ๋ฉด data๋ฅผ fetch ํ์ง ์๊ณ , useQueryClientํ ์ ์ฌ์ฉํ์ฌ getQueryData๋ก ์ฅ๋ฐ๊ตฌ๋ ํ์ด์ง์์ cache๋ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ต๋๋ค.
hodu-open-market/src/pages/home/Products.jsx
Lines 15 to 42 in a06f65b
react-query์ useInfiniteQuery์ react-intersection-observer api๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌดํ ์คํฌ๋กค ๊ธฐ๋ฅ์ ๊ตฌํํ์์ต๋๋ค.
useInView์ 'ref'๋ ๊ฐ ํ์ด์ง ๋ง๋ค ๋ง์ง๋ง ์ํ(15๋ฒ์งธ)์ ์ง์ ํ์์ต๋๋ค.
hodu-open-market/src/components/Modal/PostCodeModal.jsx
Lines 1 to 41 in af4603f
hodu-open-market/src/pages/payment/Payment.jsx
Lines 81 to 91 in af4603f
๋ค์์นด์นด์ค์์ ์ ๊ณตํ๋ ์ฐํธ๋ฒํธ ์กฐํ API ์๋น์ค๋ฅผ ์ด์ฉํ์ฌ ์ฐํธ ๋ฒํธ ๊ฒ์ ๊ธฐ๋ฅ์ ๊ตฌํํ์์ต๋๋ค.
๊ตฌ๋งค์๊ฐ ์ํ ์ฃผ๋ฌธ ์, ๋ฐฐ์ก ์ฃผ์ ์
๋ ฅ์์ ์ฐํธ๋ฒํธ์ฐพ๊ธฐ๋ฅผ ํด๋ฆญํ๋ฉด ์ฐํธ๋ฒํธ ๊ฒ์ ๋ชจ๋ฌ์ฐฝ์ด ๋ํ๋ฉ๋๋ค.
์ฌ์ดํธ์ ๊ธฐ๋ณธ ์ปฌ๋ฌํ๋ ํธ์ ์ด์ธ๋ฆฌ๋๋ก ์ฃผ์ ๊ฒ์์ฐฝ ์์์ ์์ ํ์์ต๋๋ค.
hodu-open-market/src/pages/home/ProductList.jsx
Lines 4 to 46 in 2ddbb1c
tailwind์ ์ค๋ฅ๊ฐ ์๋ ๊ฒ์ผ๋ก ๋ณด์ฌ, ์ธ๋ผ์ธ ์์ฑ์ผ๋ก background Image url์ ์ค์ ํด ์ฃผ์์ต๋๋ค.
๐ฆ src
โฃ๐ assets
โฃ๐ components
โ โฃ๐ buttons
โ โฃ๐ footer
โ โฃ๐ modal
โ โฃ๐ navBar
โ โฃ NotFound.jsx
โ โฃ NowLoading.jsx
โ โ SmNowLoading.jsx
โฃ๐ context
โฃ๐ pages
โ โฃ๐ auth
โ โฃ๐ home
โ โฃ๐ myCart
โ โฃ๐ payment
โ โฃ๐ productDetail
โ โฃ๐ productSearch
โ โฃ๐ sellerCenter
โ โ๐ sellerProductsUpload
โฃ๐ App.jsx
โฃ๐ main.jsx
โฃ๐ index.css
โ๐ style.js