๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Lect & Tip/React by GPT

React Router ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…๊ณผ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•œ lazy์™€ Suspense ๋™์  ์ปดํฌ๋„ŒํŠธ ๋กœ๋”ฉ

by st๊ณต๊ฐ„ 2025. 5. 25.
๋ฐ˜์‘ํ˜•

React Router ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…๊ณผ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•œ lazy์™€ Suspense ๋™์  ์ปดํฌ๋„ŒํŠธ ๋กœ๋”ฉ

ํ˜„๋Œ€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ ์  ๋” ๋ณต์žกํ•ด์ง€๊ณ  ๊ธฐ๋Šฅ์ด ํ’๋ถ€ํ•ด์ง์— ๋”ฐ๋ผ, ์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„์™€ ์ „์ฒด ์„ฑ๋Šฅ์ด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ, ๋ฆฌ์•กํŠธ(React) ๊ธฐ๋ฐ˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ๋ถˆํ•„์š”ํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค์˜ ํฌ๊ธฐ๊ฐ€ ์ปค์ง€๋ฉด์„œ ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง€๊ณ , ์‚ฌ์šฉ์ž ์ดํƒˆ๋ฅ ์ด ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋ฆฌ์•กํŠธ์—์„œ๋Š” ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…(Code Splitting)๊ณผ ๋™์  ์ปดํฌ๋„ŒํŠธ ๋กœ๋”ฉ ๊ธฐ๋ฒ•์„ ๋„์ž…ํ•˜์—ฌ ์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„๋ฅผ ๊ฐœ์„ ํ•˜๊ณ , ์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์ œ๋กœ ํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค๋งŒ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋„๋ก ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ๋ฆฌ์•กํŠธ์˜ ๋‚ด์žฅ ๊ธฐ๋Šฅ์ธ lazy์™€ Suspense๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•, ๋™์  ์ปดํฌ๋„ŒํŠธ ๋กœ๋”ฉ ๊ธฐ๋ฒ•์„ ํ†ตํ•œ ์„ฑ๋Šฅ ์ตœ์ ํ™” ์ „๋žต, ๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ ์‹ค์ œ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•˜๋Š” ์‚ฌ๋ก€์— ๋Œ€ํ•ด ๊ตฌ์ฒด์ ์œผ๋กœ ์†Œ๊ฐœํ•ด๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์˜ ๊ฐœ๋…๊ณผ ํ•„์š”์„ฑ

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

ํŠนํžˆ, SPA(Single Page Application) ๊ตฌ์กฐ์˜ ๋ฆฌ์•กํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ํŽ˜์ด์ง€ ์ด๋™ ์—†์ด ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ํ•˜๋‚˜์˜ ๋ฒˆ๋“ค๋กœ ์ œ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํฌ๊ธฐ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ์ดˆ๊ธฐ ๋กœ๋”ฉ ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์žฅ์ ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

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

๋ฆฌ์•กํŠธ์˜ lazy์™€ Suspense๋ฅผ ํ™œ์šฉํ•œ ๋™์  ์ปดํฌ๋„ŒํŠธ ๋กœ๋”ฉ

๋ฆฌ์•กํŠธ๋Š” 16.6 ๋ฒ„์ „๋ถ€ํ„ฐ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์„ ์œ„ํ•ด lazy์™€ Suspense API๋ฅผ ๋„์ž…ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด ๋‘ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜๋ฉด, ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋™์ ์œผ๋กœ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋กœ๋”ฉ ์ค‘์— ๋Œ€์ฒด UI๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

1. React.lazy๋ฅผ ์ด์šฉํ•œ ๋™์  ์ž„ํฌํŠธ

React.lazy ํ•จ์ˆ˜๋Š” ๋™์  import()๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ฒˆ๋“ค์„ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ฒญํฌ(chunk)๋กœ ๋ถ„ํ• ํ•˜๊ณ , ์‚ฌ์šฉ์ž๊ฐ€ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•„์š”๋กœ ํ•  ๋•Œ๋งŒ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๋ž˜ ์˜ˆ์ œ๋Š” ๋™์ ์œผ๋กœ ๋กœ๋“œ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ตฌํ˜„ํ•œ ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค.

import React, { lazy, Suspense } from 'react';

// ๋™์  ์ž„ํฌํŠธ๋ฅผ ํ†ตํ•ด ์ปดํฌ๋„ŒํŠธ๋ฅผ lazy๋กœ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
const LazyComponent = lazy(() => import('./LazyComponent'));

const App = () => {
  return (
    <div style={{ padding: '20px' }}>
      <h2>๋™์  ์ปดํฌ๋„ŒํŠธ ๋กœ๋”ฉ ์˜ˆ์ œ</h2>
      {/* Suspense๋ฅผ ํ†ตํ•ด ๋กœ๋”ฉ ์ƒํƒœ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. */}
      <Suspense fallback={<div>๋กœ๋”ฉ ์ค‘์ž…๋‹ˆ๋‹ค...</div>}>
        <LazyComponent />
      </Suspense>
    </div>
  );
};

export default App;

์œ„ ์˜ˆ์ œ์—์„œ LazyComponent๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์ œ๋กœ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•„์š”๋กœ ํ•  ๋•Œ ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค. Suspense ์ปดํฌ๋„ŒํŠธ๋Š” ๋กœ๋“œ ์ค‘์ธ ์ƒํƒœ๋ฅผ ๋Œ€์ฒด UI(์˜ˆ: ๋กœ๋”ฉ ๋ฉ”์‹œ์ง€)๋กœ ๋ณด์—ฌ์คŒ์œผ๋กœ์จ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ช…ํ™•ํ•œ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

2. Suspense์˜ ์—ญํ• ๊ณผ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•

Suspense๋Š” ๋™์  ๋กœ๋”ฉ ์ค‘์— ๋Œ€์ฒด ์ฝ˜ํ…์ธ ๋ฅผ ํ‘œ์‹œํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋ฉฐ, ๋กœ๋”ฉ ์ƒํƒœ๋ฅผ ๋ณด๋‹ค ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. fallback ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋กœ๋”ฉ ์ค‘์— ๋ณด์—ฌ์ค„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹จ์ˆœํ•œ ๋กœ๋”ฉ ๋ฉ”์‹œ์ง€ ๋Œ€์‹  ์Šคํ”ผ๋„ˆ๋‚˜ ์• ๋‹ˆ๋ฉ”์ด์…˜ ํšจ๊ณผ๋ฅผ ์ ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

import React, { lazy, Suspense } from 'react';
import Spinner from './Spinner'; // ์Šคํ”ผ๋„ˆ ์ปดํฌ๋„ŒํŠธ

const LazyComponent = lazy(() => import('./LazyComponent'));

const App = () => {
  return (
    <div style={{ padding: '20px' }}>
      <h2>๋™์  ์ปดํฌ๋„ŒํŠธ ๋กœ๋”ฉ - ์ปค์Šคํ„ฐ๋งˆ์ด์ง•๋œ ๋กœ๋”ฉ UI</h2>
      <Suspense fallback={<Spinner />}>
        <LazyComponent />
      </Suspense>
    </div>
  );
};

export default App;

์ด์™€ ๊ฐ™์ด, Suspense์™€ ํ•จ๊ป˜ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•๋œ ๋กœ๋”ฉ UI๋ฅผ ์ œ๊ณตํ•˜๋ฉด ์‚ฌ์šฉ์ž๋Š” ๋กœ๋“œ ์ค‘์—๋„ ์‹œ๊ฐ์  ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›๊ฒŒ ๋˜์–ด ์ „๋ฐ˜์ ์ธ ์ธํ„ฐ๋ž™์…˜ ํ’ˆ์งˆ์ด ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.

๊ณ ๊ธ‰ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ… ์ „๋žต

๋ฆฌ์•กํŠธ์˜ ๊ธฐ๋ณธ lazy์™€ Suspense ์™ธ์—๋„, ๋ณด๋‹ค ๋ณต์žกํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ์—ฌ๋Ÿฌ ํŽ˜์ด์ง€๋‚˜ ๊ธฐ๋Šฅ ๋‹จ์œ„๋กœ ์ฝ”๋“œ๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ์ „๋žต์„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€ํ‘œ์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

1. ๋ผ์šฐํŒ…๊ณผ ๊ฒฐํ•ฉํ•œ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…

๋ฆฌ์•กํŠธ ๋ผ์šฐํ„ฐ(React Router)์™€ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์„ ๊ฒฐํ•ฉํ•˜๋ฉด, ๊ฐ ๋ผ์šฐํŠธ๋ณ„๋กœ ํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ๋งŒ ๋™์ ์œผ๋กœ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด, ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š๋Š” ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ๋ฆฌ์†Œ์Šค ๋กœ๋“œ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

const HomePage = lazy(() => import('./pages/HomePage'));
const AboutPage = lazy(() => import('./pages/AboutPage'));
const ContactPage = lazy(() => import('./pages/ContactPage'));

const App = () => {
  return (
    <Router>
      <Suspense fallback={<div>ํŽ˜์ด์ง€๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘์ž…๋‹ˆ๋‹ค...</div>}>
        <Switch>
          <Route exact path="/" component={HomePage} />
          <Route path="/about" component={AboutPage} />
          <Route path="/contact" component={ContactPage} />
        </Switch>
      </Suspense>
    </Router>
  );
};

export default App;

์ด๋Ÿฌํ•œ ๋ฐฉ์‹์€ ์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์ œ๋กœ ๋ฐฉ๋ฌธํ•˜๋Š” ํŽ˜์ด์ง€์— ๋Œ€ํ•ด์„œ๋งŒ ๋ฆฌ์†Œ์Šค๋ฅผ ๋กœ๋“œํ•˜๋ฏ€๋กœ, ์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„๋ฅผ ๋Œ€ํญ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. ๋ฒˆ๋“ค ํฌ๊ธฐ ๋ชจ๋‹ˆํ„ฐ๋ง๊ณผ ์ตœ์ ํ™”

์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์„ ๊ตฌํ˜„ํ•œ ํ›„์—๋„ ์ฃผ๊ธฐ์ ์œผ๋กœ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜์—ฌ, ๋ถˆํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ์ค‘๋ณต ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š๋„๋ก ์ตœ์ ํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. Webpack Bundle Analyzer, Source Map Explorer ๋“ฑ ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ฐ ์ฒญํฌ์˜ ํฌ๊ธฐ๋ฅผ ๋ถ„์„ํ•˜๊ณ , ๊ฐœ์„  ๊ฐ€๋Šฅํ•œ ๋ถ€๋ถ„์„ ์ฐพ์•„๋‚ด๋Š” ๊ฒƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

3. ์บ์‹ฑ๊ณผ ํ”„๋ฆฌ๋กœ๋”ฉ ์ „๋žต

๋™์  ์ปดํฌ๋„ŒํŠธ ๋กœ๋”ฉ ์‹œ, ์บ์‹ฑ ์ „๋žต๊ณผ ํ”„๋ฆฌ๋กœ๋”ฉ(Preloading)์„ ์ ์šฉํ•˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ํŽ˜์ด์ง€ ์ด๋™ ์‹œ ๋”์šฑ ๋น ๋ฅธ ์‘๋‹ต ์†๋„๋ฅผ ๊ฒฝํ—˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ํŽ˜์ด์ง€๋ฅผ ์ž์ฃผ ๋ฐฉ๋ฌธํ•œ๋‹ค๋ฉด, ํ•ด๋‹น ํŽ˜์ด์ง€์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฏธ๋ฆฌ ๋กœ๋“œํ•ด๋‘๊ฑฐ๋‚˜ ์บ์‹œํ•˜์—ฌ ๋‹ค์Œ ์ ‘๊ทผ ์‹œ ๋น ๋ฅด๊ฒŒ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„ฑ๋Šฅ ์ตœ์ ํ™”์™€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ํ–ฅ์ƒ

์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…๊ณผ ๋™์  ์ปดํฌ๋„ŒํŠธ ๋กœ๋”ฉ์€ ์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„๋ฅผ ๊ฐœ์„ ํ•˜์—ฌ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋ฐ ํ•ต์‹ฌ์ ์ธ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ฃผ์š” ์ด์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋น ๋ฅธ ์ดˆ๊ธฐ ๋ Œ๋”๋ง: ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ์ฝ”๋“œ๋งŒ ๋กœ๋“œํ•จ์œผ๋กœ์จ, ํŽ˜์ด์ง€ ์ตœ์ดˆ ๋ Œ๋”๋ง ์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํšจ์œจ์ ์ธ ๋„คํŠธ์›Œํฌ ์‚ฌ์šฉ: ์‚ฌ์šฉ์ž ์ธํ„ฐ๋ž™์…˜์— ๋”ฐ๋ผ ์ถ”๊ฐ€ ๋ฆฌ์†Œ์Šค๋ฅผ ๋™์ ์œผ๋กœ ๋กœ๋“œํ•˜์—ฌ, ๋ถˆํ•„์š”ํ•œ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ์ค„์ž…๋‹ˆ๋‹ค.
  • ๋ชจ๋“ˆํ™”์™€ ์œ ์ง€๋ณด์ˆ˜์„ฑ ๊ฐ•ํ™”: ๊ธฐ๋Šฅ๋ณ„๋กœ ์ฝ”๋“œ๋ฅผ ๋ถ„๋ฆฌํ•จ์œผ๋กœ์จ, ์ฝ”๋“œ ๊ตฌ์กฐ๊ฐ€ ๋ช…ํ™•ํ•ด์ง€๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์šฉ์ดํ•ด์ง‘๋‹ˆ๋‹ค.
  • ํ–ฅ์ƒ๋œ ์‚ฌ์šฉ์ž ์ธํ„ฐ๋ž™์…˜: Suspense์™€ ๊ฐ™์€ ๋Œ€์ฒด UI๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋กœ๋”ฉ ์ค‘์—๋„ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ช…ํ™•ํ•œ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณต, ์ „๋ฐ˜์ ์ธ UX๋ฅผ ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค.

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

์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ์˜ ์ ์šฉ ์‚ฌ๋ก€

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

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

๊ฒฐ๋ก 

๋ฆฌ์•กํŠธ์˜ lazy์™€ Suspense๋ฅผ ํ™œ์šฉํ•œ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…๊ณผ ๋™์  ์ปดํฌ๋„ŒํŠธ ๋กœ๋”ฉ์€ ํ˜„๋Œ€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™”์—์„œ ๋งค์šฐ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„๋ฅผ ๊ฐœ์„ ํ•˜๊ณ , ์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์ œ๋กœ ํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค๋งŒ ๋กœ๋“œํ•˜์—ฌ ๋„คํŠธ์›Œํฌ ์‚ฌ์šฉ์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ๋ผ์šฐํŒ…๊ณผ ๊ฒฐํ•ฉํ•œ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…, ๋ฒˆ๋“ค ํฌ๊ธฐ ๋ชจ๋‹ˆํ„ฐ๋ง, ์บ์‹ฑ ๋ฐ ํ”„๋ฆฌ๋กœ๋”ฉ ์ „๋žต ๋“ฑ ๋‹ค์–‘ํ•œ ๊ธฐ๋ฒ•์„ ํ•จ๊ป˜ ์ ์šฉํ•˜๋ฉด, ์‚ฌ์šฉ์ž ๊ฒฝํ—˜๊ณผ ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํšจ์œจ์„ฑ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ด์™€ ๊ฐ™์€ ์ ‘๊ทผ ๋ฐฉ์‹์€ ์‚ฌ์šฉ์ž์˜ ๋‹ค์–‘ํ•œ ํ™˜๊ฒฝ์— ๋งž์ถ˜ ์ตœ์ ์˜ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๊ณ , ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๊ณต์ ์ธ ์šด์˜์— ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€