๐ŸŽ„ ์„ฑ์žฅ์ผ์ง€ 4.0

์ฑ… ํ–‰๋ณตํ•œ ์ด๊ธฐ์ฃผ์˜์ž(์›จ์ธ ๋‹ค์ด์–ด)์˜ ๋‚ด์šฉ์— ์ž๊ทน๋ฐ›์•„ ์‹œ์ž‘ํ•˜๋Š” ์†Œ๋ฐ•ํ•œ ์„ฑ์žฅ๊ธฐ๋ก

์‚ด์•„์žˆ๋Š” ๊ฝƒ๊ณผ ์ฃฝ์€ ๊ฝƒ์€ ์–ด๋–ป๊ฒŒ ๊ตฌ๋ณ„ํ•˜๋Š”๊ฐ€?
์„ฑ์žฅํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ์‚ด์•„ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.
์ƒ๋ช…์˜ ์œ ์ผํ•œ ์ฆ๊ฑฐ๋Š” ์„ฑ์žฅ์ด๋‹ค!

๐ŸŒณ (1.0)ํ‚ค์›Œ๋“œ
์ตœ๋Œ€ํ•œ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ •๋ฆฌ, ์ถ”ํ›„์— ๋ณด๋ฉด์„œ ์Šค์Šค๋กœ ์„ค๋ช…
๐Ÿ‰ (2.0)๊ฒฝํ—˜ ์œ„์ฃผ๋กœ
๋‹จ์ˆœ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ๋ณด๋‹ค ๋ฌด์—‡์„ ๋ฐฐ์› ๊ณ  ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ–ˆ๋Š”์ง€ ์งง๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ ์ž‘์„ฑ
โ„๏ธ (3.0)์ •ํ•ด์ง„ ํ…œํ”Œ๋ฆฟ์— ๋งž์ถฐ์„œ
ํ‚ค์›Œ๋“œ, ๊ฒฝํ—˜ ๋ชจ๋‘ ์ข‹๋‹ค. ๋‹ค๋งŒ ๋งค์ผ ์ž‘์„ฑํ•˜๊ธฐ๋กœ ๋งˆ์Œ ๋จน์€๋งŒํผ ํ•ต์‹ฌ๋งŒ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ…œํ”Œ๋ฆฟ์„ ์ž‘์„ฑ
(3.1)230102๋ถ€ํ„ฐ ์‹œ์ž‘๋˜๋Š” ํ•™์Šต์— ๊ด€ํ•œ ๋‚ด์šฉ ์ถ”๊ฐ€
(3.2)230313๋ถ€ํ„ฐ ์ข€๋” ๊ฒฝํ—˜, ๊ฐ์ • ์œ„์ฃผ์˜ ๋‚ด์šฉ๋„ ๋‹ด๊ธฐ!
๐ŸŒพ (4.0)ํ•™์Šต ํ‚ค์›Œ๋“œ์—์„œ ์ตœ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ์ •๋ณด ์ œ๊ณต, ๊ณ ๋ฏผ์—์„œ ๋‚ด ๊ฒฝํ—˜์„ ์ž์„ธํžˆ ์ ์ž!

๐Ÿ”‘ ์˜ค๋Š˜์˜ ํ•™์Šต ํ‚ค์›Œ๋“œ

๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์™€ ํ•จ๊ป˜ ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ์˜ ๊ตฌ์กฐ(?) ํ˜น์€ ์ปจ๋ฒค์…˜(?)์„ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ex) React.FC์„ ์ด์šฉํ•œ ๋ฐฉ๋ฒ•, props ๊ฐ์ฒด์˜ ํƒ€์ž…์„ ์ง€์ •ํ•ด์ฃผ๋Š” ๋ฐฉ๋ฒ• ๋“ฑ๋“ฑ ๊ทธ ์ค‘์—์„œ ๋‚˜๋Š” ๊ตณ์ด ๊ตฌ์กฐ๋ถ„ํ•ดํ• ๋‹น์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  props๋กœ ๋ฐ›์œผ๋ฉด์„œ props์˜ ๊ฐ์ฒด ํƒ€์ž…์„ ์ง€์ •ํ•ด์ฃผ๋Š” ๋ฐฉ๋ฒ•์ด ์ œ์ผ ๊น”๋”ํ•˜๊ณ  ๋ณด๊ธฐ ์ข‹์€ ๊ฒƒ ๊ฐ™๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

interface TempProps {
  name: string;
  age: number;
  address: string;
}

const Temp = (props: TempProps) => {
  const { name, age, address } = props;
  return (
    <>
      <p>{name}</p>
      <p>{age}</p>
      <p>{address}</p>
    </>
  );
};

์ด๋ ‡๊ฒŒ ํ‘œํ˜„ํ•˜๋ฉด ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋”ฑ ๋ดค์„ ๋•Œ, ์ข€๋” ์ง๊ด€์ ์œผ๋กœ ์–ด๋–ค props๋ฅผ ๋ฐ›์•„์„œ ์–ด๋–ค ์—ญํ• ์„ ํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ข‹์€ ๊ฒƒ ๊ฐ™๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์œ„์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด props์—์„œ ๋‚ด๊ฐ€ ํ•„์š”ํ•œ ๊ฐ’๋“ค๋งŒ ๊ฐ€์ ธ์™€์„œ return ํ•˜๋Š” jsx ๋ถ€๋ถ„์— ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํŽธ๋ฆฌํ•˜๋‹ค.

๋ฆฌ์•กํŠธ ๋ผ์šฐํ„ฐ

๋ฆฌ์•กํŠธ ๋ผ์šฐํ„ฐ๋„ ๊ฒฐ๊ตญ์—” Context API๋กœ ๊ตฌ์„ฑ๋˜์–ด์žˆ๋‹ค. ์ฆ‰, Provider์™€ Consumer๋กœ ๊ตฌ์„ฑ๋˜์–ด์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๊ฐ€ ๋ผ์šฐํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ๋ผ์šฐํ„ฐ๋ฅผ ๊ฐ์‹ธ๋Š” ๋ถ€๋ถ„์— Provider๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ๋ผ์šฐํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” Consumer๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ผ์šฐํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. (Context๋กœ ๊ฐ์‹ธ๊ณ  ์žˆ๋Š” ๋ถ€๋ถ„์„ Provider๋ผ๊ณ  ํ•˜๊ณ , Context๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ถ€๋ถ„์„ Consumer๋ผ๊ณ  ํ•œ๋‹ค.)

์˜ค๋Š˜ ๊ตฌํ˜„ํ•œ ๋ผ์šฐํ„ฐ ๊ตฌ์กฐ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.

const router = createBrowserRouter([
  {
    path: '/',
    element: <RootPage />,
    errorElement: <ErrorPage />,
    children: [
      {
        path: '/',
        element: <MainPage />,
        errorElement: <ErrorPage />,
      },
      {
        path: '/issues/:issueId',
        element: <IssueDetailPage />,
        errorElement: <ErrorPage />,
      },
    ],
  },
]);

function App() {
  return (
      <div className="App">
        <RouterProvider router={router} />
      </div>
  );
}

export default App;

๋จผ์ € App ์ปดํฌ๋„ŒํŠธ์— ๋“ค์–ด๊ฐˆ Root ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๊ณ , ๊ทธ ์•ˆ์— ๋ผ์šฐํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๋งŒ๋“ค์–ด์ค€๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ผ์šฐํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๋ผ์šฐํ„ฐ์— ๋“ฑ๋กํ•ด์ค€๋‹ค. ๊ทธ๋ฆฌ๊ณ  App ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ๋ผ์šฐํ„ฐ๋ฅผ ๊ฐ์‹ธ์ฃผ๋Š” Provider๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ผ์šฐํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ผ์šฐํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” Consumer๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ผ์šฐํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค. Counsumer๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์€ ๋‹ค์–‘ํ•˜๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด, useNavigate, useLocation, useMatch ๋“ฑ๋“ฑ์ด ์žˆ๋‹ค. ์ด๋Ÿฐ ๊ธฐ๋Šฅ๋“ค์„ ์‚ฌ์šฉํ•ด์„œ ๋ผ์šฐํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“ ์š”์•ฝ ๋ฐ ํ•˜๋ฃจ ๊ฐ„๋‹จ ํšŒ๊ณ 

์˜ค๋Š˜ ์ •๋ง ์ง‘์ค‘ํ•ด์„œ ๊ฐœ๋ฐœํ–ˆ๋‹ค. ๋‚ด๊ฐ€ ๋งก์€ ์ƒ์„ธ ํŽ˜์ด์ง€๋ฅผ ๋ชฉํ‘œ๋กœ ํ•˜๊ณ  ๋” ๋‚˜์•„๊ฐ€ ๋ผ์šฐํ„ฐ๊นŒ์ง€ ๊ตฌํ˜„ ์™„๋ฃŒํ•˜์—ฌ ์ •๋ง ๋ฟŒ๋“ฏํ•˜๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฌด์—‡๋ณด๋‹ค ์–ด๋–ค ๋ธ”๋กœ๊ทธ๋ฅผ ์ฐธ๊ณ ํ•˜๋Š” ๋ฐฉ์‹์ด ์•„๋‹Œ ๊ณต์‹๋ฌธ์„œ๋ฅผ ๋ณด๋ฉด์„œ ๊ตฌํ˜„ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋” ๊ธฐ๋ถ„์ด ์ข‹์•˜๋‹ค. ๋ฌด์—‡๋ณด๋‹ค ๊ณต์‹๋ฌธ์„œ๋ฅผ ๋ณด๋ฉด์„œ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ์— ์žฌ๋ฏธ๊ฐ€ ๋ถ™์€ ๊ฒƒ ๊ฐ™์•„์„œ ๋”๋”๋” ์ข‹๋‹ค!! ์•ž์œผ๋กœ๋„ ๊ณต์‹๋ฌธ์„œ๋ฅผ ํ† ๋Œ€๋กœ ํ•™์Šตํ•˜๊ณ  ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜์ž.

์˜ค๋Š˜์˜ ์ž˜ํ•œ ์ 

  • ์˜ค๋Š˜ ์—ด์‹ฌํžˆ ๋ชฉํ‘œํ•œ๋งŒํผ ๊ตฌํ˜„ํ•ด๋‚ธ ์ 

์˜ค๋Š˜์˜ ์•„์‰ฌ์šด ์ 

  • ์ง‘ ์™€์„œ ๋„ˆ๋ฌด ๊ตฌํ˜„์—๋งŒ ๋ชฐ์ž…ํ–ˆ๋‚˜..? ๊ฐœ์ธ ๊ณต๋ถ€๋„ ์กฐ๊ธˆ์”ฉ ํ•˜๋ฉด์„œ ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ํ•˜์ž!

์ฐธ๊ณ