[ React ] ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๊ตฌํ˜„ ์ค‘ ์ˆ˜๋Ÿ‰์— ๋”ฐ๋ฅธ ๊ฐ€๊ฒฉ ๊ณ„์‚ฐ ์˜ค๋ฅ˜ ์ด์Šˆ ํ•ด๊ฒฐ

2025. 10. 21. 00:53ยท๐Ÿงก Projects/๐Ÿงก Projects: Web
728x90
React์—์„œ useReducer๋ฅผ ์‚ฌ์šฉํ•ด ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋˜ ์ค‘,

์ˆ˜๋Ÿ‰์„ ์กฐ์ ˆํ•˜๋Š” + ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์„ ๋•Œ ๊ฐ€๊ฒฉ์ด NaN์œผ๋กœ ํ‘œ์‹œ๋˜๊ฑฐ๋‚˜,
์ˆ˜๋Ÿ‰๊ณผ ๋งž์ง€ ์•Š๋Š” ๊ฐ€๊ฒฉ์ด ํ‘œ์‹œ๋˜๋Š” ํ˜„์ƒ์ด ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค.

์ด ๊ธ€์—์„œ๋Š” 1๏ธโƒฃ ๋ฌธ์ œ ์ƒํ™ฉ, 2๏ธโƒฃ ์›์ธ ๋ถ„์„, 3๏ธโƒฃ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•๊ณผ ํ•จ๊ป˜ ๊ด€๋ จ ๊ฐœ๋…์„ ์ •๋ฆฌํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

 

 

๐Ÿ’ก ๋‚ด๊ฐ€ ๊ตฌํ˜„ํ•˜๊ณ ์ž ํ–ˆ๋˜ ๊ธฐ๋Šฅ

  • "React ํ‹ฐ์…”์ธ  ์ถ”๊ฐ€"๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ์ƒํ’ˆ์ด ์ถ”๊ฐ€๋œ๋‹ค.
  • +,- ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ์ˆ˜๋Ÿ‰์„ ์กฐ์ ˆ
  • ๊ฐ ์•„์ดํ…œ์˜ ์ˆ˜๋Ÿ‰์— ๋”ฐ๋ผ ๊ฐ€๊ฒฉ์ด ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ˜์˜

 

๐Ÿšจ ๋ฌธ์ œ 1: ๊ฐ€๊ฒฉ์ด NaN์œผ๋กœ ํ‘œ์‹œ๋จ

๐Ÿ“Œ ๋ฐœ์ƒ ์ƒํ™ฉ

  • ์ˆ˜๋Ÿ‰ ์ฆ๊ฐ€(+) ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ ๊ฐ€๊ฒฉ์ด NaN์œผ๋กœ ํ‘œ์‹œ๋จ

๐Ÿ” ์›์ธ

  • sampleItem ๊ฐ์ฒด ๋‚ด๋ถ€์—์„œ total: this.price * this.quantity๋ฅผ ์‚ฌ์šฉํ•จ
  • ํ•˜์ง€๋งŒ ์ผ๋ฐ˜ ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์—์„œ this๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ.
  • ํ•จ์ˆ˜ ์ปจํ…์ŠคํŠธ ๋‚ด์—์„œ๋งŒ this๊ฐ€ ๋ฐ”์ธ๋”ฉ๋จ.

 

๐Ÿ’ก์ž˜๋ชป ์ดํ•ดํ•˜๊ณ  ์žˆ๋˜ ๊ฐœ๋…

๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์—์„œ๋Š” this๊ฐ€ ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค์ง€ ์•Š์Œ.
this.price * this.quantity๋Š” undefined * undefined๊ฐ€ ๋˜์–ด NaN์ด ๋ฐœ์ƒํ•จ.
const sampleItem = {
  id: 1,
  name: "React ํ‹ฐ์…”์ธ ",
  price: 25000,
  quantity: 1,
  total: this.price * this.quantity  // โŒ ์ž˜๋ชป๋œ ์ฝ”๋“œ
};

โœ… ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

  • sampleItem์—์„œ๋Š” total์„ ์ •์˜ํ•˜์ง€ ์•Š๊ณ , ADD ์•ก์…˜ ์ฒ˜๋ฆฌ ์‹œ ๊ณ„์‚ฐํ•ด์„œ ์ถ”๊ฐ€ํ•จ
case command.ADD:
  return [
    ...state,
    {
      ...action.payload,
      total: action.payload.price * action.payload.quantity,
    },
  ];

 

๐Ÿšจ ๋ฌธ์ œ 2: ์ˆ˜๋Ÿ‰ ์กฐ์ ˆ ํ›„ ๊ฐ€๊ฒฉ์ด ์ž˜๋ชป๋จ

๐Ÿ“Œ ๋ฐœ์ƒ ์ƒํ™ฉ

  • + ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅผ ๋•Œ ์ˆ˜๋Ÿ‰์€ ๋Š˜์–ด๋‚˜์ง€๋งŒ ๊ฐ€๊ฒฉ(total) ๊ณ„์‚ฐ์ด ์ด์ƒํ•จ

๐Ÿ” ์›์ธ

    • ์ˆ˜๋Ÿ‰ ์ฆ๊ฐ€ ํ›„ total์„ ๊ณ„์‚ฐํ•  ๋•Œ item.quantity๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•จ (์—…๋ฐ์ดํŠธ ์ „ ๊ฐ’)
    • ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์ „์— ๊ธฐ์กด ๊ฐ’์„ ๋ฐ”๋กœ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ˜์˜์ด ์•ˆ ๋œ ๊ฐ’์œผ๋กœ ๊ณ„์‚ฐํ•˜๊ฒŒ ๋จ.
// โŒ ์ž˜๋ชป๋œ ๋ฐฉ์‹
price: 25000 * item.quantity

โœ… ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

์ƒˆ๋กœ์šด ์ˆ˜๋Ÿ‰์„ ๋จผ์ € ๋ณ€์ˆ˜๋กœ ๊ณ„์‚ฐํ•˜๊ณ , ๊ทธ ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ total์„ ๋‹ค์‹œ ๊ณ„์‚ฐํ•จ

๐Ÿ’ก์ž˜๋ชป ์ดํ•ดํ•˜๊ณ  ์žˆ๋˜ ๊ฐœ๋…

React์˜ ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋Š” ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋ฏ€๋กœ, ๊ธฐ์กด ๊ฐ’์„ ์ฆ‰์‹œ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ์ƒˆ๋กœ์šด ๊ฐ’์„ ๋ณ€์ˆ˜๋กœ ๊ณ„์‚ฐ ํ›„ ์‚ฌ์šฉํ•ด์•ผ ์ •ํ™•ํ•œ ์—ฐ์‚ฐ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
case command.PLUS:
  return state.map((item) => {
    if (item.id === action.id) {
      const newQuantity = item.quantity + 1;
      return {
        ...item,
        quantity: newQuantity,
        total: newQuantity * item.price,
      };
    }
    return item;
  });

๐Ÿšจ ๋ฌธ์ œ 3: ํ™”๋ฉด์ด ๊นœ๋นก์ด๊ณ  ์•„๋ฌด๊ฒƒ๋„ ๋ณด์ด์ง€ ์•Š์Œ

๐Ÿ“Œ ๋ฐœ์ƒ ์ƒํ™ฉ

  • ์ƒํ’ˆ ์ถ”๊ฐ€ ํ›„ + ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์ „์ฒด ํ™”๋ฉด์ด ํ•˜์–—๊ฒŒ ๋จ

๐Ÿ” ์›์ธ

  • map() ํ•จ์ˆ˜์—์„œ return์„ ์ƒ๋žตํ•˜์—ฌ undefined ๋ฐฐ์—ด์ด ์ƒ์„ฑ๋จ.
  • React๋Š” undefined๋ฅผ ๋ Œ๋”๋งํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์˜ค๋ฅ˜ ๋ฐœ์ƒ
// โŒ ์•„๋ฌด๊ฒƒ๋„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Œ
state.map((item) => {
  if (item.id === action.id) {
    // ...์ƒ๋žต
  }
})

โœ… ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

  • ์กฐ๊ฑด๋ฌธ ์™ธ์—๋„ ํ•ญ์ƒ return item์„ ํ•ด์ค˜์•ผ ํ•จ
๐Ÿ’ก์ž˜๋ชป ์ดํ•ดํ•˜๊ณ  ์žˆ๋˜ ๊ฐœ๋…

์ž˜๋ชป ์ดํ•ดํ•˜๊ณ  ์žˆ๋˜ ๊ฐœ๋…map()์€ ๊ฐ ์š”์†Œ์— ๋Œ€ํ•ด ๋ฐ˜๋“œ์‹œ ๋ฐ˜ํ™˜๊ฐ’์„ ๊ฐ€์ ธ์•ผ ํ•˜๋ฉฐ, ์กฐ๊ฑด ๋ถ„๊ธฐ ์™ธ๋ถ€์— ๊ธฐ๋ณธ return์„ ๋‘๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•จ.
state.map((item) => {
  if (item.id === action.id) {
    const newQuantity = item.quantity + 1;
    return {
      ...item,
      quantity: newQuantity,
      total: newQuantity * item.price,
    };
  }
  return item; // โœ… ํ•„์ˆ˜!
});

๐ŸŽ‰ ์ตœ์ข… ๊ฒฐ๊ณผ

๋ชจ๋“  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ ํ›„, ์žฅ๋ฐ”๊ตฌ๋‹ˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์ƒ ์ž‘๋™ํ•œ๋‹ค:

  • ํ‹ฐ์…”์ธ ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ
  • ๊ฐ ํ•ญ๋ชฉ๋ณ„๋กœ + / - ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ์ˆ˜๋Ÿ‰ ์กฐ์ ˆ
  • ์ˆ˜๋Ÿ‰์— ๋งž์ถฐ total ๊ฐ€๊ฒฉ ์ž๋™ ๊ณ„์‚ฐ
  • ์‚ญ์ œ ๋ฒ„ํŠผ์œผ๋กœ ๊ฐœ๋ณ„ ์‚ญ์ œ ๊ฐ€๋Šฅ


โœจ ๋งˆ๋ฌด๋ฆฌํ•˜๋ฉฐ

์ด ๊ณผ์ •์„ ํ†ตํ•ด useReducer์˜ ๊ตฌ์กฐ์  ์ด์ , map() ์‚ฌ์šฉ ์‹œ return์˜ ์ค‘์š”์„ฑ, ๊ฐ์ฒด ์ดˆ๊ธฐํ™” ์‹œ this ์‚ฌ์šฉ์˜ ์˜ค๋ฅ˜ ๋“ฑ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ๊ตฌ์กฐ์ ์œผ๋กœ ํ•˜๋˜, ๋กœ์ง์€ ํ•ญ์ƒ ํ•œ ๋‹จ๊ณ„์”ฉ ๊ณ„์‚ฐ → ์—…๋ฐ์ดํŠธ → ๋ Œ๋”๋ง ์ˆœ์„œ๋กœ ์ •ํ™•ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ตํ›ˆ๋„ ์–ป์—ˆ๋‹ค.


728x90
'๐Ÿงก Projects/๐Ÿงก Projects: Web' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [ ๋ฌด๋ฌผ ] ๊ทผ์ฒ˜ ์‚ฌ์šฉ์ž ์ฐพ๊ธฐ #1 : ์œ„๋„ / ๊ฒฝ๋„ GPS ๊ธฐ๋ฐ˜ WebSocket ์„ธํŒ…ํ•˜๊ธฐ
  • [ ๋ฌด๋ฌผ ] ๊ทผ์ฒ˜ ์‚ฌ์šฉ์ž ์ฐพ๊ธฐ #2 : ์‹ค์‹œ๊ฐ„ ์‚ฌ์šฉ์ž ๊ฐ์ง€ ๋ฐ ์‚ฌ์šฉ์ž ์•„๋ฐ”ํƒ€ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
  • [ ๋ฌด๋ฌผ ] ๊ทผ์ฒ˜ ์‚ฌ์šฉ์ž ์ฐพ๊ธฐ #3 : ๋‚˜์™€ ๋™์ผํ•œ ํ”„๋กœํ•„ ์œ ํ˜• ํด๋ฆญํ•˜๋ฉด ์Šคํƒฌํ”„ ์ ๋ฆฝ ๋ฐ ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ ์• ๋‹ˆ๋ฉ”์ด์…˜
  • [ ๋ฌด๋ฌผ ] Prisma ORM ์œผ๋กœ NextJS ๋ฐฑ์—”๋“œ ์„œ๋ฒ„ ๊ตฌ์ถ•ํ•˜๊ธฐ
eyes from es
eyes from es
  • eyes from es
    eyes from es
    eyes from es
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ
      • โค๏ธ ๊ฟ€ํŒ ๋ชจ์Œ
        • โค๏ธ ๊ฐ“์ƒ ๊ฟ€ํŒ
        • โค๏ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ
      • ๐Ÿงก Projects
        • ๐Ÿงก Projects: Web
        • ๐ŸŽคPreterview
        • ๐Ÿงก Projects: App
        • ๐Ÿงก๋Œ€์™ธํ™œ๋™
        • ๐Ÿงก OSCCA ์˜คํ”ˆ์†Œ์Šค ์ปจํŠธ๋ฆฌ๋ทฐ์…˜ ์•„์นด๋ฐ๋ฏธ
      • ๐Ÿ’› Frontend
        • ๐Ÿ’› Frontend : React
        • ๐Ÿ’› Frontend : JavaScript
        • ๐Ÿ’› Frontend : TypeScript
      • ๐Ÿ’š Backend
      • ๐Ÿ’™ OS: ์šด์˜์ฒด์ œ
        • ๐Ÿ’™ Linux
      • ๐Ÿ’œ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ
        • ๐Ÿ’œ ์ž๋ฃŒ๊ตฌ์กฐ
        • ๐Ÿ’œ ์•Œ๊ณ ๋ฆฌ์ฆ˜
        • ๐Ÿ’œ ๋ฐฑ์ค€
        • ๐Ÿ’œSWEA
        • ๐Ÿ’œํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค
      • ๐Ÿ”ด Study
        • ๐Ÿ”ด๋ฉด์ ‘ ์Šคํ„ฐ๋””
        • ๐Ÿ”ด ๊ธฐ์—…๋ถ„์„
        • ๐Ÿ”ด ์—๋Ÿฌ๋…ธํŠธ(Error Note)๐Ÿงฑ
        • ๐Ÿ”ด ITNews(Coding)
        • ๐Ÿ”ด ITNews(Tech)
      • ๐ŸŸ  ์ธ์ƒ ๊ณ„ํš
        • ๐ŸŸ  ์˜ฌํ•ด ๋ชฉํ‘œ
      • ๐ŸŸก TIL
        • ๐ŸŸก TIL ์ผ๊ธฐ
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ๋ฐฉํ•™์Šคํ„ฐ๋””
    ๋„ค์นด๋ผ์ฟ ๋ฐฐ
    ์ตœ๊ทผ์ด์Šˆ
    ์ฝ”๋”ฉํ…Œ์ŠคํŠธ
    ๋‰ด์Šค์Šคํฌ๋žฉ
    ์‚ผ์„ฑ์ „์ž
    ์ฝ”ํ…Œ
    Ai
    ์ž๋ฃŒ๊ตฌ์กฐ
    SW์ด์Šˆ
    IT์ด์Šˆ
    C
    ์Šค๋งˆํŠธ์‹ฑ์Šค
    ์ฝ”๋“œ์Šคํ„ฐ๋””
    ๊ธฐ์—…๋ถ„์„
    ์•Œ๊ณ ๋ฆฌ์ฆ˜
    html
    css
    ์ฝ”๋“œ๋ฆฌ๋ทฐ
    ๋ถ„์„๋ ˆํฌํŠธ
    ์ŠคํŒŒ๋ฅดํƒ€์ฝ”๋”ฉํด๋Ÿฝ
    ์Šคํ„ฐ๋””
    ๋‰ด์Šค๋ฃธ
    ๋ฌธ์ œํ’€์ด
    ๋™ํ–ฅ๋ถ„์„
    ์›น๊ฐœ๋ฐœ
    ์ฝ”๋”ฉ
    ๊ฐœ๋ฐœ๊ณต๋ถ€
    ๊ฐœ๋ฐœ
    ๋ฐฑ์ค€
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.5
eyes from es
[ React ] ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๊ตฌํ˜„ ์ค‘ ์ˆ˜๋Ÿ‰์— ๋”ฐ๋ฅธ ๊ฐ€๊ฒฉ ๊ณ„์‚ฐ ์˜ค๋ฅ˜ ์ด์Šˆ ํ•ด๊ฒฐ
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”