๐น 1. ๋ฌธ์ ์ํฉ ๋ฐ ๊ฐ์
๐ ๋ฌธ์ : ๋ก๊ทธ์ธ ํ ์์ฐ ๋ฐ์ดํฐ๋ฅผ ํ์ธํ๊ธฐ ์ ์ ํ์ด์ง๊ฐ ๋จผ์ ์ด๋ํ๋ ๋ฌธ์
- ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธํ๋ฉด ๊ธฐ์กด ์์ฐ ๋ฐ์ดํฐ๋ฅผ ํ์ธํ ํ ํ์ด์ง๋ฅผ ์ด๋ํด์ผ ํจ
- ํ์ง๋ง ๋น๋๊ธฐ ์์ฒญ(fetchBudget())์ด ์๋ฃ๋๊ธฐ ์ ์ ํ์ด์ง ์ด๋ ์ฝ๋๊ฐ ์คํ๋จ
- ๊ฒฐ๊ณผ์ ์ผ๋ก, ์์ฐ์ด ์๋ ๊ฒฝ์ฐ์๋ /goal-setting์ผ๋ก ์ด๋ํ๊ฑฐ๋ ์๋ชป๋ ๋ฐ์ดํฐ๋ฅผ ํ์ํ๋ ๋ฌธ์ ๋ฐ์
๐ ํด๊ฒฐ ๋ชฉํ
โ
๋ก๊ทธ์ธ ์ฑ๊ณต ํ, ๊ธฐ์กด ์์ฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ ํ ํ์ด์ง ์ด๋
โ
๋น๋๊ธฐ ์์ฒญ(fetchBudget())์ด ๋๋ ๋๊น์ง goalAmount ๊ฐ์ ๊ธฐ๋ค๋ฆฐ ํ ํ์ด์ง ์ ํ
โ
UI ๊น๋นก์์ ๋ฐฉ์งํ๊ณ ์์ฐ์ค๋ฌ์ด ํ๋ฉด ์ ํ ์ ๊ณต
๐น 2. ๋น๋๊ธฐ ์์ฒญ๊ณผ await์ ๊ฐ๋
๐ ๋น๋๊ธฐ ์์ฒญ์ด๋?
- ๋น๋๊ธฐ(asynchronous) ์์ฒญ์ ๋ฐฑ์๋ ์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ ํ, ์๋ต์ด ์ฌ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ์ฝ๋๊ฐ ๊ณ์ ์คํ๋๋ ๋ฐฉ์
- ์๋ฅผ ๋ค์ด, ๋ก๊ทธ์ธ ์์ฒญ์ ๋ณด๋์ ๋ ์๋ฒ ์๋ต์ ๊ธฐ๋ค๋ฆฌ๋ ๋์ ๋ค๋ฅธ ์ฝ๋๊ฐ ๋จผ์ ์คํ๋ ์ ์์
- ๊ฒฐ๊ณผ: fetchBudget()์ด ์คํ๋์์ง๋ง, ์๋ฃ๋์ง ์์ ์ํ์์ ํ์ด์ง๊ฐ ์ด๋ํ์ฌ ์๋ชป๋ goalAmount ๊ฐ์ด ์ฌ์ฉ๋ ์ ์์
๐ await์ ๋ฌด์์ธ๊ฐ?
- await์ ๋น๋๊ธฐ ์์ฒญ์ด ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๊ธฐ๋ฅ
- await์ ์ฌ์ฉํ๋ฉด, ํด๋น ์์ฒญ์ด ๋๋ ๋๊น์ง ์ฝ๋ ์คํ์ ๋ฉ์ถ๊ณ ๊ธฐ๋ค๋ฆผ
- ๊ฒฐ๊ณผ์ ์ผ๋ก, ์์ฐ ๋ฐ์ดํฐ๊ฐ ํ์คํ ๋ก๋๋ ํ ํ์ด์ง๊ฐ ์ด๋ํ ์ ์๋๋ก ๋ณด์ฅํ ์ ์์
๐น 3. ๊ธฐ์กด ์ฝ๋์์ ๋ฐ์ํ ๋ฌธ์ ( ๋น๋๊ธฐ ํจ์์ await์ ๋ฃ์ง ์์์)
const handleLogin = async (e) => {
e.preventDefault();
setLoading(true);
try {
const data = await login(email, password);
const { accessToken, refreshToken } = data.data;
localStorage.setItem('accessToken', accessToken);
localStorage.setItem('refreshToken', refreshToken);
setFetchingBudget(true);
const budgetAmount = fetchBudget(); // โ ์ฌ๊ธฐ์์ await์ด ์์ผ๋ฉด ๋น๋๊ธฐ ์์ฒญ์ด ์๋ฃ๋๊ธฐ ์ ์ ๋ค์ ์ฝ๋ ์คํ๋จ
setFetchingBudget(false);
// โ ๋น๋๊ธฐ ์์ฒญ์ด ๋๋์ง ์์ ์ํ์์ budgetAmount๋ฅผ ํ์ธํ์ฌ ํ์ด์ง ์ด๋
if (budgetAmount !== null && budgetAmount > 0) {
navigate('/main');
} else {
navigate('/initial');
}
} catch (error) {
console.error('๋ก๊ทธ์ธ ์คํจ:', error);
} finally {
setLoading(false);
}
};
โ ๏ธ ๋ฌธ์ ์ -> ์์ฐ์ ๊ฐ์ง๊ณ ์ค๊ธฐ๋ ์ ์ ๋ฐ๋ก navigate๋ ๊ฐ๋ฅ์ฑ์ด ๋ํํจ.. ใ
- fetchBudget()์ด ์คํ๋์์ง๋ง, ์๋ฃ๋์ง ์์ ์ํ์์ budgetAmount ๊ฐ์ ํ์ธํ๋ ค๊ณ ํจ
- ๋น๋๊ธฐ ์์ฒญ์ด ๋๋๊ธฐ ์ ์ navigate()๊ฐ ์คํ๋์ด ์๋ชป๋ ํ์ด์ง๋ก ์ด๋ํ ์ ์์
- ๊ฒฐ๊ณผ: ๊ธฐ์กด ์์ฐ์ด ์๋ ์ฌ์ฉ์๋ /goal-setting์ผ๋ก ์ด๋ํ ๊ฐ๋ฅ์ฑ์ด ์์
๐น 4. ํด๊ฒฐ ๋ฐฉ๋ฒ: await์ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ ์์ฒญ์ด ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๊ธฐ
const handleLogin = async (e) => {
e.preventDefault();
setLoading(true);
try {
const data = await login(email, password);
const { accessToken, refreshToken } = data.data;
localStorage.setItem('accessToken', accessToken);
localStorage.setItem('refreshToken', refreshToken);
setModalMessage({
type: 'success',
message: '๋ก๊ทธ์ธ ์ฑ๊ณต! ์์ฐ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๊ณ ์์ต๋๋ค!',
});
// โ
fetchBudget()์ด ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆผ
setFetchingBudget(true);
const budgetAmount = await fetchBudget();
setFetchingBudget(false);
console.log('๐ฆ ๋ก๊ทธ์ธ ํ ๋ฐ์ ์์ฐ ๊ธ์ก:', budgetAmount);
// โ
๋น๋๊ธฐ ์์ฒญ์ด ๋๋ ํ ํ์ด์ง ์ด๋ (500ms ๋๊ธฐ → UI ๊น๋นก์ ๋ฐฉ์ง)
setTimeout(() => {
navigate(budgetAmount !== null && budgetAmount > 0 ? '/main' : '/initial');
}, 500);
} catch (error) {
console.error('๋ก๊ทธ์ธ ์คํจ:', error);
setModalMessage({
type: 'error',
message: '๋ก๊ทธ์ธ ์คํจ! ๋ค์ ์๋ํด์ฃผ์ธ์.',
});
} finally {
setLoading(false);
}
};
๐น 5. await์ด ์ ์ฉ๋ ํ ๋น๋๊ธฐ ํน์ฑ์ ๊ณ ๋ คํ ํ๋ฆ
๐ ๋ก๊ทธ์ธ ๋ฒํผ ํด๋ฆญ → ๋ก๊ทธ์ธ ์์ฒญ → ๋ก๊ทธ์ธ ์ฑ๊ณต → fetchBudget() ์คํ → ๋ฐ์ดํฐ๊ฐ ๋ก๋๋ ๋๊น์ง await์ผ๋ก ๋๊ธฐ → budgetAmount ํ์ธ → ํ์ด์ง ์ด๋
1๏ธโฃ | handleLogin() ์คํ | ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ ๋ฒํผ์ ํด๋ฆญํ๋ฉด ์คํ |
2๏ธโฃ | await login(email, password) | ๋ก๊ทธ์ธ ์์ฒญ์ ๋ณด๋ด๊ณ ์๋ต์ ๋ฐ์ ๋๊น์ง ๊ธฐ๋ค๋ฆผ |
3๏ธโฃ | ํ ํฐ ์ ์ฅ | accessToken, refreshToken์ localStorage์ ์ ์ฅ |
4๏ธโฃ | await fetchBudget() | ์๋ฒ์์ ์์ฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ๋๊น์ง ๊ธฐ๋ค๋ฆผ |
5๏ธโฃ | budgetAmount ํ์ธ | ์์ฐ์ด ์์ผ๋ฉด /main์ผ๋ก ์ด๋, ์์ผ๋ฉด /initial์ผ๋ก ์ด๋ |
6๏ธโฃ | setTimeout() | UI ๊น๋นก์ ๋ฐฉ์ง๋ฅผ ์ํด 500ms ๋๊ธฐ ํ ํ์ด์ง ์ด๋ |
๐ ์ต์ข ์ ๋ฆฌ
โ๏ธ ๋น๋๊ธฐ ์์ฒญ(fetchBudget())์ด ์๋ฃ๋ ๋๊น์ง await์ ์ฌ์ฉํ์ฌ ๋๊ธฐ
โ๏ธ ๊ธฐ์กด ์์ฐ ๋ฐ์ดํฐ๋ฅผ ์์ ํ ๊ฐ์ ธ์จ ํ ํ์ด์ง ์ด๋
โ๏ธ UI ๊น๋นก์์ ๋ฐฉ์งํ๊ณ ์์ฐ์ค๋ฌ์ด ํ๋ฉด ์ ํ์ ์ ๊ณต (setTimeout(500ms))
๐ฏ ์ต์ข ๊ฒฐ๋ก
๐ฅ await fetchBudget()์ ์ฌ์ฉํ์ฌ ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ ํ ํ์ด์ง๋ฅผ ์ด๋ํจ์ผ๋ก์จ
โ๏ธ ์๋ชป๋ ํ์ด์ง ์ด๋ ๋ฐฉ์ง
โ๏ธ UI ๊น๋นก์ ๋ฐฉ์ง
โ๏ธ ์ฌ์ฉ์ ๊ฒฝํ(UX) ๊ฐ์
์ด์ ๋ก๊ทธ์ธ ํ ๊ธฐ์กด ์์ฐ์ด ์๋ ์ฌ์ฉ์๋ ๋ฐ๋ก ๋ฉ์ธ ํ์ด์ง๋ก ์ด๋ํ๊ณ ,
์๋ก์ด ์ฌ์ฉ์๋ ์์ฐ์ ์ค์ ํ๋๋ก ์๋ดํ๋ /goal-setting ํ์ด์ง๋ก ์ด๋ํ ์ ์์ต๋๋ค! ๐๐ฅ