λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

Frontend Dev/πŸ₯ μ½”λ“œμŠ€ν…Œμ΄μΈ  FE λΆ€νŠΈμΊ ν”„

Section2 Unit5 [React] React SPA

λ°˜μ‘ν˜•

이미지 좜처: https://www.techuz.com/blog/single-page-applications-vs-multiple-page-applications-do-you-really-need-an-spa/


Section2 Unit5 [React] React SPA

 

πŸ“Œ Chapter1. React SPA

• SPAλŠ” μ„œλ²„λ‘œλΆ€ν„° μ™„μ „νžˆ μƒˆλ‘œμš΄ νŽ˜μ΄μ§€λ₯Ό λΆˆλŸ¬μ˜€λŠ” 것이 μ•„λ‹ˆλΌ, 화면을 μ—…λ°μ΄νŠΈν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ λ°μ΄ν„°λ§Œ μ„œλ²„μ—μ„œ 전달받아 λΈŒλΌμš°μ €μ—μ„œ ν•΄λ‹Ήν•˜λŠ” λΆ€λΆ„λ§Œ μ—…λ°μ΄νŠΈν•˜λŠ” λ°©μ‹μœΌλ‘œ μž‘λ™ν•˜λŠ” μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄λ‚˜ μ›Ή μ‚¬μ΄νŠΈλ₯Ό λ§ν•œλ‹€.

 

• SPA의 μž₯점

  1. νŽ˜μ΄μ§€ 전체λ₯Ό λ Œλ”λ§ν•˜λŠ” 것이 μ•„λ‹ˆλΌ ν•„μš”ν•œ λΆ€λΆ„λ§Œ μ—…λ°μ΄νŠΈν•˜κΈ° λ•Œλ¬Έμ— SPAλŠ” μ‚¬μš©μžμ˜ 행동에 λΉ λ₯΄κ²Œ λ°˜μ‘ν•œλ‹€.

  2. μ„œλ²„ μž…μž₯μ—μ„œλŠ” μš”μ²­λ°›μ€ λ°μ΄ν„°λ§Œ λ„˜κ²¨μ£Όλ©΄ 되기 λ•Œλ¬Έμ— 과거와 같은 κ³ΌλΆ€ν•˜ λ¬Έμ œλ„ ν˜„μ €νžˆ 쀄일 수 μžˆλ‹€.

  3. ν™”λ©΄ 전체λ₯Ό μƒˆλ‘œ λ Œλ”λ§ν•  ν•„μš”κ°€ μ—†κΈ° λ•Œλ¬Έμ— 보닀 λ‚˜μ€ μ‚¬μš©μž κ²½ν—˜μ„ μ œκ³΅ν•œλ‹€.

 

• SPA의 단점

  1. λΈŒλΌμš°μ €λŠ” 첫 ν™”λ©΄ λ‘œλ”© μ‹œμ— HTML νŒŒμΌμ„ 읽어듀인 ν›„ λ¬Έμ„œ λ‚΄ <script> μš”μ†Œμ˜ JavaScript νŒŒμΌμ„ λ‹€μ‹œ λ°›μ•„μ˜€λŠ” 과정을 κ±°μΉœλ‹€. μ΄λ•Œ 첫 ν™”λ©΄ λ‘œλ”© μ‹œ 읽어듀인 HTML νŒŒμΌμ€ 거의 λΉ„μ–΄μžˆκ³ , λŒ€λΆ€λΆ„μ˜ μ½”λ“œλŠ” JavaScript 파일 μ•ˆμ— λ“€μ–΄μžˆλ‹€ λ³΄λ‹ˆ μžμ—°μŠ€λŸ½κ²Œ JavaScript 파일이 λ¬΄κ±°μ›Œμ§„λ‹€. λ•Œλ¬Έμ— 이 JavaScript νŒŒμΌμ„ κΈ°λ‹€λ¦¬λŠ” μ‹œκ°„μœΌλ‘œ 인해 첫 ν™”λ©΄μ˜ λ‘œλ”© μ‹œκ°„μ΄ 길어진닀.

  2. 검색 엔진 μ΅œμ ν™”(SEO)κ°€ 쒋지 μ•Šλ‹€. 검색엔진 μ΅œμ ν™”λž€ κ΅¬κΈ€μ΄λ‚˜ 넀이버 같은 검색엔진이 자료λ₯Ό μˆ˜μ§‘ν•˜κΈ° 쒋도둝 μ›Ή νŽ˜μ΄μ§€λ₯Ό κ΅¬μ„±ν•˜λŠ” 것을 λœ»ν•œλ‹€. 검색 λ‘œλ΄‡μ€ 자료λ₯Ό μˆ˜μ§‘ν•  λ•Œμ— μ›Ή νŽ˜μ΄μ§€μ˜ URL은 물둠이고 HTML λ¬Έμ„œ λ‚΄μ˜ 각쒅 νƒœκ·Έλ‚˜ 링크 등을 λΆ„μ„ν•œλ‹€. SPAλŠ” HTML이 거의 λΉ„μ–΄μžˆλ‹€ λ³΄λ‹ˆ 검색 λ‘œλ΄‡μ΄ μΆ©λΆ„ν•œ 자료λ₯Ό μˆ˜μ§‘ν•˜μ§€ λͺ»ν•œλ‹€.

 

 

πŸ“Œ Chapter2. React Router

• μ›Ή μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œμ˜ λΌμš°νŒ…μ΄λž€ μ‚¬μš©μžκ°€ μš”μ²­ν•œ URL에 따라 μ•Œλ§žλŠ” νŽ˜μ΄μ§€λ₯Ό λ³΄μ—¬μ£ΌλŠ” 것을 μ˜λ―Έν•œλ‹€.

λ¦¬μ•‘νŠΈ λΌμš°ν„°λ₯Ό μ‚¬μš©ν•˜λ©΄ μ†μ‰½κ²Œ μ‹±κΈ€ νŽ˜μ΄μ§€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ (Single Page Application)을 λ§Œλ“€ 수 μžˆλ‹€.

router <BrowserRouter>
route matchers <Routes> <Route>
route changers <Link>

• λ¦¬μ•‘νŠΈ λΌμš°ν„°μ—λŠ” 더 λ§Žμ€ κΈ°λŠ₯듀이 μžˆμ§€λ§Œ, μš°μ„ μ€ κ°„λ‹¨ν•˜κ²Œ μ‚¬μš©λ²• μ •λ„λ§Œ λ°°μ› λ‹€. <BrowserRouter>둜 μ»΄ν¬λ„ŒνŠΈλ₯Ό 감싸주고, <Routes>와 <Route>와 <Link>λ₯Ό ν™œμš©ν•΄ 경둜λ₯Ό μ§€μ •ν•˜κ³ , μ΄λ™μ‹œν‚¬ 수 μžˆλ‹€. 

 

 

↓ μ—¬κΈ° 정말 μžλ£Œλ„ μΆ©λΆ„ν•˜κ³  μ„€λͺ…도 잘 λ˜μ–΄μžˆμ–΄μ„œ μ°Έκ³ ν•˜λ©΄ 쒋을 것 κ°™λ‹€ πŸ‘πŸ»

 

React Router v6 νŠœν† λ¦¬μ–Ό

λ¦¬μ•‘νŠΈ λΌμš°ν„° v6λ₯Ό μƒˆλ‘œ μ ‘ν•˜μ‹œλŠ” 뢄듀을 μœ„ν•œ νŠœν† λ¦¬μ–Όμ„ μž‘μ„±ν–ˆμŠ΅λ‹ˆλ‹€. λ¦¬μ•‘νŠΈ λΌμš°ν„° v6 의 기본적인 μ‚¬μš©λ²•, 그리고 이 λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œ μ œκ³΅ν•˜λŠ” λ‹€μ–‘ν•œ μœ μš©ν•œ κΈ°λŠ₯듀에 λŒ€ν•΄μ„œ μ•Œμ•„λ΄…μ‹œ

velog.io

 

⭐️ 과제. React Twittler SPA

 μ „λ‚ μ˜ React Twittler Intro에 μ΄μ–΄μ„œ μ΄λ²ˆμ—λŠ” React Route Dom을 ν™œμš©ν•΄ νŽ˜μ΄μ§€ 이동을 κ΅¬ν˜„ν–ˆλ‹€.

 React Route Dom을 ν™œμš©ν•œ 예제만 잠깐 κΈ°λ‘ν•΄λ³΄μžλ©΄, μ•„λž˜μ™€ κ°™λ‹€.  

import { BrowserRouter, Routes, Route } from 'react-router-dom';

const App = () => {
  return (
    <BrowserRouter>
      {/* TODO - BrowserRouter μ»΄ν¬λ„ŒνŠΈλ₯Ό μž‘μ„±ν•©λ‹ˆλ‹€. */}
      <main>
        <Sidebar />
        <section>
          {/* TODO - Routes와 Route μ»΄ν¬λ„ŒνŠΈλ₯Ό μ΄μš©ν•˜μ—¬ 경둜(path)λ₯Ό μ„€μ •ν•˜κ³  Tweets, Mypage, About μ»΄ν¬λ„ŒνŠΈλ₯Ό μ—°κ²°ν•©λ‹ˆλ‹€. */}
          <Routes>
            <Route path="/" element={<Tweets />}></Route>
            <Route path="/about" element={<About />}></Route>
            <Route path="/mypage" element={<MyPage />}></Route>
          </Routes>
        </section>
      </main>
    </BrowserRouter>
  );
};
import { Link } from 'react-router-dom';

const Sidebar = () => {
  return (
    <section className="sidebar">
      {/* TODO : About 메뉴 μ•„μ΄μ½˜κ³Ό Mypage 메뉴 μ•„μ΄μ½˜μ„ μž‘μ„±ν•˜κ³  Link μ»΄ν¬λ„ŒνŠΈλ₯Ό μ΄μš©ν•˜μ—¬ 경둜(path)λ₯Ό μ—°κ²°ν•©λ‹ˆλ‹€. */}
        <Link to="/"><i className="far fa-comment-dots"></i></Link>
        <Link to="/about"><i className="far fa-question-circle"></i></Link>
        <Link to="/mypage"><i className="far fa-user"></i></Link>
    </section>
  );
};

 μ•„직 μ΅μˆ™μΉ˜ μ•Šμ•„μ„œ κ·ΈλŸ°μ§€ <Route>둜 pathλ₯Ό μ§€μ •ν•˜λŠ” 것과 <Link>둜 경둜λ₯Ό ν‘œμ‹œν•˜λŠ”κ²Œ μ’€ ν—·κ°ˆλ ΈλŠ”λ°, 이번 과제λ₯Ό 톡해 μ’€ 더 μ΅μˆ™ν•΄μ§„ 것 κ°™λ‹€. μ™œ λ‚œ μ €κ²Œ κ·Έλ ‡κ²Œ ν—·κ°ˆλ¦¬μ§€?

 

 

🌱 μ˜€ν›„ Q&A μ„Έμ…˜

• (μ›ΉνŒ© λ²ˆλ“€λ§ 이후) λ¦¬μ•‘νŠΈλŠ” μ–΄λ–»κ²Œ μ‹œμž‘λ˜λŠ”κ°€?

1. λ²ˆλ“€λ§μ„ ν•˜κ²Œ 되면 μš°λ¦¬κ°€ μ•„λŠ” ν‰λ²”ν•œ js 파일이 생성

2. μƒμ„±λœ jsνŒŒμΌμ„ html νŒŒμΌμ— <script src=””> μ΄λŸ°μ‹μœΌλ‘œ μƒγ…‚μž…

3. html νŒŒμΌμ€ node.jsλ₯Ό 톡해 serving(μ‹€ν–‰)함

4. κ·Έ μ΄ν›„μ—λŠ” 일반적으둜 js μ‹€ν–‰ 둜직과 μ™„μ „νžˆ 동일

 

 <BrowserRouter>의 μœ„μΉ˜

 μ–΄λ””에 μ‚¬μš©ν•˜λ“  μƒκ΄€μ—†μ§€λ§Œ, λ°˜λ“œμ‹œ ν•œλ²ˆλ§Œ μ¨μ•Όν•œλ‹€.

 κ°•μ‚¬λ‹˜μ€ App μ»΄ν¬λ„ŒνŠΈ 내에 μž‘μ„±ν•˜λŠ” 것을 μ„ ν˜Έ (index.jsλŠ” μ΅œλŒ€ν•œ κΉ”λ”ν•œ 것을 μ„ ν˜Έν•΄μ„œ)

function App() {
  return <BrowserRouter>{/* ... */}</BrowserRouter>
}

 μ΄ λΆ€λΆ„ κΆκΈˆν–ˆμ—ˆλŠ”λ°, κ°„λž΅ν•˜κ²Œ μ„€λͺ…을 듀을 수 μžˆμ–΄μ„œ 배울 수 μžˆμ—ˆλ‹€. 

 

SPAλŠ” 첫화면 λ‘œλ”©μ΄ κΈΈλ‹€λŠ” 단점이 μžˆλŠ”λ°, κ·Έκ±Έ λ³΄μ™„ν•˜λŠ” λ°©λ²•μœΌλ‘œλŠ”

1. SSR으둜 ν•΄κ²° → CSR에 λΉ„ν•΄ 초기 νŽ˜μ΄μ§€ λ‘œλ“œ μ‹œκ°„μ΄ λΉ λ₯΄λ‹€. 

2. λ²ˆλ“€λ§ μ‹œ μš©λŸ‰ μ΅œμ ν™” ν•˜λŠ” 방법 → μ˜€ν”ˆμ†ŒμŠ€λ₯Ό λ˜λ„λ‘ 많이 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” λ°©λ²•μœΌλ‘œ 귀결됨

3. λ‹€μ΄λ‚˜λ―Ή import(λ™μ μœΌλ‘œ κ°€μ Έμ˜€κΈ°)λ₯Ό μ‚¬μš© → λΆˆν•„μš”ν•œ λ¦¬μ†ŒμŠ€λ₯Ό 쀄일 수 μžˆλ‹€. 

 


πŸŒ™  였늘의 회고

 μ½”λ“œμŠ€ν…Œμ΄μΈ  μ»€λ¦¬ν˜λŸΌμƒ Reactλ₯Ό μ–΄μ œ μ‹œμž‘ν–ˆλŠ”λ°, state와 prop λ“±μ˜ μ€‘μš”ν•œ κ°œλ…μ„ 닀루기 전에 React Router Dom을 λ‹€λ£¨λŠ” 뢀뢄에 λ¨Όμ € λ“€μ–΄μ™”λ‹€. λ“œλ””μ–΄ 본격적으둜 화면에 λ³΄μ΄λŠ” μž‘μ—…μ„ ν•˜λ‹ˆ 이전보닀 더 μž¬λ―ΈμžˆλŠ”κ²Œ λŠκ»΄μ‘Œλ‹€. λ¦¬μ•‘νŠΈ, μ–Έμ œμ―€ 자유자재둜 λ‹€λ£° 수 있게 될까.

 μ£Όλ§λ™μ•ˆ μ§€κΈˆκΉŒμ§€ λͺ»ν–ˆλ˜ 뢀뢄듀을 λ³΅μŠ΅ν•˜κ³ , μž¬μ •λΉ„λ₯Ό ν•˜λŠ” μ‹œκ°„μ„ κ°€μ Έμ•Όκ² λ‹€.

λ°˜μ‘ν˜•