1/2

๐Ÿ“ ํ•  ์ผ

  • 4์ฐจ๊ณผ์ œ ์ฝ”๋“œ๋ฆฌ๋ทฐ ํ”ผ๋“œ๋ฐฑ ์ˆ˜์ • & ์ •๋ฆฌ

 

โœ… ํ•œ ์ผ

  • 4์ฐจ๊ณผ์ œ ์ฝ”๋“œ๋ฆฌ๋ทฐ ํ”ผ๋“œ๋ฐฑ ์ˆ˜์ • & ์ •๋ฆฌ

์ฝ”๋“œ๋ฆฌ๋ทฐ ๋Œ€ํ•œ ์งˆ๋ฌธ๊ณผ ๋ฆฌํŒฉํ† ๋ง ๊ณ„ํš์ด๋‚˜ ๊ธฐ๊ฐ„์— ๋Œ€ํ•œ ํšŒ์˜ ํ›„ ํ”ผ๋“œ๋ฐฑ ์ˆ˜์ •์„ ๋๋‚ด๊ณ  pr ํ•œ ๋’ค ์ด์Šˆ์— ์ •๋ฆฌํ–ˆ๋‹ค

์ˆ˜์ •์ด ์–ด๋ ค์šด ๊ฑด ์—†์—ˆ๋Š”๋ฐ ์งœ์ž˜ํ•˜๊ฒŒ ๊ท€์ฐฎ์€ ๊ฒŒ ๋งŽ์•„์„œ ์ˆ˜์ •ํ•˜๋Š” ๋ฐ๋„ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๊ณ  ์–ด๋–ป๊ฒŒ ๊ณ ์ณค๋Š”์ง€ ์ •๋ฆฌํ•˜๋Š” ๋ฐ๋„ ์‹œ๊ฐ„์ด ์ข€ ๊ฑธ๋ ธ๋‹ค

 

๊ทธ๋ฆฌ๊ณ  ์ˆ˜์ • ๋„์ค‘์— ์—๋Ÿฌ๊ฐ€ ์ƒ๊ฒจ์„œ ์‹œ๊ฐ„์ด ๋” ๊ฑธ๋ฆฐ ๊ฒƒ๋„ ์žˆ์—ˆ๋‹ค

๋กœ๊ทธ์ธ ํ›„ ์ฒ˜์Œ ๊ตฌ๋งคํ•˜๊ธฐ ๋“ค์–ด๊ฐ€๋ฉด length ์—๋Ÿฌ๊ฐ€ ๋‚˜๋Š” ์ƒํ™ฉ์ด์—ˆ๋‹ค

๊ณ„์ขŒ ์กฐํšŒ api ์ชฝ์—์„œ data ๋ฅผ ์ž˜ ๋ถˆ๋Ÿฌ์˜ค์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ ๊ฐ™์€๋ฐ ์ •ํ™•ํžˆ ์›์ธ์„ ์•Œ ์ˆ˜ ์—†์—ˆ๋‹ค

 

 

fetch ํ•จ์ˆ˜๋ฅผ ๋ชจ๋“ˆํ™”๋กœ ๋ถ„๋ฆฌํ•˜์ง€ ์•Š๊ณ  ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ useEffect ๋กœ ๋ถˆ๋Ÿฌ์˜ค๋‹ˆ ์ž‘๋™์ด ๋˜๋Š” ๊ฒƒ์„ ๋ณด๋‹ˆ ๋ฐ์ดํ„ฐ๋ฅผ ์ž˜๋ชป ๋ณด๋‚ด๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์ง„ ์•Š์•˜๋‹ค

 

// ๊ณ„์ขŒ ์กฐํšŒ api
export const getAccountInfo = async ({ accessToken }) => {
  try {
    const res = await fetch(ACCOUNT_URL, {
      method: 'GET',
      headers: { ...HEADERS_USER, Authorization: accessToken },
    });
    const json = await res.json();
    return json;
  } catch (error) {
    console.error(error.message);
  }
};

๋‹ค๋ฅธ ํŒ€์›๊ณผ ํ•จ๊ป˜ ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ, fetch ํ•จ์ˆ˜ ์•ˆ์—์„œ console ์„ ์ฐ์–ด ๋ดค๋Š”๋ฐ accessToken ์ด undefined ๋กœ ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ๋‹ค์‹œ accessToken ์„ ๋ฐ›์•„ ์ธ์ˆ˜๋กœ ๋„ฃ์–ด์ฃผ๋‹ˆ ํ•ด๊ฒฐ๋˜์—ˆ๋‹ค

๊ทผ๋ฐ ์ „๊นŒ์ง€๋Š” accessToken ์„ ์ž˜ ๋ฐ›์•„์˜ค๋‹ค๊ฐ€ ์™œ ๊ฐ‘์ž๊ธฐ ๋ชป ๋ฐ›์•„์˜ค๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค

 

 

length ์—๋Ÿฌ๋ฅผ ํ•ด๊ฒฐํ•˜๋‹ˆ ๊ฒฐ์ œ ์˜ค๋ฅ˜๊ฐ€ ๋‚ฌ๋‹ค^^

 

 

๋‹จ์ผ๊ณผ ๋‹ค์ค‘ ์ƒํ’ˆ ๊ตฌ๋งค ์‹œ id ์ด๋ฆ„์ด ๋‹ฌ๋ผ ์ƒ๊ธด ์˜ค๋ฅ˜๋กœ ๋กœ์ง์„ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ํ–ˆ์œผ๋‚˜ ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด์ ธ or ์—ฐ์‚ฐ์ž ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐํ–ˆ๋‹ค

 

์•„๋ž˜๋Š” ์ˆ˜์ • ์‚ฌํ•ญ์ธ๋ฐ ์ •๋ฆฌํ•ด๋†“์œผ๋‹ˆ ๋ฟŒ๋“ฏํ•˜๊ธฐ๋„ ํ–ˆ์ง€๋งŒ ์ƒ๊ฐ๋ณด๋‹ค ๋งŽ์•„์„œ ์ข€ ๋ถ€๋„๋Ÿฌ์› ๋‹ค

1. Account : accountColor ์Šคํƒ€์ผ ๋ถ€๋ถ„ ์ธ๋ผ์ธ์—์„œ ์™ธ๋ถ€๋กœ ์ˆ˜์ •

2. Header : search input react-hook-form ๋„์ž…ํ•ด๋‹น ๊ธฐ๋Šฅ์˜ ์žฅ์ ์„ ์‚ด๋ฆด ์ˆ˜ ์—†์„ ๊ฒƒ ๊ฐ™์•„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ ค ํ–ˆ์œผ๋‚˜ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ๋„์ž…ํ•  ๋•Œ ์†๋„๋ฉด์—์„œ ๊ทน์ ์ธ ์ฐจ์ด๊ฐ€ ๋‚˜์„œ ๋„์ž…ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •

3. SearchItem : onClick ์ด๋ฒคํŠธ ํ•ธ๋“ค๋ง ํ•จ์ˆ˜ ๋ถ„๋ฆฌ, cur → prev ์ˆ˜์ •

4. MyBuy : ๊ฒฐ์ œ ๋ฒ„ํŠผ onClick ์ด๋ฒคํŠธ ํ•ธ๋“ค๋ง ํ•จ์ˆ˜์—์„œ ๋ฐฐ์†ก์ง€์ •๋ณด reload ๋ถ€๋ถ„ ์ œ๊ฑฐ

5. Account : onChange ์— ์ „๋‹ฌ๋˜๋Š” ํ•จ์ˆ˜์— ์ธ์ž๋กœ ๋„ฃ๋Š” bankName ์ œ๊ฑฐ

6. MyBuy : ์ˆ˜๋Ÿ‰ ๋ฐ์ดํ„ฐ ์—†๋Š” ๊ฒฝ์šฐ 1๋กœ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์ˆ˜์ •

7. Search :  useSearchParams ๋ณ€์ˆ˜ ์„ ์–ธ ๋ฐฉ์‹ ์ˆ˜์ •

8. Search : ํ‚ค์›Œ๋“œ ๊ตฌ๋ถ„ ๋กœ์ง ๋ถ€๋ถ„ ์ˆ˜์ •, else ๋ฌธ์€ ํ•„์š” ์—†์–ด์„œ ์‚ญ์ œ

9. Search : API ํ˜ธ์ถœ ๋ฐฉ์‹์„ ๋กœ์ง ๋ถ„๋ฆฌ x, useQuery ๋กœ ์ˆ˜์ •ํ•˜์—ฌ ์ฒ˜๋ฆฌ ์†๋„ ์ฆ๊ฐ€

10. TotalProduct : error, loading ๋ถ€๋ถ„ if return ๋ฌธ์—์„œ ์ปดํฌ๋„ŒํŠธ return ๋ฌธ ์•ˆ์˜ ์‚ผํ•ญ์—ฐ์‚ฐ์ž๋กœ ์ฒ˜๋ฆฌ

11. Product : onClickDetail ํ•จ์ˆ˜ ์‚ญ์ œ

12. MyBuy : productsPrice ๋กœ์ง์—์„œ ๋ฐ˜๋ณต๋ฌธ ์•ˆ์˜ if else ๋Š” ์ƒ์„ธํŽ˜์ด์ง€์˜ ๊ตฌ๋งคํ•˜๊ธฐ ๊ฒฝ์šฐ quantity ๋ฐ์ดํ„ฐ๊ฐ€ undefined ๋˜์–ด ์ฒ˜๋ฆฌํ•ด์ค€ ๊ฒƒ์œผ๋กœ else ๋ฌธ ์ œ๊ฑฐํ•˜์ง€ ์•Š์•˜์Œ, while ๋ฌธ ์ œ๊ฑฐํ•˜์—ฌ productsPrice ์— ๋ˆ„์ ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ˆ˜์ •

13. MyBuy : ๋ฐฐ์†ก์ง€์ •๋ณด form ์˜ ๋ณ€์ˆ˜๋ช…์€ ์ถ”ํ›„ ๊ธฐ๋Šฅ ๊ตฌํ˜„ํ•˜๋ฉด์„œ ์ˆ˜์ • ์˜ˆ์ •

14. css : ํด๋ž˜์Šค๋„ค์ž„ ์ปจ๋ฒค์…˜์— ๋งž๊ฒŒ ์ˆ˜์ •. btn_heart → btnHeart

15. MyCart : ์žฅ๋ฐ”๊ตฌ๋‹ˆ์—์„œ ๊ตฌ๋งคํ•˜๊ธฐ๋กœ ๋„˜๊ฒจ์ฃผ๋Š” state ๋ณ€์ˆ˜๋ช…์ด ๋™์ผํ•˜๋„๋ก ์ˆ˜์ •. buyItem → buyProduct

16. loading : ๋กœ๋”ฉ ์‹œ LoadingModal ํ™œ์šฉ

 

 

 

 

 

 

 

1/3

๐Ÿ“ ํ•  ์ผ

  • 4์ฐจ๊ณผ์ œ ๋ฆฌํŒฉํ† ๋ง

 

โœ… ํ•œ ์ผ

  • 4์ฐจ๊ณผ์ œ ๋ฆฌํŒฉํ† ๋ง
  // api ํ˜ธ์ถœ
  const {isLoading, data: search, refetch} = useQuery(['search'], () => {
      if (findTitle && tag) return getSearch(findTitle, tag);
      else if (tag) return getSearch('', tag);
      else return getSearch(title);
    },
    {
      onError: () => {
        alert('ํ˜„์žฌ ๊ฒ€์ƒ‰์„ ์ด์šฉํ•  ์ˆ˜ ์—†์œผ๋‹ˆ ๋ฌธ์˜ ๋ฐ”๋ž๋‹ˆ๋‹ค.');
      },
    },
  );
  useEffect(() => {
    refetch();
  }, [refetch, title]);

๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์—์„œ useEffect ๋กœ fetch ํ•จ์ˆ˜๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋˜ ๊ฒƒ์„ useQuery ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฆฌํŒฉํ† ๋ง์„ ํ–ˆ๋‹ค

ํ™•์‹คํžˆ ๋นจ๋ผ์ง„ ๊ฒŒ ๋А๊ปด์กŒ๋‹ค

๊ทผ๋ฐ ์ž๊พธ ๊ฒ€์ƒ‰์–ด๋งŒ ์ž˜ ๋ถˆ๋Ÿฌ์˜ค๊ณ  ๊ฐ€์ ธ์˜ค๋Š” ์ •๋ณด๋Š” ์—…๋ฐ์ดํŠธ๊ฐ€ ๋˜์ง€ ์•Š์•˜๋Š”๋ฐ ๊ฒฐ๊ตญ useEffect ๋กœ refetch ๋ฅผ ํ•ด์ค„ ์ˆ˜ ๋ฐ–์— ์—†์—ˆ๋‹ค

++ ๋‚˜์ค‘์— ๋‹ค๋ฅธ ํŒ€์›์ด ์•Œ๋ ค์คฌ๋Š”๋ฐ fetch ํ•จ์ˆ˜๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ ๊ฒ€์ƒ‰์–ด๋งˆ๋‹ค ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ๋งˆ๋‹ค query ํ‚ค๋กœ ๊ณ ์œ ํ•œ ๊ฐ’์„ ์คฌ์–ด์•ผ ํ–ˆ๋Š”๋ฐ ๊ณ„์† search ๋กœ ๊ฐ€์ ธ์˜ค๋‹ˆ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ๋‹ค๊ณ  ํ–ˆ๋‹ค ๊ทธ๋ž˜์„œ key ๊ฐ’์œผ๋กœ ๊ฒ€์ƒ‰์–ด๋ฅผ ์ง‘์–ด๋„ฃ์–ด์คฌ๋”๋‹ˆ refetch ๋„ ํ•„์š” ์—†์—ˆ๋‹ค… useQuery ์— ๋Œ€ํ•ด ์ž˜ ๊ณต๋ถ€๋„ ํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉํ•˜๋‹ˆ ์ด๋Ÿฐ ์ผ์ด ์ƒ๊ธด ๊ฒƒ ๊ฐ™์•„ ๋ถ€๋„๋Ÿฌ์› ๋‹ค

 

react hook form ์จ์„œ ๋ฐฐ์†ก์ง€ ์ •๋ณด ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์™„.

๊ฒ€์ƒ‰์–ด ์ž…๋ ฅ ๋•Œ ํ•œ๋ฒˆ ์จ๋ดค๋Š”๋ฐ๋„ input ์ด ๋งŽ์•„์ง€๋‹ˆ๊นŒ ๋ณต์žกํ•ด์ ธ์„œ ๊ฐ•์˜๋ฅผ ๊ณ„์† ๋ณด๋ฉด์„œ ํ–ˆ๋‹ค

์•„๋ฌด๋ž˜๋„ ๊ฐ•์˜๋ฅผ ๋ณด๋ฉด์„œ ์‹ค์ œ๋กœ ์ฝ”๋“œ๋ฅผ ์น˜๊ณ  ์“ด ๊ฒŒ ์•„๋‹ˆ๋ผ ์ž˜ ์ดํ•ด๊ฐ€ ๋˜์ง€ ์•Š์•„ ์˜ค๋ž˜ ๊ฑธ๋ ธ๋‹ค

 

 

 

 

 

 

 

1/4

๐Ÿ“ ํ•  ์ผ

  • 4์ฐจ๊ณผ์ œ ๋ฆฌํŒฉํ† ๋ง ๋งˆ๋ฌด๋ฆฌ
  • ๋…ธ๋งˆ๋“œ ์ฝ”๋” ๋ฆฌ์•กํŠธ ๋งˆ์Šคํ„ฐ ํด๋ž˜์Šค typescript ํŒŒํŠธ ์‹ค์Šต

 

โœ… ํ•œ ์ผ

  • 4์ฐจ๊ณผ์ œ ๋ฆฌํŒฉํ† ๋ง ๋งˆ๋ฌด๋ฆฌ

๋‹ค์Œ ์šฐํŽธ๋ฒˆํ˜ธ api ์ด์šฉํ•˜์—ฌ ์ฃผ์†Œ ์ž…๋ ฅ ๊ธฐ๋Šฅ ๊ตฌํ˜„? ์™„.

https://www.npmjs.com/package/react-daum-postcode

๋‚˜๋Š” ์ƒˆ ์ฐฝ์— ์—ด์–ด์„œ ๋‹ค์Œ ์ฃผ์†Œ ๊ฒ€์ƒ‰์ฐฝ์ด ๋‚˜ํƒ€๋‚ฌ์œผ๋ฉด ์ข‹๊ฒ ๋Š”๋ฐ ๋‹ค๋“ค ๋ชจ๋‹ฌ์ฐฝ์œผ๋กœ ๋‚˜์˜ค๊ฒŒ ๊ตฌํ˜„ํ•ด์„œ ์œ„ ๋ฌธํ—Œ์„ ์ฐธ๊ณ ํ•ด์„œ ๊ตฌํ˜„ํ–ˆ๋‹ค

๋ณต๋ถ™ํ•˜๋ฉด ๋˜๋Š”๊ฑฐ๋ผ ๊ทธ๋ ‡๊ฒŒ ์–ด๋ ต์ง„ ์•Š์•˜๋‹ค

ํ™•์‹คํžˆ ๋ฌธ์„œ๋ฅผ ์ž˜ ์ฝ์–ด๋ด์•ผ ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค

 

์—๋Ÿฌ : https://mik-a.com/62

ํ•˜๋‹ค๊ฐ€ ์œ„ ๋งํฌ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”๋ฐ value ๊ฐ€ ๋‹ค ๋“ค์–ด์˜ค์ง€ ์•Š์•˜์„ ๋•Œ value ์— ๋„ฃ์–ด์ฃผ๋ ค๊ณ  ํ•ด์„œ ๊ทธ๋Ÿฐ ๊ฒƒ ๊ฐ™์•˜๋‹ค

 

๊ทธ๋ฆฌ๊ณ  ๊ตฌ๋งค ํŽ˜์ด์ง€์— ๊ฒฐ์ œ ๋กœ์ง์„ promise.all ๋กœ ํ•˜๊ณ  useQuery ์™€ useMutation ๋„์ž…ํ•ด๋ณด๋ ค๊ณ  ํ–ˆ์œผ๋‚˜ promise.all ์ฐ๋จน๋งŒ ํ•˜๋‹ค๊ฐ€ ๋์ด ๋‚ฌ๋‹ค^^..

๋‚ด์ผ์€ ์ฐ์œผ๋กœ ํ•ด์•ผ์ง€! ํ•ด๋‚ธ๋‹ค!

 

 

์˜ค๋Š˜ ๋ฆฌ์•กํŠธ ์ˆ˜์—…์„ ๋“ฃ๋‹ค๊ฐ€ firebase ๋ฅผ github ์œผ๋กœ deploy ํ•˜๋Š” ๊ณผ์ •์—์„œ ์—๋Ÿฌ๊ฐ€ ๋‚ฌ๋Š”๋ฐ

firebase-hosting-merge.yml ํŒŒ์ผ์—์„œ run: npm install && npm run build ์œผ๋กœ ์ž…๋ ฅํ•ด์ฃผ์ง€ ์•Š์•„์„œ ๋‚˜๋Š” ์˜ค๋ฅ˜์˜€๋‹ค

 

 

  • ๋…ธ๋งˆ๋“œ ์ฝ”๋” ๋ฆฌ์•กํŠธ ๋งˆ์Šคํ„ฐ ํด๋ž˜์Šค typescript ํŒŒํŠธ ์‹ค์Šต

๋ฆฌํŒฉํ† ๋งํ•˜๊ณ  ๋ฆฌ์•กํŠธ ์ˆ˜์—…๋“ฃ๋А๋ผ ์ƒˆ๋ฒฝ 3์‹œ๊นŒ์ง€ํ•ด์„œ ๊ฒจ์šฐ๊ฒจ์šฐ ์™„์„ฑ์‹œ์ผฐ๋‹ค

๊ทธ๋Ÿฐ๋ฐ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ๋“ค์–ด๋„ ๋“ค์–ด๋„ ์ž˜ ๋ชจ๋ฅด๊ฒ ์–ด์„œ ๊ณ„์† ์จ๋ด์•ผ ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๊ณ„์† ๋“ค์—ˆ๋‹ค

์–ด๋А ์ƒํ™ฉ์—์„œ ํƒ€์ž…์„ ์ง€์ •ํ•ด์ฃผ๊ณ  ์–ด๋–ป๊ฒŒ ์ž…๋ ฅ์„ ํ•ด์ค˜์•ผ ํ•˜๋Š”์ง€ ๊ฐ์„ ์ž˜ ๋ชป ์žก๊ฒ ๋‹ค

interface ๋ฅผ ๊ณ„์† ๋ถ™์—ฌ์ฃผ๊ธด ํ•˜๋Š”๋ฐ ์–ด๋А ๋•Œ๋Š” props ์— ํ•ด์ฃผ๊ณ  ์–ด๋А ๋•Œ๋Š” useState ์— ํ•ด์ฃผ๊ณ .. ๋„ˆ๋ฌด๋„ˆ๋ฌด ํ—ท๊ฐˆ๋ฆฐ๋‹ค~~!

 

 

 

 

 

 

 

 

1/5

๐Ÿ“ ํ•  ์ผ

  • 4์ฐจ๊ณผ์ œ ๋ฆฌํŒฉํ† ๋ง ์ฐ์ฐ๋งˆ๋ฌด๋ฆฌ
  • ๊ฐœ๋ฐœ๋ธ”๋กœ๊ทธ ์ •๋ฆฌ & ์ œ์ถœ

 

 

โœ… ํ•œ ์ผ

  • 4์ฐจ๊ณผ์ œ ๋ฆฌํŒฉํ† ๋ง ์ฐ์ฐ๋งˆ๋ฌด๋ฆฌ

promise.all ๋กœ ๋ฆฌํŒฉํ† ๋ง ํ–ˆ์œผ๋‚˜ ํ•ด๋‹น ๊ธฐ๋Šฅ์€ promise all์—์„œ ๋ฐฐ์—ด์— ๋‹ด๊ธด promise์ดํ–‰์ด ํ•˜๋‚˜๋ผ๋„ ๊ฑฐ๋ถ€๋˜๋ฉด ์ „์ฒด ๋ฐ˜ํ™˜์„ ๊ฑฐ๋ถ€๋กœ ๋ฐ˜ํ™˜ํ•˜๊ธดํ•˜์ง€๋งŒ ์ด๋ฏธ ์‹œํ–‰๋œ ์ดํ–‰์ด ์ทจ์†Œ๋œ๋‹ค๋Š” ์˜๋ฏธ๋Š” ์•„๋‹ˆ๋ผ๊ณ  ํ•จ

๊ทธ๋ž˜์„œ ์ด ๋กœ์ง์„ ๋‹ค์‹œ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์žฅ๋ฐ”๊ตฌ๋‹ˆ์—์„œ ํ’ˆ์ ˆ์ƒํ’ˆ์ž์ฒด๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ฑฐ๋‚˜ ๊ตฌ๋งค ํŽ˜์ด์ง€์—์„œ ๋‹ค์‹œ ์—…๋ฐ์ดํŠธํ•ด์„œ ๊ฒฐ์ œ ๋ฒ„ํŠผ์„ ๋ง‰๋„๋ก ์ˆ˜์ •ํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์Œ

 

promise.all(products.map(
      // api ํ˜ธ์ถœ
    ))
      .then(๋ฐฐ์†ก๋น„ ์ƒ์„ฑ,๊ฒฐ์ œ,์‚ญ์ œ)
      .catch(์ฝ˜์†”์—๋Ÿฌ)

์ด๋Ÿฐ ์‹์œผ๋กœ ๋กœ์ง์„ ์ˆ˜์ •

 

 

  • ๊ฐœ๋ฐœ๋ธ”๋กœ๊ทธ ์ •๋ฆฌ & ์ œ์ถœ

์š”์ฆ˜์€ ํ•˜๋ฃจ ์ผ๊ณผ๊ฐ€ ๋๋‚˜๊ณ  ๋ฐ”๋กœ ์“ฐ๋Š” ๊ฑธ ํฌ๊ธฐํ•˜๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ ์–ด๋–ค ๊ฑธ ํ–ˆ๋‹ค๊ณ  ์“ด ๋’ค์— ํ•˜๋ฃจ ์ „ ๋ชฐ์•„์“ฐ๋Š” ๊ฑธ ๋ฐ˜๋ณตํ•˜๊ณ  ์žˆ๋‹ค

์ด๋ž˜๋„ ๋˜๋‚˜ ์‹ถ์ง€๋งŒ ์ด๋ ‡๊ฒŒ ๋ผ๋„ ํ•˜๋Š” ๊ฒŒ ์–ด๋””๋ƒ ์‹ถ๋‹คใ…Žใ…Ž.. ๊ทธ๋ž˜๋„ ์ œ์ถœ์„ ๋ชปํ•˜๊ณ  ์žˆ๋Š” ๊ฑด ์•„๋‹ˆ๋‹ˆ๊นŒ..!

์ด ๊ต์œก ๊ณผ์ •์„ ๋“ค์€์ง€ ๋ฒŒ์จ 3๊ฐœ์›” ๋ฐ˜์ด ์ง€๋‚˜๋ฒ„๋ ธ๋‹ค

์‹œ๊ฐ„์ด ์–ด๋–ป๊ฒŒ ์ง€๋‚˜๊ฐ€๋Š”์ง€๋„ ๋ชจ๋ฅด๊ฒŒ ํ•˜๋ฃจํ•˜๋ฃจ ์ผ๊ณผ๋ฅผ ํ•ด๋‚ด๋Š” ํ•˜๋ฃจ์‚ด์ด์ฒ˜๋Ÿผ ์‚ด๊ณ  ์žˆ๋‹ค

๊ทธ๋ž˜๋„ ํ™•์‹คํžˆ 3๊ฐœ์›” ์ „์„ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์•„๋ฌด๊ฒƒ๋„ ๋ชจ๋ฅด๋Š” ์‘์• ๋‹ค ์‘์• 

์•„์ง๋„ ๋ฐฐ์šธ ๊ฒŒ ์‚ฐ๋”๋ฏธ์ง€๋งŒ ์ด๋งŒํผ ์„ฑ์žฅํ•œ ๋‚ด๊ฐ€ ์ž๋ž‘์Šค๋Ÿฝ๋‹ค!!!

๋งค์ผ๋งค์ผ ๋น„๊ด€ํ•˜๋ฉฐ ์‚ฌ๋Š” ๊ฒƒ๋ณด๋‹ค ์ด๋ ‡๊ฒŒ ์กฐ๊ธˆ์ด๋‚˜๋งˆ ๋‚™๊ด€์ ์œผ๋กœ ์ƒ๊ฐํ•˜๋ฉฐ ์‚ฌ๋Š” ๊ฒŒ ๋‚ด ์ •์‹  ๊ฑด๊ฐ•์—๋Š” ํŽธํ•œ ๊ฒƒ ๊ฐ™๋‹ค..

์•ž์œผ๋กœ ์ˆ˜๋ฃŒ๊นŒ์ง€ 3๊ฐœ์›” ๋ฐ˜..! ์•„์ขŒ์žฃ ํŒŒ์ดํŒ…!~~!

 

 

 

 

 

 

 

1/6

๐Ÿ“ ํ•  ์ผ

  • 4์ฐจ ๊ณผ์ œ ๋ฆฌํŒฉํ† ๋ง : ๋ฐฐ์†ก๋น„ ๊ฒฐ์ œ ๋กœ์ง ์ˆ˜์ •

 

 

โœ… ํ•œ ์ผ

  • 4์ฐจ ๊ณผ์ œ ๋ฆฌํŒฉํ† ๋ง : ๋ฐฐ์†ก๋น„ ๊ฒฐ์ œ ๋กœ์ง ์ˆ˜์ •
for (let i = 0; i < products.length; i++) {
      let quantity = products[i].quantity || 1;
      while (quantity > 0) {
        if (i === 0 && quantity === 1) {
          const plus = updateProduct(products[i].productId, { price: products[i].price + 3000 });
          plus.then(async (data) => {
            await getBuy(data.id, accountId, accessToken);
            updateProduct(data.id, { price: data.price - 3000 });
          });
          console.log(
            `์žฅ๋ฐ”๊ตฌ๋‹ˆ ์ƒํ’ˆ+3000 ๊ฒฐ์ œ ${products[i].productId || products[i].id} ${products[i].price}`,
            products[i],
          );
          quantity--;
        } else {
          await getBuy(products[i].productId || products[i].id, accountId, accessToken);
          console.log(`์žฅ๋ฐ”๊ตฌ๋‹ˆ ์ƒํ’ˆ ๊ฒฐ์ œ ${i}๋ฒˆ์งธ`, products[i]);
          quantity--;
        }
      }
    }

์ƒํ’ˆ ์ค‘ ํ•˜๋‚˜์— ๊ฐ€๊ฒฉ์„ 3000์›(๋ฐฐ์†ก๋น„) ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์ˆ˜์ •ํ•œ ๋’ค ํ•ด๋‹น ๊ฐ’์œผ๋กœ ๊ฒฐ์ œ๋ฅผ ์ง„ํ–‰ํ•˜๊ณ  ๋‹ค์‹œ ์ƒํ’ˆ์˜ ์›๋ž˜ ๊ฐ€๊ฒฉ์œผ๋กœ ์ˆ˜์ •ํ•˜๋Š” ๋กœ์ง์œผ๋กœ ๊ฒฐ์ œํ•˜๋Š” ๊ฒƒ์„ ์„ฑ๊ณตํ–ˆ๋‹ค

๊ทธ๋Ÿฌ๋‚˜ ์‹ค์ œ ๊ฒฐ์ œ ๋‚ด์—ญ์—์„œ๋Š” ์ˆ˜์ •ํ•œ ๊ฒฐ๊ณผ๋กœ ๊ฒฐ์ œ๊ฐ€ ์ง„ํ–‰๋˜์—ˆ๋Š”์ง€ ์•Œ ์ˆ˜๊ฐ€ ์—†์—ˆ๋‹ค

๊ทธ ์ด์œ ๋Š” ๊ฒฐ์ œ ๋‚ด์—ญ api ์ž์ฒด์—์„œ ๊ฒฐ์ œํ•  ๋•Œ์˜ ๊ฐ€๊ฒฉ์„ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ•ด๋‹น ์ƒํ’ˆ์˜ id ๋ฅผ ์ด์šฉํ•ด ์ตœ์ข… ์ˆ˜์ •๋œ ์ดํ›„์˜ ๊ฐ€๊ฒฉ์„ ๊ฐ€์ ธ์˜จ๋‹ค

 

 

ํ•ด๋‹น ๊ฐ’์„ ์›๋ž˜ ์ƒํ’ˆ์˜ ๊ฐ€๊ฒฉ์œผ๋กœ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ๊ฒฐ์ œํ–ˆ์„ ๋•Œ๋Š” ์ˆ˜์ • ์ด์ „์— ๊ฒฐ์ œํ•œ ๋‚ด์—ญ๋“ค๊นŒ์ง€ 3000์›(๋ฐฐ์†ก๋น„)์ด ์ถ”๊ฐ€๋œ ๊ฐ€๊ฒฉ์ž„์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค

๊ฒฐ์ œํ•  ๋•Œ ๋ฐฐ์†ก๋น„ ๋งŒํผ ์ƒํ’ˆ ๊ฐ€๊ฒฉ์— ์ถ”๊ฐ€ํ•˜์—ฌ ์ˆ˜์ •ํ•˜๊ณ  ๊ฒฐ์ œ ์ดํ›„ ์ƒํ’ˆ ๊ฐ€๊ฒฉ์„ ๋‹ค์‹œ ์›๋ž˜ ๊ฐ€๊ฒฉ์œผ๋กœ ์ˆ˜์ •ํ•˜๋Š” ๋กœ์ง์€ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•  ๊ฒƒ ๊ฐ™๋‹ค

๋ฐฑ์—”๋“œ๋ฅผ ์กฐ์ ˆํ•˜์ง€ ์•Š๋Š” ์ด์ƒ ๋ฐฐ์†ก๋น„๋ฅผ ์ž์ฒด๋ฅผ ์—†์• ๊ณ  ๊ฒฐ์ œ๋ฅผ ํ•˜๊ฑฐ๋‚˜ ๋ฐฐ์†ก๋น„ ์ƒํ’ˆ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋˜๋Œ์•„๊ฐ€์•ผ ๋  ๊ฒƒ ๊ฐ™๋‹ค

++ ํŒ€์›๋“ค๊ณผ ์ค‘๊ฐ„ ํšŒ์˜์—์„œ ์–˜๊ธฐ๋ฅผ ํ•ด๋ดค๋Š”๋ฐ ์ผ๋‹จ ๋ฐฐ์†ก๋น„ ์ƒํ’ˆ์ด ๊ฒฐ์ œ ๋‚ด์—ญ์— ๋„ˆ๋ฌด ๋งŽ์ด ์ฐํ˜€ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฐ ๋„ˆ๋ฌด ๋งŽ์ด ์†Œ๋ชจํ•˜๋‹ˆ๊นŒ ์ด ๋กœ์ง์œผ๋กœ ์ง„ํ–‰ํ•˜๊ณ  ์ถ”ํ›„์— ๋ฐฑ์—”๋“œ๊ฐ€ ๊ตฌ์ถ•๋˜๋ฉด ๋กœ์ง์„ ๋ณ€๊ฒฝํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค

 

 

 

 

 

 

1/8

๐Ÿ“ ํ•  ์ผ

  • 4์ฐจ ๊ณผ์ œ ๋ฆฌํŒฉํ† ๋ง : ๋ฐฐ์†ก๋น„ ๊ฒฐ์ œ ๋กœ์ง ์ˆ˜์ •

 

โœ… ํ•œ ์ผ

  • 4์ฐจ ๊ณผ์ œ ๋ฆฌํŒฉํ† ๋ง : ๋ฐฐ์†ก๋น„ ๊ฒฐ์ œ ๋กœ์ง ์ˆ˜์ •

useMutation ์œผ๋กœ ๋ฆฌํŒฉํ† ๋งํ•˜๋ ค๊ณ  ํ–ˆ์œผ๋‚˜ ์•ˆ๋จ for ๋ฌธ์—์„œ ๋นผ์„œ ๋‹จ๋…์œผ๋กœ ๊ฒฐ์ œํ•ด๋„ ์•ˆ๋จ

๊ฑ ์•ˆ๋จ ์™œ ์•ˆ๋จ?

ํ•˜๋ฃจ์ฃ™์ผ ๋ถ™์žก๊ณ  ์žˆ์—ˆ์Œ ๋‚˜ ๊ทธ๋ƒฅ ์ง€์ณ ์“ฐ๋Ÿฌ์ง

๊ณ„์† _ref ์–ด์ฉŒ๊ตฌ๋ž‘ undefined ๋œธ ๋‚˜ ๊ทธ๋ƒฅ ๊ธฐ์ ˆ

fetch ํ•จ์ˆ˜์—์„œ console ์ฐ์œผ๋ฉด ๊ทธ๋ƒฅ undefined. ๋ฌด์ ๊ถŒ undefined.

๊ทธ๋ž˜์„œ ๋‹ค๋ฅธ ํŒ€์›๋“ค์ด ์“ด mutation ๋ฐฐ๊ปด๋ด„ ์‘ ์•„๋‹ˆ์•ผ ์•ˆ๋ผ

๋‹ค๋ฅธ ๊ณต๋ถ€ ํ•˜์ง€๋„ ๋ชปํ•˜๊ณ  ์ŠคํŠธ๋ ˆ์Šค ๋ฐ›์•„์„œ ๋ฐฐ๋‹ฌ ์˜ค์ง€๊ฒŒ ์‹œํ‚ดใ… .. ๋‚ด์ผ ํšŒ์˜๋•Œ ๋ฌผ์–ด๋ด์•ผ์ง€

 

 

 

 

+ Recent posts