[React] SPA๋ž€?

jinyยท2025๋…„ 1์›” 30์ผ

๊ธฐ์ˆ  ๋ฉด์ ‘

๋ชฉ๋ก ๋ณด๊ธฐ
50/77

๐Ÿ—ฃ๏ธ SPA์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

  • ์˜๋„: ์ตœ๊ทผ ํ”„๋ก ํŠธ์—”๋“œ ํŒจ๋Ÿฌ๋‹ค์ž„์ธ Single Page Application์— ๋Œ€ํ•ด ์•Œ๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์งˆ๋ฌธ

  • ํŒ: ์žฅ๋‹จ์ ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์ œ์‹œํ•˜๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค.

  • ๋‚˜์˜ ๋‹ต์•ˆ

    SPA๋Š” Single Page Application, ์ฆ‰ 'ํ•˜๋‚˜์˜ ํŽ˜์ด์ง€๋กœ ๊ตฌ์„ฑ๋œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜'์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
    ์ „ํ†ต์ ์ธ ์›น์‚ฌ์ดํŠธ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ•  ๋•Œ๋งˆ๋‹ค ์„œ๋ฒ„์—์„œ ์ƒˆ๋กœ์šด HTML ๋ฌธ์„œ๋ฅผ ๋ฐ›์•„์„œ ์ „์ฒด๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋งํ–ˆ์ง€๋งŒ,
    SPA๋Š” ์ตœ์ดˆ ํ•œ ๋ฒˆ๋งŒ ์ „์ฒด ํŽ˜์ด์ง€๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ณ , ์ดํ›„์—๋Š” ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๊ฐ€์ ธ์™€์„œ ํ™”๋ฉด ์ผ๋ถ€๋งŒ ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค.

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

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

  • ์ฃผ์–ด์ง„ ๋‹ต์•ˆ (๋ชจ๋ฒ” ๋‹ต์•ˆ)

    SPA๋Š” Single Page Application์˜ ์•ฝ์ž๋กœ์„œ ๋ฆฌ์•กํŠธ๋‚˜ ๋ทฐ์˜ ๊ธฐ๋ฐ˜์ด ๋˜๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.
    SPA๋Š” ์—ฌ๋Ÿฌ ์žฅ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

    ๋‹ค๋งŒ ๋Œ€ํ‘œ์ ์ธ ๋‹จ์ ์œผ๋กœ๋Š” SEO์— ์ทจ์•ฝํ•˜๋‹ค๋Š” ์ ๊ณผ ์ดˆ๊ธฐ ๋กœ๋”ฉ์ด ๋А๋ฆฌ๋‹ค๋Š” ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
    ๊ทธ๋ž˜์„œ ์š”์ฆ˜์€ SPA ๊ธฐ๋ฐ˜ ์•ฑ์—์„œ SSR๊ณผ CSR์„ ๋ชจ๋‘ ํ˜ผํ•ฉํ•˜์—ฌ ์žฅ์ ๋งŒ ๊ฐ€์ ธ์™€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” Next.js ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์ธ๊ธฐ ์žˆ๋Š” ํŽธ์ž…๋‹ˆ๋‹ค.


๐Ÿ“ ๊ฐœ๋… ์ •๋ฆฌ

๐ŸŒŸ SPA๋ž€?

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

๐ŸŒŸ ์ „ํ†ต์ ์ธ MPA์™€์˜ ์ฐจ์ด

  • ์ „ํ†ต์ ์ธ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(MPA, Multi Page Application)์—์„œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด HTML ๋ฌธ์„œ๋ฅผ ์„œ๋ฒ„์—์„œ ๋ฐ›์•„์™€ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.
  • ๋ฐ˜๋ฉด, SPA๋Š” ์ฒซ ๋กœ๋“œ ์ดํ›„์—๋Š” ์ถ”๊ฐ€์ ์ธ HTML ๋ฌธ์„œ๋ฅผ ์š”์ฒญํ•˜์ง€ ์•Š๊ณ , JavaScript๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋™์ ์œผ๋กœ ํŽ˜์ด์ง€ ๋‚ด์šฉ์„ ๋ณ€๊ฒฝํ•œ๋‹ค.
๋น„๊ต ํ•ญ๋ชฉMPA(Multi Page Application)SPA(Single Page Application)
ํŽ˜์ด์ง€ ์ด๋™ ๋ฐฉ์‹์„œ๋ฒ„์—์„œ ์ƒˆ๋กœ์šด HTML์„ ๋ฐ›์•„์˜ด๊ธฐ์กด HTML์„ ์œ ์ง€ํ•˜๋ฉฐ JS๋กœ ๋ณ€๊ฒฝ
์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„๋น ๋ฆ„ (ํ•„์š”ํ•œ HTML๋งŒ ๋กœ๋“œ)์ƒ๋Œ€์ ์œผ๋กœ ๋А๋ฆผ (์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ•œ ๋ฒˆ์— ๋กœ๋“œ)
์„ฑ๋Šฅ ์ตœ์ ํ™”์„œ๋ฒ„์—์„œ ์ฒ˜๋ฆฌ, ํด๋ผ์ด์–ธํŠธ ๋ถ€๋‹ด ์ ์Œํด๋ผ์ด์–ธํŠธ์—์„œ ๋Œ€๋ถ€๋ถ„ ์ฒ˜๋ฆฌ
SEO ์ตœ์ ํ™”๊ฒ€์ƒ‰ ์—”์ง„ ํฌ๋กค๋ง ์šฉ์ด๊ธฐ๋ณธ์ ์œผ๋กœ ๋ถˆ๋ฆฌํ•˜์ง€๋งŒ SSR(์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง)์œผ๋กœ ํ•ด๊ฒฐ ๊ฐ€๋Šฅ
์‚ฌ์šฉ์ž ๊ฒฝํ—˜ํŽ˜์ด์ง€ ์ „ํ™˜ ์‹œ ๊นœ๋นก์ž„ ๋ฐœ์ƒ๋ถ€๋“œ๋Ÿฌ์šด ํ™”๋ฉด ์ „ํ™˜

๐ŸŒŸ React์—์„œ SPA ๊ตฌํ˜„ ์›๋ฆฌ

React๋Š” SPA๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐ ์ตœ์ ํ™”๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋ฉฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

  1. ์ตœ์ดˆ ํŽ˜์ด์ง€ ๋กœ๋“œ
    ์‚ฌ์šฉ์ž๊ฐ€ ์›น์‚ฌ์ดํŠธ์— ์ฒ˜์Œ ์ ‘๊ทผํ•˜๋ฉด index.html๊ณผ ํ•จ๊ป˜ JavaScript ๋ฒˆ๋“ค์ด ๋กœ๋“œ๋œ๋‹ค.
    index.html์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.
    <!DOCTYPE html>
    <html lang="ko">
    <head>
      <meta charset="UTF-8">
      <title>My React SPA</title>
    </head>
    <body>
      <div id="root"></div> <!-- React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์—ฌ๊ธฐ์— ๋ Œ๋”๋ง๋จ -->
      <script src="/static/js/main.js"></script>
    </body>
    </html>
    React๋Š” #root ๋‚ด๋ถ€์— ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ Œ๋”๋งํ•˜๋ฉฐ, ์ดํ›„์˜ ๋ชจ๋“  ํ™”๋ฉด ๋ณ€๊ฒฝ์€ JavaScript๋ฅผ ํ†ตํ•ด ๋™์ ์œผ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.
  1. ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋ผ์šฐํŒ…
    React์—์„œ๋Š” react-router-dom์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ผ์šฐํŒ…์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.
    ์ด ๋ฐฉ์‹์€ ์„œ๋ฒ„์—์„œ ์ƒˆ๋กœ์šด HTML์„ ์š”์ฒญํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, window.history.pushState()๋ฅผ ์ด์šฉํ•˜์—ฌ URL์„ ๋ณ€๊ฒฝํ•˜๊ณ  ํ•ด๋‹น URL์— ๋งž๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

    import { BrowserRouter as Router, Routes, Route, Link } from "react-router-dom";
    
    function Home() {
      return <h1>ํ™ˆ ํŽ˜์ด์ง€</h1>;
    }
    
    function About() {
      return <h1>์†Œ๊ฐœ ํŽ˜์ด์ง€</h1>;
    }
    
    function App() {
      return (
        <Router>
          <nav>
            <Link to="/">ํ™ˆ</Link>
            <Link to="/about">์†Œ๊ฐœ</Link>
          </nav>
          <Routes>
            <Route path="/" element={<Home />} />
            <Route path="/about" element={<About />} />
          </Routes>
        </Router>
      );
    }
    
    export default App;

    ์ด์ œ ์‚ฌ์šฉ์ž๊ฐ€ /about์œผ๋กœ ์ด๋™ํ•˜๋ฉด ์ „์ฒด ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ๊ณ ์นจํ•˜์ง€ ์•Š๊ณ  About ์ปดํฌ๋„ŒํŠธ๋งŒ ๋ณ€๊ฒฝ๋œ๋‹ค.

  1. ์ƒํƒœ ๊ด€๋ฆฌ์™€ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ
    React์˜ SPA๋Š” ํด๋ผ์ด์–ธํŠธ์—์„œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋ฉฐ, ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    1) useState, useContext๋ฅผ ์‚ฌ์šฉํ•œ ๊ธฐ๋ณธ์ ์ธ ์ƒํƒœ ๊ด€๋ฆฌ
    2) Redux, Zustand ๋“ฑ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉํ•œ ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ
    3) React Query, SWR(Stale-While-Revalidate)์„ ์‚ฌ์šฉํ•œ ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ

    • ์˜ˆ์ œ

      import { useState } from "react";
      
      function Counter() {
        const [count, setCount] = useState(0);
        
        return (
          <div>
            <p>์นด์šดํŠธ: {count}</p>
            <button onClick={() => setCount(count + 1)}>์ฆ๊ฐ€</button>
          </div>
        );
      }
      
      export default Counter;

      ์ด์ฒ˜๋Ÿผ React๋Š” ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋ฉด์„œ ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜์œผ๋กœ UI๋ฅผ ๋™์ ์œผ๋กœ ๊ฐฑ์‹ ํ•œ๋‹ค.


๐ŸŒŸ SPA์˜ ์žฅ์ ๊ณผ ๋‹จ์ 

  • ์žฅ์ 
    1. ๋น ๋ฅธ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜
      ํ•œ ๋ฒˆ ๋กœ๋“œ๋œ ํ›„์—๋Š” ํŽ˜์ด์ง€ ์ „ํ™˜ ์‹œ ์„œ๋ฒ„์™€์˜ ํ†ต์‹  ์—†์ด ๋ณ€๊ฒฝ๋˜๋ฏ€๋กœ, ๋ถ€๋“œ๋Ÿฝ๊ณ  ๋น ๋ฅธ UX๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.
    2. ์ ์€ ์„œ๋ฒ„ ๋ถ€๋‹ด
      MPA์—์„œ๋Š” ํŽ˜์ด์ง€ ์ด๋™ ์‹œ๋งˆ๋‹ค ์„œ๋ฒ„ ์š”์ฒญ์ด ๋ฐœ์ƒํ•˜์ง€๋งŒ, SPA๋Š” API ์š”์ฒญ๋งŒ ํ•˜๋ฏ€๋กœ ์„œ๋ฒ„ ๋ถ€๋‹ด์ด ์ ๋‹ค.
    3. ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ
      React์˜ ํŠน์ง•์„ ํ™œ์šฉํ•˜์—ฌ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ปดํฌ๋„ŒํŠธ๋กœ UI๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์–ด ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์šฉ์ดํ•˜๋‹ค.
    4. ๋ชจ๋ฐ”์ผ ์นœํ™”์ 
      ๋ชจ๋ฐ”์ผ ํ™˜๊ฒฝ์—์„œ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์–ด ์ตœ์ ํ™”๋œ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.
  • ๋‹จ์ 

    1. ์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„๊ฐ€ ๋А๋ฆผ

      • SPA๋Š” ์ฒ˜์Œ์— ๋ชจ๋“  JavaScript ๋ฒˆ๋“ค์„ ๋‹ค์šด๋กœ๋“œํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ์ฒซ ๋กœ๋”ฉ์ด MPA๋ณด๋‹ค ๋А๋ฆด ์ˆ˜ ์žˆ๋‹ค.

      • ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…๊ณผ ๊ฐ™์€ ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

        import { lazy, Suspense } from "react";
        
        const About = lazy(() => import("./About"));
        
        function App() {
          return (
            <Suspense fallback={<div>๋กœ๋”ฉ ์ค‘...</div>}>
              <About />
            </Suspense>
          );
        }
    2. SEO(๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™”) ๋ฌธ์ œ

      • ๊ธฐ๋ณธ์ ์œผ๋กœ SPA๋Š” ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ Œ๋”๋ง๋˜๋ฏ€๋กœ, ํฌ๋กค๋Ÿฌ๊ฐ€ HTML์„ ๋ถ„์„ํ•˜๊ธฐ ์–ด๋ ต๋‹ค.
      • ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด SSR(์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง) ๋˜๋Š” SSG(์ •์  ์‚ฌ์ดํŠธ ์ƒ์„ฑ) ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    3. ๋ธŒ๋ผ์šฐ์ € ํžˆ์Šคํ† ๋ฆฌ ๊ด€๋ฆฌ ์–ด๋ ค์›€

      • ์ƒˆ๋กœ๊ณ ์นจํ•˜๋ฉด ์ƒํƒœ๊ฐ€ ์‚ฌ๋ผ์ง€๊ฑฐ๋‚˜ ๋ฐฑ๋ฒ„ํŠผ ๊ธฐ๋Šฅ์ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค.
      • react-router-dom์˜ BrowserRouter ๋˜๋Š” HashRouter๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํ•ด๊ฒฐ ๊ฐ€๋Šฅํ•˜๋‹ค.
    4. ๋ณด์•ˆ ๋ฌธ์ œ

      • ๋ชจ๋“  JavaScript๊ฐ€ ํด๋ผ์ด์–ธํŠธ์— ๋…ธ์ถœ๋˜๋ฏ€๋กœ, ์ค‘์š” ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋Š” ์„œ๋ฒ„์—์„œ ํ•ด์•ผ ํ•œ๋‹ค.
      • ๋˜ํ•œ CORS ์ •์ฑ…๊ณผ CSRF, XSS ๊ฐ™์€ ๋ณด์•ˆ ์ทจ์•ฝ์ ์„ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

๐ŸŒŸ SPA ์ตœ์ ํ™” ๋ฐฉ๋ฒ•

  • ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…: React.lazy()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•„์š”ํ•œ ๋ชจ๋“ˆ๋งŒ ๋™์ ์œผ๋กœ ๋กœ๋“œ
  • SSR/SSG ์ ์šฉ: Next.js ๊ฐ™์€ ํ”„๋ ˆ์ž„์›Œํฌ ์‚ฌ์šฉ
  • ์ด๋ฏธ์ง€/๋ฆฌ์†Œ์Šค ์ตœ์ ํ™”: Lazy Loading ๋ฐ WebP ํ˜•์‹ ํ™œ์šฉ
  • CDN ์‚ฌ์šฉ: ์ •์  ํŒŒ์ผ์„ ๋น ๋ฅด๊ฒŒ ์ œ๊ณต

0๊ฐœ์˜ ๋Œ“๊ธ€