# [[Client-Side Routing]] ## πŸ“Œ Brief Summary ν΄λΌμ΄μ–ΈνŠΈ μ‚¬μ΄λ“œ λΌμš°νŒ…(Client-Side Routing)은 λΈŒλΌμš°μ €κ°€ μ„œλ²„λ‘œλΆ€ν„° 전체 μƒˆ νŽ˜μ΄μ§€λ₯Ό λΆˆλŸ¬μ˜€λŠ” λŒ€μ‹ , JavaScriptλ₯Ό 톡해 ν΄λΌμ΄μ–ΈνŠΈ μΈ‘μ—μ„œ λ™μ μœΌλ‘œ ν˜„μž¬ μ›Ή νŽ˜μ΄μ§€λ₯Ό λ‹€μ‹œ μž‘μ„±ν•˜μ—¬ 화면을 μ „ν™˜ν•˜λŠ” 탐색 λ°©μ‹μž…λ‹ˆλ‹€ [1]. 주둜 μ‹±κΈ€ νŽ˜μ΄μ§€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜(SPA)μ—μ„œ μ‚¬μš©λ˜μ–΄ λΉ λ₯΄κ³  μ•±κ³Ό 같은 λ§€λ„λŸ¬μš΄ μ‚¬μš©μž κ²½ν—˜μ„ μ œκ³΅ν•©λ‹ˆλ‹€ [2, 3]. React μƒνƒœκ³„μ—μ„œλŠ” React Routerκ°€ λŒ€ν‘œμ μœΌλ‘œ μ‚¬μš©λ˜λ©° λΌμš°νŒ…λΏλ§Œ μ•„λ‹ˆλΌ 데이터 패칭과 μƒνƒœ 관리λ₯Ό μ‘°μœ¨ν•˜λŠ” 핡심 역할을 λ‹΄λ‹Ήν•©λ‹ˆλ‹€ [4]. ## πŸ“– Core Content * **μž‘λ™ 방식 및 μ‚¬μš©μž κ²½ν—˜(UX):** ν΄λΌμ΄μ–ΈνŠΈ μ‚¬μ΄λ“œ λΌμš°νŒ…μ€ 초기 HTML 셸을 λ‘œλ“œν•œ 이후, μ‚¬μš©μžμ˜ 탐색 μš”μ²­ μ‹œ μ„œλ²„ μš”μ²­ 없이 λΈŒλΌμš°μ € λ‚΄μ—μ„œ JavaScriptλ₯Ό μ‹€ν–‰ν•˜μ—¬ UIλ₯Ό μ—…λ°μ΄νŠΈν•©λ‹ˆλ‹€ [1, 5]. μ΄λŸ¬ν•œ 방식은 ν™”λ©΄ μ „ν™˜ μ‹œ 전체 νŽ˜μ΄μ§€ μƒˆλ‘œκ³ μΉ¨μ΄ λ°œμƒν•˜μ§€ μ•ŠμœΌλ―€λ‘œ μ „ν™˜ 속도가 μ¦‰κ°μ μœΌλ‘œ λŠκ»΄μ§€λ©°, νŽ˜μ΄μ§€ 탐색 쀑에도 νŠΉμ • μƒνƒœ(예: μž¬μƒ 쀑인 μ˜€λ””μ˜€)λ₯Ό λŠκΉ€ 없이 μœ μ§€ν•  수 μžˆλ‹€λŠ” μž₯점이 μžˆμŠ΅λ‹ˆλ‹€ [3]. * **React Routerλ₯Ό ν™œμš©ν•œ ꡬ쑰화:** React μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œλŠ” React Routerλ₯Ό μ‚¬μš©ν•˜μ—¬ λ³΅μž‘ν•œ UI λ ˆμ΄μ•„μ›ƒκ³Ό 계측적 λ‚΄λΉ„κ²Œμ΄μ…˜ νŒ¨ν„΄μ„ μ„ μ–Έμ μœΌλ‘œ κ΅¬μ„±ν•©λ‹ˆλ‹€ [6, 7]. 예λ₯Ό λ“€μ–΄ 쀑첩 라우트(Nested Routes) κΈ°λŠ₯κ³Ό `` μ»΄ν¬λ„ŒνŠΈλ₯Ό μ‚¬μš©ν•˜λ©΄, ν—€λ”λ‚˜ μ‚¬μ΄λ“œλ°” 같은 λΆ€λͺ¨ λ ˆμ΄μ•„μ›ƒμ„ κ³ μ •ν•œ μƒνƒœμ—μ„œ URL κ²½λ‘œμ— 따라 λ‚΄λΆ€ μžμ‹ μ»΄ν¬λ„ŒνŠΈλ§Œ λ™μ μœΌλ‘œ ꡐ체할 수 μžˆμŠ΅λ‹ˆλ‹€ [6-8]. 더 λ‚˜μ•„κ°€ v6.4 μ΄μƒμ—μ„œλŠ” `loader`와 `action` APIλ₯Ό μ œκ³΅ν•˜μ—¬ μ»΄ν¬λ„ŒνŠΈκ°€ λ Œλ”λ§λ˜κΈ° 전에 라우트 μˆ˜μ€€μ—μ„œ λ³‘λ ¬λ‘œ 데이터λ₯Ό κ°€μ Έμ˜€κ±°λ‚˜ 폼 제좜(Mutation)을 μ²˜λ¦¬ν•  수 있게 ν•¨μœΌλ‘œμ¨ μ„±λŠ₯을 κ·ΉλŒ€ν™”ν•©λ‹ˆλ‹€ [9]. * **기술적 SEO 및 크둀링 문제 (CSR의 ν•œκ³„):** λΌμš°νŒ…μ„ μ „μ μœΌλ‘œ ν΄λΌμ΄μ–ΈνŠΈ μΈ‘ JavaScript에 μ˜μ‘΄ν•˜λ©΄ 검색 μ—”μ§„ μ΅œμ ν™”(SEO)에 μ‹¬κ°ν•œ λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€ [10]. ν¬λ‘€λŸ¬λŠ” 초기 λ‘œλ“œ μ‹œ λ‚΄μš©μ΄ μ—†λŠ” 빈 HTML μ…Έ(`
`)만 보게 되며, JavaScriptκ°€ μ‹€ν–‰λ˜μ–΄ λ Œλ”λ§λ  λ•ŒκΉŒμ§€ μ½˜ν…μΈ  인덱싱이 μ§€μ—°λ©λ‹ˆλ‹€ [11-13]. λ˜ν•œ μ‚¬μš©μžκ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” URL에 μ ‘κ·Όν•  λ•Œ λΈŒλΌμš°μ € ν™”λ©΄μƒμœΌλ‘œλŠ” "νŽ˜μ΄μ§€λ₯Ό 찾을 수 μ—†μŒ"을 ν‘œμ‹œν•˜λ”λΌλ„, μ„œλ²„λŠ” 이미 μ•± 셸을 μ„±κ³΅μ μœΌλ‘œ μ „λ‹¬ν–ˆμœΌλ―€λ‘œ 404 μƒνƒœ μ½”λ“œ λŒ€μ‹  200 OK μƒνƒœ μ½”λ“œλ₯Ό λ°˜ν™˜ν•˜λŠ” 'μ†Œν”„νŠΈ 404(Soft 404)' λ¬Έμ œκ°€ λ°œμƒν•˜μ—¬ 크둀 μ˜ˆμ‚°μ„ λ‚­λΉ„ν•˜κ²Œ λ©λ‹ˆλ‹€ [10, 14]. * **μ„±λŠ₯ 및 SEO μ΅œμ ν™” ν”„λž™ν‹°μŠ€:** μ„±λŠ₯ 및 검색 μ—”μ§„ 접근성을 ν–₯μƒν•˜κΈ° μœ„ν•΄μ„œλŠ” ν΄λΌμ΄μ–ΈνŠΈ λΌμš°νŒ… κ΅¬ν˜„ μ‹œ λ‹€μŒκ³Ό 같은 지침을 따라야 ν•©λ‹ˆλ‹€. * **HTML5 History API μ‚¬μš©:** ν•΄μ‹œ(`#`)κ°€ ν¬ν•¨λœ λΌμš°νŒ…(예: `/#/about`)은 ν¬λ‘€λŸ¬κ°€ μ œλŒ€λ‘œ μƒ‰μΈν•˜μ§€ λͺ»ν•˜λ―€λ‘œ, κΉ”λ”ν•˜κ³  크둀링 κ°€λŠ₯ν•œ URL ꡬ쑰λ₯Ό 보μž₯ν•˜λŠ” `BrowserRouter`λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€ [15-17]. * **ν‘œμ€€ 액컀 νƒœκ·Έ μ‚¬μš©:** ν¬λ‘€λŸ¬λŠ” λ²„νŠΌ 클릭 λ“± JavaScript의 이벀트 ν•Έλ“€λŸ¬(예: `onClick`, `router.push()`)λ₯Ό ν†΅ν•œ 이동을 μΆ”μ ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ λͺ¨λ“  λ‚΄λΆ€ λ‚΄λΉ„κ²Œμ΄μ…˜μ€ λ°˜λ“œμ‹œ ν‘œμ€€ `` λ˜λŠ” ν”„λ ˆμž„μ›Œν¬κ°€ μ œκ³΅ν•˜λŠ” `` νƒœκ·Έλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€ [17, 18]. * **라우트 기반 μ½”λ“œ μŠ€ν”Œλ¦¬νŒ…:** 단일 νŽ˜μ΄μ§€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ κ±°λŒ€ν•œ JS λ²ˆλ“€μ€ 'Interaction to Next Paint (INP)' λ“± Core Web Vitals 점수λ₯Ό μ•…ν™”μ‹œν‚΅λ‹ˆλ‹€ [14, 19]. 이λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ 각 λΌμš°νŠΈλ³„λ‘œ μ½”λ“œλ₯Ό λΆ„ν• (Code Splitting)ν•˜κ³  μ§€μ—° λ‘œλ”©(Lazy Loading)을 μ μš©ν•˜μ—¬ ν˜„μž¬ νŽ˜μ΄μ§€μ— ν•„μš”ν•œ μ½”λ“œλ§Œ λ‹€μš΄λ‘œλ“œλ˜λ„λ‘ ν•΄μ•Ό ν•©λ‹ˆλ‹€ [19-22]. * **동적 메타데이터 관리:** λΌμš°νŠΈκ°€ 변경될 λ•Œλ§ˆλ‹€ React Helmet λ“±μ˜ 도ꡬλ₯Ό μ‚¬μš©ν•˜μ—¬ ``κ³Ό λ©”νƒ€νƒœκ·Έλ₯Ό λ™μ μœΌλ‘œ μ—…λ°μ΄νŠΈν•΄ μ£Όμ–΄μ•Ό ν•©λ‹ˆλ‹€ [15, 23]. ## πŸ”— Knowledge Connections - **Related Topics:** [[Single Page Applications (SPA)]], [[React Router]], [[Server-Side Rendering (SSR)]], [[Core Web Vitals]], [[Search Engine Optimization (SEO)]] - **Projects/Contexts:** [[React 기반 μ‹±κΈ€ νŽ˜μ΄μ§€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 개발]], [[기술적 SEO μ΅œμ ν™” 및 λ Œλ”λ§ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ μ „λž΅]] - **Contradictions/Notes:** ν΄λΌμ΄μ–ΈνŠΈ μ‚¬μ΄λ“œ λΌμš°νŒ…μ€ μ‚¬μš©μžμ—κ²Œ 즉각적이고 λŠκΉ€ μ—†λŠ” 탐색 κ²½ν—˜(UX)을 μ œκ³΅ν•˜μ—¬ μœ λ¦¬ν•˜μ§€λ§Œ, 크둀러 κ΄€μ μ—μ„œλŠ” JavaScript μ‹€ν–‰ μ§€μ—°, μ†Œμ…œ λ΄‡μ˜ λ Œλ”λ§ μ‹€νŒ¨, μ†Œν”„νŠΈ 404 λ“± μ‹¬κ°ν•œ SEO ν•œκ³„λ₯Ό μ΄ˆλž˜ν•©λ‹ˆλ‹€ [3, 10, 13]. λ”°λΌμ„œ μ½˜ν…μΈ  λ…ΈμΆœμ΄ μ€‘μš”ν•œ ν”„λ‘œλ•μ…˜ ν™˜κ²½μ—μ„œλŠ” μ™„μ „ν•œ CSR λΌμš°νŒ…μ„ ν”Όν•˜κ³  SSR(μ„œλ²„ μ‚¬μ΄λ“œ λ Œλ”λ§) λ˜λŠ” SSG(정적 μ‚¬μ΄νŠΈ 생성) 기반의 ν”„λ ˆμž„μ›Œν¬(예: Next.js)둜 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ν•˜μ—¬ 검색 엔진에 μ™„μ „ν•œ HTML을 μ œκ³΅ν•˜λŠ” ν•˜μ΄λΈŒλ¦¬λ“œ 접근이 ꢌμž₯λ©λ‹ˆλ‹€ [24-26]. --- *Last updated: 2026-04-26*