๐Ÿ“– TIL - "๋“œ๋””์–ด ์ดํ•ดํ–ˆ๋‹ค!" Promise.all๊ณผ ๋น„๋™๊ธฐ ํ•จ์ˆ˜์˜ ๋น„๋ฐ€ ๐Ÿ”

์Š˜ยท2025๋…„ 1์›” 25์ผ

๐Ÿ“– TIL

๋ชฉ๋ก ๋ณด๊ธฐ
36/90

๐Ÿ“Œ ๋ฌธ์ œ ์„ค๋ช…

๋ฌธ์ œ ์„ค๋ช…

์—ฌ๋Ÿฌ ๋น„๋™๊ธฐ ํ•จ์ˆ˜์—์„œ ๋ฐ˜ํ™˜๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ‘ํ•ฉํ•˜๊ณ  id ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•˜๋Š” ๋ฌธ์ œ

์ž…๋ ฅ

  • ๋น„๋™๊ธฐ ํ•จ์ˆ˜ ๋ฐฐ์—ด (๊ฐ ํ•จ์ˆ˜๋Š” ๋ฐฐ์—ด ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ ๋ฐ˜ํ™˜)

์ถœ๋ ฅ

  • id ๊ธฐ์ค€์œผ๋กœ ๋ณ‘ํ•ฉ๋˜๊ณ  ์ •๋ ฌ๋œ ๋ฐฐ์—ด

์˜ˆ์‹œ

// ํ•จ์ˆ˜ A ๋ฐ˜ํ™˜๊ฐ’: [{ id:1, name:'Alice'}, { id:2, age:20 }]
// ํ•จ์ˆ˜ B ๋ฐ˜ํ™˜๊ฐ’: [{ id:1, age:25 }, { id:3, gender:'F'}]

// ๊ฒฐ๊ณผ: 
[
  { id:1, name:'Alice', age:25 },
  { id:2, age:20 },
  { id:3, gender:'F'}
]

๐Ÿค” ๋ฌธ์ œ ์ ‘๊ทผ

  1. ๋น„๋™๊ธฐ ํ•จ์ˆ˜ ๋ฐฐ์—ด์˜ ์‹คํ–‰ ์‹œ์  ์ดํ•ด

    • ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋Š” ์‹คํ–‰(ํ˜ธ์ถœ)๋˜์–ด์•ผ Promise ๋ฐ˜ํ™˜
    • map์œผ๋กœ ๊ฐ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•จ
  2. Promise.all๊ณผ ๋ฐฐ์—ด ์ฒ˜๋ฆฌ

    • Promise.all๋กœ ๋ชจ๋“  ๋น„๋™๊ธฐ ์ž‘์—… ์™„๋ฃŒ ๋Œ€๊ธฐ
    • flat()์œผ๋กœ ์ค‘์ฒฉ ๋ฐฐ์—ด ํ‰ํƒ„ํ™” ํ•„์š”
  3. ๋ฐ์ดํ„ฐ ๋ณ‘ํ•ฉ ์ „๋žต

    • reduce๋กœ id ๊ธฐ์ค€ ๋ฐ์ดํ„ฐ ๋ณ‘ํ•ฉ
    • ์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž๋กœ ๊ฐ์ฒด ์†์„ฑ ์—…๋ฐ์ดํŠธ

๐Ÿ’ก ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

async function asyncDataMerger(...asyncFunctions) {
  const combineArr = (
    await Promise.all(asyncFunctions.map((func) => func()))
  ).flat();
  
  return combineArr
    .reduce((a, c) => {
      const curIdx = a.findIndex((e) => c.id === e.id);
      if (curIdx !== -1) {
        a[curIdx] = { ...a[curIdx], ...c };
      } else {
        a.push(c);
      }
      return a;
    }, [])
    .sort((a, b) => a.id - b.id);
}

๐Ÿ” ์ฝ”๋“œ ์„ค๋ช…

1. map์„ ์‚ฌ์šฉํ•œ ํ•จ์ˆ˜ ์‹คํ–‰

const asyncFunctions = [
  async () => [...], // ์•„์ง ์‹คํ–‰๋˜์ง€ ์•Š์€ ํ•จ์ˆ˜
  async () => [...], // ์•„์ง ์‹คํ–‰๋˜์ง€ ์•Š์€ ํ•จ์ˆ˜
];

asyncFunctions.map(fn => fn()) // ๊ฐ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜์—ฌ Promise ๋ฐ˜ํ™˜
  • ๋ฐฐ์—ด ์•ˆ์˜ ํ•จ์ˆ˜๋“ค์€ ์‹คํ–‰๋˜์ง€ ์•Š์€ ์ƒํƒœ
  • map์œผ๋กœ ๊ฐ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์•ผ Promise ๊ฐ์ฒด ๋ฐ˜ํ™˜
  • ๋‹จ์ˆœํžˆ spread ์—ฐ์‚ฐ์ž([...asyncFunctions])๋กœ๋Š” ํ•จ์ˆ˜ ์‹คํ–‰ ๋ถˆ๊ฐ€

2. Promise.all๊ณผ flat ๋™์ž‘

// Promise.all์˜ ๊ฒฐ๊ณผ (๋ฐฐ์—ด์˜ ๋ฐฐ์—ด)
[
  [{ id: 1, name: 'Alice' }, { id: 2, age: 20 }],
  [{ id: 1, age: 25 }, { id: 3, gender: 'F' }]
]

// flat() ์ ์šฉ ํ›„ (1์ฐจ์› ๋ฐฐ์—ด)
[
  { id: 1, name: 'Alice' }, 
  { id: 2, age: 20 },
  { id: 1, age: 25 }, 
  { id: 3, gender: 'F' }
]
  • Promise.all์€ ๊ฐ Promise์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜
  • ๊ฒฐ๊ณผ๊ฐ€ ์ค‘์ฒฉ ๋ฐฐ์—ด ํ˜•ํƒœ์ด๋ฏ€๋กœ flat()์œผ๋กœ ํ‰ํƒ„ํ™” ํ•„์š”
  • flat()์€ ๋‹ค์ฐจ์› ๋ฐฐ์—ด์„ 1์ฐจ์› ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜

3. ๋ฐ์ดํ„ฐ ๋ณ‘ํ•ฉ ๊ณผ์ •

.reduce((a, c) => {
  const curIdx = a.findIndex((e) => c.id === e.id);
  if (curIdx !== -1) {
    a[curIdx] = { ...a[curIdx], ...c };  // ๊ฐ์ฒด ๋ณ‘ํ•ฉ
  } else {
    a.push(c);  // ์ƒˆ๋กœ์šด id๋Š” ์ถ”๊ฐ€
  }
  return a;
}, [])

โœจ ์ƒˆ๋กญ๊ฒŒ ๋ฐฐ์šด ์ 

  1. async/await์™€ Promise์˜ ๊ด€๊ณ„

    • async๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์„ ํ•  ํ•จ์ˆ˜๋ฅผ ์ •์˜
    • await๋Š” ๋น„๋™๊ธฐ ๋ถ€๋ถ„์˜ ์™„๋ฃŒ๋ฅผ ๋Œ€๊ธฐ
  2. map๊ณผ Promise.all์˜ ํ˜‘๋ ฅ

    • map: ์‹คํ–‰๋˜์ง€ ์•Š์€ ํ•จ์ˆ˜๋“ค์„ ์‹คํ–‰์‹œ์ผœ Promise ์ƒ์„ฑ
    • Promise.all: ์ƒ์„ฑ๋œ Promise๋“ค์˜ ์™„๋ฃŒ๋ฅผ ๋Œ€๊ธฐ
  3. flat์˜ ์œ ์šฉ์„ฑ

    • ์ค‘์ฒฉ ๋ฐฐ์—ด ๊ตฌ์กฐ๋ฅผ ๋‹จ์ˆœํ™”
    • Promise.all ๊ฒฐ๊ณผ ์ฒ˜๋ฆฌ์— ํšจ๊ณผ์ 

๐Ÿš€ ์ด๋Ÿฐ ์ ์ด ํšจ์œจ์ ์ด์—์š”

  • map์œผ๋กœ ํ•จ์ˆ˜ ์‹คํ–‰๊ณผ Promise ์ƒ์„ฑ์„ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌ
  • flat์œผ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ฐฐ์—ด ๊ตฌ์กฐ ๋‹จ์ˆœํ™”
  • reduce๋กœ ๊ฐ์ฒด ๋ณ‘ํ•ฉ์„ ํšจ์œจ์ ์œผ๋กœ ์ˆ˜ํ–‰

โญ๏ธ ์ฐธ๊ณ  ์ž๋ฃŒ

  • Promise.all MDN ๋ฌธ์„œ
  • Array methods (flat, map, reduce)
  • async/await ๊ฐœ๋…
profile
์ฃผ๋‹ˆ์–ด ํ”„๋ก ํŠธ์—”๋“œ ์„ฑ์žฅ๊ธฐ ๊ธฐ๋ก๊ธฐ๋ก

0๊ฐœ์˜ ๋Œ“๊ธ€