Jieunny์˜ ๋ธ”๋กœ๊ทธ

S4) Unit 4. [React] React์˜ ๊ธฐ๋Šฅ ๋ณธ๋ฌธ

CodeStates/learning contents

S4) Unit 4. [React] React์˜ ๊ธฐ๋Šฅ

Jieunny 2023. 3. 23. 16:00

๐Ÿ“ฃ  ์ฝ”๋“œ ๋ถ„ํ• 

๐Ÿญ. ์ฝ”๋“œ ๋ถ„ํ• ์ด๋ž€?

โœ”๏ธ ๋Ÿฐํƒ€์ž„ ์‹œ ์—ฌ๋Ÿฌ ๋ฒˆ๋“ค์„ ๋™์ ์œผ๋กœ ๋งŒ๋“ค๊ณ  ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฒƒ

โžฐ ๋‹น์žฅ ํ•„์š”ํ•œ ์ฝ”๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ๋”ฐ๋กœ ๋ถ„๋ฆฌ๋ฅผ ์‹œํ‚ค๊ณ , ๋‚˜์ค‘์— ํ•„์š”ํ•  ๋•Œ ๋ถˆ๋Ÿฌ์™€์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

โžฐ Webpack, Rollup๊ณผ ๊ฐ™์€ ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ์ง€์›ํ•˜๋Š” ๊ธฐ๋Šฅ

โžฐ ํŽ˜์ด์ง€์˜ ๋กœ๋”ฉ ์†๋„๋ฅผ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿฎ. ๋ฒˆ๋“ค ๋ถ„ํ•  ํ˜น์€ ์ค„์ด๋Š” ๋ฒ•

โœ”๏ธ ๋ฒˆ๋“ค๋ง ๋˜๋Š” ํŒŒ์ผ์— npm์„ ํ†ตํ•ด ๋‹ค์šด๋ฐ›๋Š” ๊ฒƒ์—๋Š” ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํฌํ•จ๋˜๋Š”๋ฐ ์ด๋ฅผ ๋”ฐ๋กœ ๋”ฐ๋กœ ๋ถˆ๋Ÿฌ์™€์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

โžฐ ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ : ๊ฐœ์ธ ๊ฐœ๋ฐœ์ž๋‚˜ ํ”„๋กœ์ ํŠธ ํŒ€, ํ˜น์€ ์—…์ฒด๋“ฑ์—์„œ ๊ฐœ๋ฐœํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, ์ฆ‰ ์ œ 3์ž ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ใ„ด ํ”Œ๋Ÿฌ๊ทธ์ธ์ด๋‚˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ ๋“ฑ์ด ์กด์žฌํ•˜๋ฉฐ, ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ž˜ ์‚ฌ์šฉํ•˜๋ฉด ํŽธํ•˜๊ณ  ํšจ์œจ์ ์ธ ๊ฐœ๋ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

/* ์ด๋ ‡๊ฒŒ lodash ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ „์ฒด๋ฅผ ๋ถˆ๋Ÿฌ์™€์„œ ๊ทธ ์•ˆ์— ๋“ค์€ ๋ฉ”์†Œ๋“œ๋ฅผ ๊บผ๋‚ด ์“ฐ๋Š” ๊ฒƒ์€ ๋น„ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.*/
import _ from 'lodash';

...

_.find([]);

/* ์ด๋ ‡๊ฒŒ lodash์˜ ๋ฉ”์†Œ๋“œ ์ค‘ ํ•˜๋‚˜๋ฅผ ๋ถˆ๋Ÿฌ์™€ ์“ฐ๋Š” ๊ฒƒ์ด ์•ฑ์˜ ์„ฑ๋Šฅ์— ๋” ์ข‹์Šต๋‹ˆ๋‹ค.*/
import find from 'lodash/find';

find([]);

โžฐ lodash๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ํ•˜๋‚˜์˜ ํด๋”์™€ ๊ฐ™๊ณ , ๊ทธ ํด๋” ์•ˆ์—๋Š” ๊ฐœ๋ฐœ ์‹œ ๋‹ค์–‘ํ•œ ์ƒํ™ฉ์— ์“ฐ๊ธฐ ์ข‹์€ ๋ฉ”์†Œ๋“œ๋“ค, ์ฆ‰ ํ•จ์ˆ˜ ์ฝ”๋“œ๋“ค์ด ๋“ค์–ด ์žˆ๋‹ค.

โžฐ ํ•„์š”ํ•œ ๊ฒƒ ํ•œ๋‘ ๊ฐœ๋งŒ ๊ฐ€์ ธ๋‹ค ์“ฐ๋Š” ์‹์œผ๋กœ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์ข‹๋‹ค.


๐Ÿ“ฃ  ๋ฆฌ์•กํŠธ์—์„œ์˜ ์ฝ”๋“œ ๋ถ„ํ• 

โœ”๏ธ ๋ฆฌ์•กํŠธ๋Š” SPA๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๊นŒ์ง€ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ๋•Œ๋ฌธ์—, ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” ๋‚˜์ค‘์— ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์œ„ํ•ด ์ด ๊ฐœ๋…์„ ๋„์ž…ํ–ˆ๋‹ค => ๋™์  ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

 

๐Ÿญ. ์ •์  ๋ถˆ๋Ÿฌ์˜ค๊ธฐ(static import)

/* ๊ธฐ์กด์—๋Š” ํŒŒ์ผ์˜ ์ตœ์ƒ์œ„์—์„œ import ์ง€์‹œ์ž๋ฅผ ์ด์šฉํ•ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐ ํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์™”์Šต๋‹ˆ๋‹ค. */
import moduleA from "library";

form.addEventListener("submit", e => {
  e.preventDefault();
  someFunction();
});

const someFunction = () => {
  /* ๊ทธ๋ฆฌ๊ณ  ์ฝ”๋“œ ์ค‘๊ฐ„์—์„œ ๋ถˆ๋Ÿฌ์˜จ ํŒŒ์ผ์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. */
}

โžฐ import ๊ตฌ๋ฌธ์€ ๋ฌธ์„œ์˜ ์ƒ์œ„์— ์œ„์น˜ํ•˜๊ณ , ๋ธ”๋ก๋ฌธ ์•ˆ์—์„œ๋Š” ์œ„์น˜ํ•  ์ˆ˜ ์—†๋‹ค.

 

๐Ÿฎ. ๋™์  ๋ถˆ๋Ÿฌ์˜ค๊ธฐ(dynamic import)

form.addEventListener("submit", e => {
  e.preventDefault();
	/* ๋™์  ๋ถˆ๋Ÿฌ์˜ค๊ธฐ๋Š” ์ด๋Ÿฐ ์‹์œผ๋กœ ์ฝ”๋“œ์˜ ์ค‘๊ฐ„์— ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. */
  import('library.moduleA')
    .then(module => module.default)
    .then(someFunction())
    .catch(handleError());
});

const someFunction = () => {
    /* moduleA๋ฅผ ์—ฌ๊ธฐ์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. */
}

โžฐ ์‚ฌ์šฉ์ž๊ฐ€ form ์–‘์‹์„ ์ œ์ถœํ•œ ๊ฒฝ์šฐ์—๋งŒ moduleA๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

โžฐ then ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ•„์š”ํ•œ ์ฝ”๋“œ๋งŒ ๊ฐ€์ ธ์˜ค๋ฉฐ, ๊ฐ€์ ธ์˜จ ์ฝ”๋“œ์— ๋Œ€ํ•œ ๋ชจ๋“  ํ˜ธ์ถœ์€ ํ•ด๋‹น ํ•จ์ˆ˜ ๋‚ด๋ถ€์— ์žˆ์–ด์•ผ ํ•œ๋‹ค.

โžฐ React.lazy ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ“ฃ  React.lazy()์™€ Suspense

๐Ÿญ. React.lazy()

โœ”๏ธ react.lazy() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋™์  ๋ถˆ๋Ÿฌ์˜ค๊ธฐ๋ฅผ ์‚ฌ์šฉํ•ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ๋‹ค.

โžฐ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋™์ ์œผ๋กœ import ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ดˆ๊ธฐ ๋ Œ๋”๋ง ์ง€์—ฐ์‹œ๊ฐ„์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

import Component from './Component';

/* React.lazy๋กœ dynamic import๋ฅผ ๊ฐ์Œ‰๋‹ˆ๋‹ค. */
const Component = React.lazy(() => import('./Component'));

โžฐ React.lazy๋กœ ๊ฐ์‹ผ ์ปดํฌ๋„ŒํŠธ๋Š” ๋‹จ๋…์œผ๋กœ ์“ฐ์ผ ์ˆ˜๋Š” ์—†๊ณ , React.suspense ์ปดํฌ๋„ŒํŠธ์˜ ํ•˜์œ„์—์„œ ๋ Œ๋”๋ง์„ ํ•ด์•ผ ํ•œ๋‹ค.

 

๐Ÿฎ. React.Suspense

โœ”๏ธ ์•„์ง ๋ Œ๋”๋ง์ด ์ค€๋น„๋˜์ง€ ์•Š์€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žˆ์„ ๋•Œ ๋กœ๋”ฉ ํ™”๋ฉด์„ ๋ณด์—ฌ์ฃผ๊ณ , ๋กœ๋”ฉ์ด ์™„๋ฃŒ๋˜๋ฉด ๋ Œ๋”๋ง์ด ์ค€๋น„๋œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๊ธฐ๋Šฅ

โžฐ lazy๋ฅผ ํ†ตํ•ด importํ•˜๋ฉด ํ•ด๋‹น path๋กœ ์ด๋™ํ• ๋•Œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ฒŒ ๋˜๋Š”๋ฐ ์ด ๊ณผ์ •์—์„œ ๋กœ๋”ฉํ•˜๋Š” ์‹œ๊ฐ„์ด ์ƒ๊ธด๋‹ค.

/* suspense ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” import ํ•ด์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค. */
import { Suspense } from 'react';

const OtherComponent = React.lazy(() => import('./OtherComponent'));
const AnotherComponent = React.lazy(() => import('./AnotherComponent'));

function MyComponent() {
  return (
    <div>
       {/* ์ด๋Ÿฐ ์‹์œผ๋กœ React.lazy๋กœ ๊ฐ์‹ผ ์ปดํฌ๋„ŒํŠธ๋ฅผ Suspense ์ปดํฌ๋„ŒํŠธ์˜ ํ•˜์œ„์— ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค. */}
        <Suspense fallback={<div>Loading...</div>}>
        {/* Suspense ์ปดํฌ๋„ŒํŠธ ํ•˜์œ„์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ lazy ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋ง์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. */}
            <OtherComponent />
            <AnotherComponent />
      </Suspense>
    </div>
  );
}

โžฐ Supense ์ปดํฌ๋„ŒํŠธ์˜ fallback prop์€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋กœ๋“œ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ๋กœ๋”ฉ ํ™”๋ฉด์œผ๋กœ ๋ณด์—ฌ์ค„ React ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๋ฐ›๋Š”๋‹ค.

โžฐ Suspense ์ปดํฌ๋„ŒํŠธ ํ•˜๋‚˜๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ lazy ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿฏ. React.lazy์™€ Suspense์˜ ์ ์šฉ

โœ”๏ธ ์ค‘๊ฐ„์— ์ ์šฉ์‹œํ‚ค๋Š” ๊ฒƒ๋ณด๋‹ค๋Š” ์›น ํŽ˜์ด์ง€๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ณ  ์ง„์ž…ํ•˜๋Š” ๋‹จ๊ณ„์ธ Route์— ์ด ๋‘ ๊ธฐ๋Šฅ์„ ์ ์šฉ์‹œํ‚ค๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

import { Suspense, lazy } from 'react';
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';

const Home = lazy(() => import('./routes/Home'));
const About = lazy(() => import('./routes/About'));

const App = () => (
  <Router>
    <Suspense fallback={<div>Loading...</div>}>
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/about" element={<About />} />
      </Routes>
    </Suspense>
  </Router>
);

โžฐ ๋ผ์šฐํ„ฐ์— Suspense๋ฅผ ์ ์šฉํ•˜๋Š” ๊ฒƒ 

    ใ„ด ๋ผ์šฐํ„ฐ๊ฐ€ ๋ถ„๊ธฐ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ์—์„œ ๊ฐ ์ปดํฌ๋„ŒํŠธ์— React.lazy๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ importํ•œ๋‹ค.

    ใ„ด Route ์ปดํฌ๋„ŒํŠธ๋“ค์„ Suspense๋กœ ๊ฐ์‹ผ ํ›„ ๋กœ๋”ฉ ํ™”๋ฉด์œผ๋กœ ์‚ฌ์šฉํ•  ์ปดํฌ๋„ŒํŠธ๋ฅผ fallback ์†์„ฑ์œผ๋กœ ์„ค์ •ํ•ด์ค€๋‹ค.

    ใ„ด ์ดˆ๊ธฐ ๋ Œ๋”๋ง ์‹œ๊ฐ„์ด ์ค„์–ด๋“œ๋Š” ์žฅ์ ์ด ์žˆ์œผ๋‚˜ ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ•˜๋Š” ๊ณผ์ •๋งˆ๋‹ค ๋กœ๋”ฉ ํ™”๋ฉด์ด ๋ณด์—ฌ์ง„๋‹ค.