Promise.all()๊ณผ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ - ์ฝ˜์†” ๋กœ๊ทธ๋งŒ ์ถ”๊ฐ€ํ–ˆ๋Š”๋ฐ ๋ฒ„๊ทธ๊ฐ€ ๊ณ ์ณ์กŒ๋‹ค?

    ๐Ÿค” ๋ฌธ์ œ ์ƒํ™ฉ

    ์ œ์ผ ์ฒซ ๋Œ“๊ธ€์˜ ์œ ์ € ๋‹‰๋„ค์ž„์„ ๋ชป๋ถˆ๋Ÿฌ์˜ค๋Š” ์ƒํ™ฉ

    React ํ”„๋กœ์ ํŠธ์—์„œ Firebase Firestore๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ณผ์ •์—์„œ ์žฌ๋ฏธ์žˆ๋Š” ํ˜„์ƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์‹œ๋ฅผ ์™„๋ฃŒํ•œ ์‚ฌ์šฉ์ž๋“ค์˜ ๋‹‰๋„ค์ž„์„ ํ‘œ์‹œํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋˜ ์ค‘, ๋ช‡๋ช‡ ์‹œ์—์„œ ์ฒซ ๋ฒˆ์งธ ์‚ฌ์šฉ์ž์˜ ๋‹‰๋„ค์ž„์ด ํ‘œ์‹œ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. 

    ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์œ„ํ•ด ์ฝ˜์†” ๋กœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋Š”๋ฐ, ๋†€๋ž๊ฒŒ๋„ ๋กœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!

     

     

    ๐Ÿ” ์›์ธ ๋ถ„์„

    ์›๋ž˜ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค:

    const fetchUserNicknames = async (userIds: string\[\]) => {  
      if (!userIds.length) return;  
    
      try {  
        const nicknames: { \[key: string\]: string } = {};  
    
        for (const userId of userIds) {  
          if (nicknames\[userId\]) continue;  
    
          const userDoc = await getDoc(doc(db, 'users', userId));  
          if (userDoc.exists()) {  
            const userData = userDoc.data();  
            nicknames\[userId\] = userData.nickname || userData.displayName || userId.substring(0, 8);  
          } else {  
            nicknames\[userId\] = userId.substring(0, 8);  
          }  
        }  
    
        setCompletedUserNames(nicknames);  
      } catch (error) {  
        console.error('์‚ฌ์šฉ์ž ๋‹‰๋„ค์ž„ ๊ฐ€์ ธ์˜ค๊ธฐ ์˜ค๋ฅ˜:', error);  
      }  
    };  

     

    ์ด ์ฝ”๋“œ์˜ ๋ฌธ์ œ์ ์€:

    1. ์ˆœ์ฐจ์ ์œผ๋กœ ๋น„๋™๊ธฐ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋ฉด์„œ ๊ฐ ์š”์ฒญ ์‚ฌ์ด์˜ ํƒ€์ด๋ฐ ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
    2. ์ฝ˜์†” ๋กœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์„ ๋•Œ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋œ ๊ฒƒ์€, ๋กœ๊ทธ ์ถœ๋ ฅ์œผ๋กœ ์ธํ•ด ๊ฐ ๋น„๋™๊ธฐ ์ž‘์—… ์‚ฌ์ด์— ๋ฏธ์„ธํ•œ ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์ด ์ƒ๊ฒผ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

     

    ์‚ฌ์‹ค ์˜ˆ์ „์—๋„ ์ข…์ข… ๊ฒช์—ˆ์ง€๋งŒ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๋ฉด ๋ฐ”๋กœ ๋„˜๊ธฐ๊ณค ํ–ˆ๋Š”๋ฐ,

    ์กฐ๊ธˆ ๊ฒ€์ƒ‰ํ•ด์„œ ์ฐพ์•„๋ณด๋‹ˆ ์ด๋ฅผ "Heisenbug"๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๊ฑธ ์•Œ์•˜์Šต๋‹ˆ๋‹ค.

     

    https://en.wikipedia.org/wiki/Heisenbug

     

    Heisenbug - Wikipedia

    From Wikipedia, the free encyclopedia Software bug that seems to change when debugging For the Linux distribution codenamed Heisenbug, see Fedora Linux. In computer programming jargon, a heisenbug is a software bug that seems to disappear or alter its beha

    en.wikipedia.org

     

    Heisenbug : ๋ฒ„๊ทธ๋ฅผ ๊ด€์ฐฐํ•˜๋ ค๋Š” ํ–‰์œ„(๋กœ๊ทธ ์ถ”๊ฐ€)๊ฐ€ ๋ฒ„๊ทธ์˜ ๋™์ž‘์„ ๋ณ€๊ฒฝ์‹œํ‚ค๋Š” ํ˜„์ƒ

     

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

    ๋” ์•ˆ์ •์ ์ธ ํ•ด๊ฒฐ์„ ์œ„ํ•ด `Promise.all()`์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ๋น„๋™๊ธฐ ์š”์ฒญ์„ ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค:

    const fetchUserNicknames = async (userIds: string\[\]) => {  
    if (!userIds.length) return;
    
    try {  
    const nicknames: { \[key: string\]: string } = {};
    
    
    // Promise.all์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ์š”์ฒญ์„ ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌ  
    await Promise.all(  
      userIds.map(async (userId) => {  
        if (nicknames\[userId\]) return;  
    
        const userDoc = await getDoc(doc(db, 'users', userId));  
        if (userDoc.exists()) {  
          const userData = userDoc.data();  
          nicknames\[userId\] = userData.nickname || userData.displayName || userId.substring(0, 8);  
        } else {  
          nicknames\[userId\] = userId.substring(0, 8);  
        }  
      })  
    );  
    
    setCompletedUserNames(nicknames);  
    
    
    } catch (error) {  
    console.error('์‚ฌ์šฉ์ž ๋‹‰๋„ค์ž„ ๊ฐ€์ ธ์˜ค๊ธฐ ์˜ค๋ฅ˜:', error);  
    }  
    };  

     

    ์ˆ˜์ • ํ›„์—๋Š”,

    1. ๋ชจ๋“  ์‚ฌ์šฉ์ž ์ •๋ณด ์š”์ฒญ์ด ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
    2. ๊ฐ ์š”์ฒญ์ด ๋…๋ฆฝ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์–ด ํ•œ ์š”์ฒญ์˜ ์ง€์—ฐ์ด ๋‹ค๋ฅธ ์š”์ฒญ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    3. ๋ชจ๋“  ์š”์ฒญ์ด ์™„๋ฃŒ๋œ ํ›„์— ํ•œ ๋ฒˆ์— ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

     

    ๐Ÿ’ก ๊ตํ›ˆ

    1. ๋น„๋™๊ธฐ ์ž‘์—…์„ ๋‹ค๋ฃฐ ๋•Œ๋Š” ์ˆœ์ฐจ ์ฒ˜๋ฆฌ์™€ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ์˜ ์ฐจ์ด๋ฅผ ์ดํ•ดํ•˜๊ณ  ์ƒํ™ฉ์— ๋งž๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ
    2. ์ฝ˜์†” ๋กœ๊ทธ๋กœ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค๋ฉด, ๊ทธ๊ฒƒ์€ ํƒ€์ด๋ฐ ์ด์Šˆ์ผ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Œ!
    3. `Promise.all()` ์—ฌ๋Ÿฌ ๋น„๋™๊ธฐ ์ž‘์—…ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๊ธฐ 
    4. "Heisenbug" ํ˜„์ƒ์ด๋ผ๋Š” ๊ฒŒ  ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค ~~ 
    ๋ฐ˜์‘ํ˜•

    ๋Œ“๊ธ€