๋ฐ˜์‘ํ˜•

๋™๊ธฐ ์ž‘์—…์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ํ”„๋กœ๋ฏธ์Šค


ํ”„๋กœ๋ฏธ์Šค๋Š” ๋ชจ๋“  ๋™๊ธฐ ์ž‘์—…์„ ์™„๋ฃŒํ•œ ํ›„์— ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์•„๋ž˜ ์˜ˆ์‹œ์—์„œ then ํ›„์† ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ์— ๋„˜๊ธด console.log๋Š” ์ ˆ๋Œ€ ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.

// ์ฝ”๋“œ ์ฐธ๊ณ  via ์˜ค๋Š˜์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ
new Promise((resolve) => {
  console.log('1'); // ๋™๊ธฐ ์˜์—ญ
  resolve('2');
}).then(console.log); // ๋น„๋™๊ธฐ ์˜์—ญ

let i = 0;
while (true) {
  i += 1;
}

 

ํ”„๋กœ๋ฏธ์Šค ์ƒ์„ฑ์ž์— ๋„˜๊ธด ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ ์ฝ˜์†”์— 1์„ ์ถœ๋ ฅํ•œ๋‹ค. resolve ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋ฉด ํ”„๋กœ๋ฏธ์Šค๋Š” ์ดํ–‰(fulfilled) ์ƒํƒœ๊ฐ€ ๋˜๊ณ  ๊ฒฐ๊ณผ ๊ฐ’๊ณผ ํ•จ๊ป˜ ์ƒˆ๋กœ์šด ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค. ๊ทธ๋Ÿผ then ํ›„์† ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ๋กœ ์‹คํ–‰ ํ„ด์ด ๋„˜์–ด๊ฐ„๋‹ค. ์—ฌ๊ธฐ์„œ๋ถ€ํ„ฐ ๋น„๋™๊ธฐ ์˜์—ญ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ”๋กœ ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.

 

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

 

ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์ด์šฉํ•ด ๋‹ค์Œ ํ„ด์œผ๋กœ ์ž‘์—… ๋ฏธ๋ฃจ๊ธฐ


๊ฐ™์€ ํ„ด์— ์ˆ˜ํ–‰ํ•  ์ž‘์—…์ด ๋งŽ๋‹ค๋ฉด Async/Await๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋ณด๋‹จ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์ด์šฉํ•ด ๋‹ค์Œ ํ„ด์œผ๋กœ ๋ฏธ๋ฃฐ ์ˆ˜๋„ ์žˆ๋‹ค.

// ์ฝ”๋“œ ์ฐธ๊ณ  via ์˜ค๋Š˜์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ
login() // TURN 1
  .then(() => {
    changeUI(); // TURN 2
    return updateProfile();
  })
  .then(() => {
    reloadPage(); // TURN 3
  });

 

์œ„ ์ฝ”๋“œ๋Š” ์•„๋ž˜ ๊ณผ์ •์œผ๋กœ ์‹คํ–‰๋œ๋‹ค. ๊ฐ ํ„ด(Turn)์€ ๋ชจ๋“  ๋™๊ธฐ ์ž‘์—…์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ๋‹ค. ์ฆ‰, ๋™๊ธฐ ์ž‘์—…์„ ๋งˆ์นœ ํ›„ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํƒ€์ด๋ฐ์ด ์™”์„ ๋•Œ ๋น„๋กœ์†Œ ์‹คํ–‰๋œ๋‹ค.

  1. [TURN 1] login() ์‹คํ–‰
    ——— ๋™๊ธฐ ์ž‘์—… ์‹คํ–‰ ———
  2. [TURN 2] changeUI(), updateProfile() ์‹คํ–‰
    ——— ๋™๊ธฐ ์ž‘์—… ์‹คํ–‰ ———
  3. [TURN 3] reloadPage() ์‹คํ–‰

 

ํ”„๋กœ๋ฏธ์Šค๋ฅผ ํ™œ์šฉํ•œ UX ๊ฐœ์„ 


์œ ์ € ์ •๋ณด, ๊ฒฐ์ œ ๋‚ด์—ญ, ์นœ๊ตฌ ๋ชฉ๋ก์„ ๋ณด์—ฌ์ฃผ๋Š” ๋งˆ์ดํŽ˜์ด์ง€๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณธ๋‹ค. 3๊ฐœ ๋ชจ๋‘ ์ค‘์š”ํ•œ ์ •๋ณด์ง€๋งŒ ๋งˆ์ดํŽ˜์ด์ง€๋Š” ์œ ์ € ์ •๋ณด๋ฅผ ์šฐ์„ ์ ์œผ๋กœ ๋ณด์—ฌ์ฃผ๋Š” ๊ณต๊ฐ„์ด๋‹ค. ํ•˜์ง€๋งŒ ์•„๋ž˜ ์˜ˆ์‹œ์—์„  ๋ชจ๋“  ๋ฐ์ดํ„ฐ Fetching์„ ์™„๋ฃŒํ•ด์•ผ๋งŒ ๋ถˆ๋Ÿฌ์˜จ ์ •๋ณด๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฒซ ๋ Œ๋”๋ง์˜ ๋กœ๋”ฉ ์‹œ๊ฐ„์ด ๋” ๊ธธ์ด์ง€๋Š” ์…ˆ์ด๋‹ค.

// ์ฝ”๋“œ ์ฐธ๊ณ  via ์˜ค๋Š˜์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ
function MyPage() {
  const [userInfo, setUserInfo] = useState(null);
  const [billHistory, setBillHistory] = useState([]);
  const [friendsList, setFriendsList] = useState([]);

  useEffect(() => {
    (async () => {
      const userInfoData = await fetchUserInfo();
      const billHistoryData = await fetchBillHistory();
      const friendsListData = await fetchFriendsList();

      setUserInfo(userInfoData);
      setBillHistory(billHistoryData);
      setFriendsList(friendsListData);
    })();
  }, []);

  // ...
}

 

then ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•ด ์œ ์ € ์ •๋ณด๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” fetchUserInfo๋ฅผ ๋จผ์ € ์‹คํ–‰ํ•˜๋„๋ก ์ˆ˜์ •ํ•˜๋ฉด, ๊ฒฐ์ œ ๋‚ด์—ญ๊ณผ ์นœ๊ตฌ ๋ชฉ๋ก์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ Fetching์„ ์ฒซ ๋ Œ๋”๋ง์—์„œ ์ œ์™ธ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿผ ์‚ฌ์šฉ์ž๋Š” ์œ ์ € ์ •๋ณด๋ฅผ ์กฐ๊ธˆ ๋” ๋นจ๋ฆฌ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. then ๋ฉ”์„œ๋“œ์˜ ์ฝœ๋ฐฑ์€ API ํ˜ธ์ถœ ์ดํ›„ ๋ชจ๋“  ๋™๊ธฐ ์ž‘์—…์„ ์™„๋ฃŒํ•œ ์‹œ์ ์— ์‹คํ–‰๋œ๋‹ค.

// ์ฝ”๋“œ ์ฐธ๊ณ  via ์˜ค๋Š˜์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ
function MyPage() {
  const [userInfo, setUserInfo] = useState(null);
  const [billHistory, setBillHistory] = useState([]);
  const [friendsList, setFriendsList] = useState([]);

  useEffect(() => {
    fetchUserInfo().then(async (userInfoData) => {
      // ๋ฐ์ดํ„ฐ Fetching ์ดํ›„ ๋ชจ๋“  ๋™๊ธฐ ์ž‘์—…์„ ์™„๋ฃŒํ•˜๋ฉด ์‹คํ–‰ ↓
      setUserInfo(userInfoData);

      const billHistoryData = await fetchBillHistory();
      const friendsListData = await fetchFriendsList();
      setBillHistory(billHistoryData);
      setFriendsList(friendsListData);
    });
  }, []);

  // ...
}

 

๐Ÿ’ก setUserInfo ๋””์ŠคํŒจ์น˜ ํ˜ธ์ถœ์„ await fetchUserInfo ๋ฐ”๋กœ ๋‹ค์Œ ๋ผ์ธ์œผ๋กœ ์ด๋™์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” ๋™์ผํ•˜์ง€๋งŒ ๋™๊ธฐ ์ž‘์—… ์ปจํŠธ๋กค์€ then์„ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ๊ฐ€ ๋” ์šฉ์ดํ•˜๋‹ค.

 

๋ ˆํผ๋Ÿฐ์Šค


 

ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์ œ๋Œ€๋กœ ์•Œ๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ

๋งŽ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์™œ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š”์ง€์กฐ์ฐจ ๋ชจ๋ฅด๊ณ  ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค

medium.com

 


๊ธ€ ์ˆ˜์ •์‚ฌํ•ญ์€ ๋…ธ์…˜ ํŽ˜์ด์ง€์— ๊ฐ€์žฅ ๋น ๋ฅด๊ฒŒ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค. ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•ด ์ฃผ์„ธ์š”
๋ฐ˜์‘ํ˜•