๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿงก Projects/๐Ÿงก Projects: Web

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

by eyes from es 2025. 4. 7.
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
๋ฐ˜์‘ํ˜•