FrontEnd Develop/Project : Wallet Guardians

๋ณธ๊ฒฉ ์—ฐ๋™ #3. ํ”„๋ก ํŠธ์—์„œ์˜ ๋ผ์šฐํŒ…์„ ํ™œ์šฉํ•œ ๋ณด์•ˆ, ์ธ์ฆ ์ฒ˜๋ฆฌ

Frisbeen 2025. 2. 9. 16:01

๐Ÿ”น ๋ฌธ์ œ: ๊ฐœ๋ณ„ ํŽ˜์ด์ง€๋งˆ๋‹ค ์ธ์ฆ์„ ์ ์šฉํ•˜๋ฉด?

React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋กœ๊ทธ์ธ ํ›„ ํŠน์ • ํŽ˜์ด์ง€์—๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณดํ˜ธํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ž˜๋ชป๋œ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ๋ถˆํ•„์š”ํ•œ ์—ฐ์‚ฐ์ด ๋ฐœ์ƒํ•˜๊ณ , ์ฝ”๋“œ์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ์ธ์ฆ์„ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋Š” ๊ฐ ํŽ˜์ด์ง€๋งˆ๋‹ค ๊ฐœ๋ณ„์ ์œผ๋กœ ์ธ์ฆ ๋กœ์ง์„ ๊ฐ์‹ธ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

โŒ ๊ฐœ๋ณ„ ํŽ˜์ด์ง€๋งˆ๋‹ค ์ธ์ฆ์„ ์ ์šฉํ•˜๋Š” ๋ฐฉ์‹

<Route path="/main" element={<AuthenticatedComponent><MainPage /></AuthenticatedComponent>} />
<Route path="/profile" element={<AuthenticatedComponent><ProfilePage /></AuthenticatedComponent>} />
<Route path="/income" element={<AuthenticatedComponent><IncomePage /></AuthenticatedComponent>} />

โžก ๋ฌธ์ œ์ :

  1. ๊ฐ ํŽ˜์ด์ง€๋งˆ๋‹ค AuthenticatedComponent๊ฐ€ ์‹คํ–‰๋จ → ๋ถˆํ•„์š”ํ•œ ์—ฐ์‚ฐ ์ฆ๊ฐ€ โŒ
  2. ๋ชจ๋“  ํŽ˜์ด์ง€์—์„œ ์ธ์ฆ ๋กœ์ง์ด ์ค‘๋ณต๋จ → ์œ ์ง€๋ณด์ˆ˜ ์–ด๋ ค์›€ โŒ
  3. ๊ณตํ†ต UI(Navbar, Sidebar)๋„ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ฆฌ๋ Œ๋”๋ง๋  ๊ฐ€๋Šฅ์„ฑ โŒ

๐Ÿ”น ํ•ด๊ฒฐ์ฑ…: Layout์„ ๊ฐ์‹ธ ์ธ์ฆ์„ ์ตœ์ ํ™”ํ•˜๊ธฐ

๋Œ€์‹ , Layout ์ปดํฌ๋„ŒํŠธ๋ฅผ AuthenticatedComponent๋กœ ํ•œ ๋ฒˆ๋งŒ ๊ฐ์‹ธ์ฃผ๋ฉด ์ธ์ฆ์ด ํ•„์š”ํ•œ ๋ชจ๋“  ํŽ˜์ด์ง€์—์„œ ์ธ์ฆ ๊ฒ€์‚ฌ๋ฅผ ํ•œ ๋ฒˆ๋งŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โœ… ๊ณตํ†ต ๋ ˆ์ด์•„์›ƒ์„ ํ™œ์šฉํ•œ ์ตœ์ ํ™”๋œ ๋ฐฉ์‹

<Route
  element={
    <AuthenticatedComponent>
      <Layout />
    </AuthenticatedComponent>
  }
>
  <Route path="/main" element={<MainPage />} />
  <Route path="/profile" element={<ProfilePage />} />
  <Route path="/income" element={<IncomePage />} />
</Route>

โžก ์žฅ์ :

  1. AuthenticatedComponent๊ฐ€ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋จ → ๋ถˆํ•„์š”ํ•œ ์—ฐ์‚ฐ ๊ฐ์†Œ โœ…
  2. Layout ๋‚ด๋ถ€์˜ ๋ชจ๋“  ํŽ˜์ด์ง€๊ฐ€ ์ž๋™ ๋ณดํ˜ธ๋จ → ์ค‘๋ณต ์ฝ”๋“œ ์ œ๊ฑฐ โœ…
  3. ๊ณตํ†ต UI(Navbar, Sidebar)๊ฐ€ ์œ ์ง€๋˜๋ฉด์„œ ๋‚ด๋ถ€ ํŽ˜์ด์ง€๋งŒ ๋ณ€๊ฒฝ๋จ → ๋ Œ๋”๋ง ์ตœ์ ํ™” โœ…

๐Ÿ”น AuthenticatedComponent ๊ตฌํ˜„ ์˜ˆ์‹œ

import { useEffect, useContext } from 'react';
import { useNavigate } from 'react-router-dom';
import { GoalContext } from '../context/GoalContext';

const AuthenticatedComponent = ({ children }) => {
  const { goalAmount, loading } = useContext(GoalContext);
  const navigate = useNavigate();

  useEffect(() => {
    if (loading) return;

    const accessToken = localStorage.getItem('accessToken');

    if (!accessToken) {
      alert('๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•œ ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค. ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค');
      navigate('/login');
      return;
    }

    if (!goalAmount) {
      alert('๋ชฉํ‘œ ๊ธˆ์•ก์„ ์„ค์ •ํ•ด์ฃผ์„ธ์š”. ๋ชฉํ‘œ๊ธˆ์•ก ์„ค์ • ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค');
      navigate('/goal-setting');
    }
  }, [goalAmount, loading, navigate]);

  return children;
};

export default AuthenticatedComponent;

๐ŸŽฏ ๊ฒฐ๋ก : ๊ณตํ†ต ๋ ˆ์ด์•„์›ƒ์„ ํ™œ์šฉํ•œ ์ธ์ฆ์ด ๊ฐ€์žฅ ํšจ์œจ์ !

โœ… ํ•œ ๋ฒˆ๋งŒ ๊ฐ์‹ธ๋„ ๋‚ด๋ถ€ ํŽ˜์ด์ง€ ์ „์ฒด ๋ณดํ˜ธ ๊ฐ€๋Šฅ!
โœ… ๋ถˆํ•„์š”ํ•œ ์ธ์ฆ ์—ฐ์‚ฐ์„ ์ค„์—ฌ ์„ฑ๋Šฅ ๊ฐœ์„ !
โœ… ์œ ์ง€๋ณด์ˆ˜ ํŽธ๋ฆฌ & ์ฝ”๋“œ ์ค‘๋ณต ์ตœ์†Œํ™”!

React ํ”„๋กœ์ ํŠธ์—์„œ ๊ณตํ†ต ๋ ˆ์ด์•„์›ƒ(Layout)์„ ํ™œ์šฉํ•œ ์ธ์ฆ ๋ฐฉ์‹์ด ๊ฐ€์žฅ ์ตœ์ ํ™”๋œ ๊ตฌ์กฐ์ด๋ฏ€๋กœ, ์•ž์œผ๋กœ ์ธ์ฆ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ด ๋ฐฉ์‹์„ ํ•ด์„œ. ๋‚˜์ ๊ฑด ์—†๋‹ค.

 

'FrontEnd Develop > Project : Wallet Guardians' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

๋ณธ๊ฒฉ ์—ฐ๋™ #6. ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ ์‹œ UI ๊นœ๋นก์ž„ ๋ฐฉ์ง€ (await & setTimeout ํ™œ์šฉ)์œผ๋กœ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ฆ๋Œ€  (0) 2025.02.11
๋ณธ๊ฒฉ ์—ฐ๋™ #5. ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์˜ ์ดํ•ด๋กœ ๋กœ๊ทธ์ธ ํ›„ ๋ฆฌ๋‹ค์ด๋ ‰์…˜ ์ฒ˜๋ฆฌ  (0) 2025.02.10
๋ณธ๊ฒฉ ์—ฐ๋™ #4 ๋กœ๊ทธ์ธ ํ›„ ๊ธฐ์กด ์ปจํ…์ŠคํŠธ(๋ฐ์ดํ„ฐ)๊ฐ€ ์žˆ์œผ๋ฉด ๋ฉ”์ธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๋Š” ๋ฐฉ๋ฒ• (React + Context API + Axios)  (0) 2025.02.10
๋ณธ๊ฒฉ ์—ฐ๋™ #2. ๋ณด์•ˆ ๊ฐ•ํ™”๋œ ์ธ์ฆ ๋ฐ ์ ‘๊ทผ ์ œ์–ด ์„ค๊ณ„ ๊ณผ์ •  (0) 2025.02.08
๋ณธ๊ฒฉ ์—ฐ๋™ #1. ํ† ํฐ ํ—ท๊ฐˆ๋ฆฌ์ง€ ์•Š๊ฒŒ ์„ค์ •ํ•˜๊ธฐ: ๋กœ๊ทธ์ธ & API ์ธ์ฆ ๋ฌธ์ œ ํ•ด๊ฒฐ ๊ณผ์ • -> axios Instance์™€ ์š”์ฒญ ์ธํ„ฐ์…‰ํ„ฐ ๊ทธ๋ฆฌ๊ณ  ์‘๋‹ต ์ธํ„ฐ์…‰ํ„ฐ  (1) 2025.02.07