λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Lect & Tip/node, Angular, React

[React] SPA νŽ˜μ΄μ§€ 이동 μ‹œ 슀크둀 맨 μœ„ μœ μ§€ ν•˜λŠ” 방법

by st곡간 2025. 2. 10.

λͺ©μ°¨

    [React] SPA νŽ˜μ΄μ§€ 이동 μ‹œ 슀크둀 맨 μœ„ μœ μ§€ ν•˜λŠ” 방법

    졜근 μ›Ή 개발 νŠΈλ Œλ“œμ—μ„œ μ‹±κΈ€ νŽ˜μ΄μ§€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜(SPA)은 μ‚¬μš©μž κ²½ν—˜(UX)을 κ·ΉλŒ€ν™”ν•˜κΈ° μœ„ν•΄ 많이 ν™œμš©λ˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 특히 React와 같은 ν”„λ‘ νŠΈμ—”λ“œ 라이브러리λ₯Ό μ‚¬μš©ν•˜μ—¬ SPAλ₯Ό ꡬ좕할 λ•Œ, νŽ˜μ΄μ§€ κ°„ μ „ν™˜μ΄ λΉ λ₯΄κ³  λΆ€λ“œλŸ¬μš΄ μ „ν™˜ 효과λ₯Ό μ œκ³΅ν•  수 μžˆλ‹€λŠ” 점이 큰 μž₯μ μž…λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μ΄λŸ¬ν•œ SPA의 νŠΉμ„±μƒ νŽ˜μ΄μ§€ 이동 μ‹œ 슀크둀 μœ„μΉ˜κ°€ 이전 νŽ˜μ΄μ§€μ˜ μœ„μΉ˜λ₯Ό κ·ΈλŒ€λ‘œ μœ μ§€ν•˜λŠ” λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ³Έ ν¬μŠ€νŒ…μ—μ„œλŠ” React ν™˜κ²½μ—μ„œ SPA νŽ˜μ΄μ§€ 이동 μ‹œ μŠ€ν¬λ‘€μ„ 항상 맨 μœ„λ‘œ μœ μ§€ν•˜λŠ” λ‹€μ–‘ν•œ 방법과 κ·Έ κ΅¬ν˜„ 사둀에 λŒ€ν•΄ 심도 있게 닀루어 λ³΄κ² μŠ΅λ‹ˆλ‹€.

    SPA와 슀크둀 문제의 이해

    SPAλŠ” ν•œ 번의 λ‘œλ”©μœΌλ‘œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 전체λ₯Ό 뢈러온 ν›„, λ‚΄λΆ€μ—μ„œ λΌμš°νŒ…μ„ 톡해 μ‚¬μš©μžκ°€ ν•„μš”λ‘œ ν•˜λŠ” μ½˜ν…μΈ λ§Œ λ™μ μœΌλ‘œ λ³€κ²½ν•˜μ—¬ λ³΄μ—¬μ£ΌλŠ” κ΅¬μ‘°μž…λ‹ˆλ‹€. 이와 같은 ꡬ쑰 덕뢄에 μ„œλ²„μ™€μ˜ λΆˆν•„μš”ν•œ 톡신을 쀄일 수 μžˆμ§€λ§Œ, 전톡적인 λ©€ν‹° νŽ˜μ΄μ§€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜(MPA)κ³Ό 달리 νŽ˜μ΄μ§€κ°€ μ „ν™˜λ  λ•Œ λΈŒλΌμš°μ €κ°€ 슀크둀 μœ„μΉ˜λ₯Ό μžλ™μœΌλ‘œ μ΄ˆκΈ°ν™”ν•΄μ£Όμ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 이둜 인해 μ‚¬μš©μžλŠ” μƒˆλ‘œμš΄ μ½˜ν…μΈ λ₯Ό 확인할 λ•Œλ„ 이전 νŽ˜μ΄μ§€μ˜ 슀크둀 μœ„μΉ˜μ— 머물게 λ˜μ–΄, 가독성과 UX μΈ‘λ©΄μ—μ„œ λΆˆνŽΈν•¨μ„ κ²ͺ을 수 μžˆμŠ΅λ‹ˆλ‹€.

    예λ₯Ό λ“€μ–΄, μ‚¬μš©μžκ°€ κΈ΄ 슀크둀이 ν•„μš”ν•œ νŽ˜μ΄μ§€μ—μ„œ ν•˜λ‹¨κΉŒμ§€ μŠ€ν¬λ‘€ν•œ ν›„ λ‹€λ₯Έ νŽ˜μ΄μ§€λ‘œ μ΄λ™ν•˜λ©΄, μƒˆλ‘œ λ‘œλ“œλœ νŽ˜μ΄μ§€μ—μ„œλ„ 슀크둀 μœ„μΉ˜κ°€ ν•˜λ‹¨μ— 머무λ₯΄κ²Œ λ©λ‹ˆλ‹€. μ΄λŠ” μ‚¬μš©μžκ°€ νŽ˜μ΄μ§€μ˜ μ‹œμž‘ λΆ€λΆ„λΆ€ν„° μ½˜ν…μΈ λ₯Ό 확인해야 ν•˜λŠ” μƒν™©μ—μ„œλŠ” 맀우 ν˜Όλž€μŠ€λŸ¬μš΄ κ²½ν—˜μ΄ 될 수 μžˆμŠ΅λ‹ˆλ‹€.

    슀크둀 μ΄ˆκΈ°ν™”μ˜ ν•„μš”μ„±κ³Ό ν•΄κ²° 방법

    μ›Ή κ°œλ°œμ—μ„œλŠ” μ‚¬μš©μž νŽΈμ˜μ„±μ„ 높이기 μœ„ν•΄ νŽ˜μ΄μ§€ μ „ν™˜ μ‹œ 슀크둀 μœ„μΉ˜λ₯Ό μžλ™μœΌλ‘œ μ΅œμƒλ‹¨μœΌλ‘œ μ΄λ™μ‹œν‚€λŠ” 것이 일반적인 UX νŒ¨ν„΄μž…λ‹ˆλ‹€. Reactλ₯Ό λΉ„λ‘―ν•œ SPA ν”„λ ˆμž„μ›Œν¬μ—μ„œλ„ 이와 같은 κΈ°λŠ₯이 ν•„μš”ν•˜λ©°, λ‹€μ–‘ν•œ λ°©λ²•μœΌλ‘œ 이λ₯Ό κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λŒ€ν‘œμ μΈ ν•΄κ²° 방법은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

    1. window.scrollTo() λ©”μ„œλ“œ μ‚¬μš©
      νŽ˜μ΄μ§€ 이동이 λ°œμƒν•  λ•Œλ§ˆλ‹€ window.scrollTo(0, 0)을 ν˜ΈμΆœν•˜μ—¬ 슀크둀 μœ„μΉ˜λ₯Ό μ΄ˆκΈ°ν™”ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€. 이 방법은 κ°„λ‹¨ν•˜λ©΄μ„œλ„ νš¨κ³Όμ μ΄μ§€λ§Œ, μ—¬λŸ¬ μ»΄ν¬λ„ŒνŠΈμ—μ„œ 반볡적으둜 ν˜ΈμΆœν•΄μ•Ό ν•˜κ±°λ‚˜ λΌμš°νŒ… 변화에 λŒ€ν•œ 이벀트 μ²˜λ¦¬κ°€ λ³΅μž‘ν•΄μ§ˆ 수 μžˆλ‹€λŠ” 단점이 μžˆμŠ΅λ‹ˆλ‹€.
    2. React Router의 Scroll Restoration κΈ°λŠ₯ ν™œμš©
      μ΅œμ‹  λ²„μ „μ˜ React RouterλŠ” 기본적으둜 슀크둀 μœ„μΉ˜ 관리 κΈ°λŠ₯을 μ œκ³΅ν•˜κΈ°λ„ ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ λͺ¨λ“  ν”„λ‘œμ νŠΈμ—μ„œ 이 κΈ°λŠ₯을 μ‚¬μš©ν•  수 μžˆλŠ” 것은 μ•„λ‹ˆλ©°, μ»€μŠ€ν„°λ§ˆμ΄μ§•μ΄ ν•„μš”ν•œ 경우 직접 κ΅¬ν˜„ν•˜λŠ” 것이 μœ λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    3. ScrollToTop μ»΄ν¬λ„ŒνŠΈ μ œμž‘
      μ»€μŠ€ν…€ μ»΄ν¬λ„ŒνŠΈλ₯Ό λ§Œλ“€μ–΄ λΌμš°νŠΈκ°€ 변경될 λ•Œλ§ˆλ‹€ μžλ™μœΌλ‘œ μŠ€ν¬λ‘€μ„ μ΄ˆκΈ°ν™”ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€. 이 방식은 μ½”λ“œμ˜ μž¬μ‚¬μš©μ„±κ³Ό μœ μ§€λ³΄μˆ˜ μΈ‘λ©΄μ—μ„œ 맀우 νš¨μœ¨μ μž…λ‹ˆλ‹€. 보톡 useEffect 훅을 ν™œμš©ν•˜μ—¬ 라우트 λ³€κ²½ μ‹œμ μ— window.scrollTo(0, 0)을 ν˜ΈμΆœν•˜λŠ” ν˜•νƒœλ‘œ κ΅¬ν˜„ν•©λ‹ˆλ‹€.

    μ•„λž˜μ—μ„œλŠ” κ°€μž₯ 많이 μ‚¬μš©λ˜λŠ” ScrollToTop μ»΄ν¬λ„ŒνŠΈ κ΅¬ν˜„ 예제λ₯Ό 톡해 ꡬ체적인 방법을 μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

    Reactμ—μ„œ ScrollToTop μ»΄ν¬λ„ŒνŠΈ κ΅¬ν˜„ 예제

    λ‹€μŒμ€ React Routerλ₯Ό μ‚¬μš©ν•˜λŠ” ν”„λ‘œμ νŠΈμ—μ„œ ScrollToTop μ»΄ν¬λ„ŒνŠΈλ₯Ό κ΅¬ν˜„ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€. 이 μ»΄ν¬λ„ŒνŠΈλŠ” λΌμš°νŠΈκ°€ 변경될 λ•Œλ§ˆλ‹€ μŠ€ν¬λ‘€μ„ μ΅œμƒλ‹¨μœΌλ‘œ μ΄λ™μ‹œμΌœ μ‚¬μš©μžμ—κ²Œ 항상 μƒˆλ‘œμš΄ νŽ˜μ΄μ§€μ˜ μ‹œμž‘ 뢀뢄을 보여쀄 수 μžˆλ„λ‘ λ„μ™€μ€λ‹ˆλ‹€.

    import { useEffect } from 'react';
    import { useLocation } from 'react-router-dom';
    
    const ScrollToTop = () => {
      const { pathname } = useLocation();
    
      useEffect(() => {
        // νŽ˜μ΄μ§€κ°€ 변경될 λ•Œλ§ˆλ‹€ μŠ€ν¬λ‘€μ„ 맨 μœ„λ‘œ 이동
        window.scrollTo({
          top: 0,
          behavior: 'smooth' // λΆ€λ“œλŸ¬μš΄ 슀크둀 효과 (μ›ν•˜λŠ” 경우 'auto'둜 λ³€κ²½ κ°€λŠ₯)
        });
      }, [pathname]);
    
      return null;
    };
    
    export default ScrollToTop;

    μœ„ μ½”λ“œμ—μ„œ useLocation 훅을 μ‚¬μš©ν•˜μ—¬ ν˜„μž¬ 라우트 경둜λ₯Ό λ°›μ•„μ˜€λ©°, κ²½λ‘œκ°€ 변경될 λ•Œλ§ˆλ‹€ useEffect λ‚΄μ˜ 콜백 ν•¨μˆ˜κ°€ μ‹€ν–‰λ©λ‹ˆλ‹€. μ΄λ•Œ window.scrollToλ₯Ό ν˜ΈμΆœν•˜μ—¬ 슀크둀 μœ„μΉ˜λ₯Ό 맨 μœ„λ‘œ μ΄λ™μ‹œν‚΅λ‹ˆλ‹€. behavior μ˜΅μ…˜μ„ 'smooth'둜 μ„€μ •ν•˜λ©΄ λΆ€λ“œλŸ¬μš΄ 슀크둀 μ• λ‹ˆλ©”μ΄μ…˜ 효과λ₯Ό 쀄 수 μžˆμ–΄ μ‚¬μš©μž κ²½ν—˜μ΄ ν•œμΈ΅ ν–₯μƒλ©λ‹ˆλ‹€.

    이 μ»΄ν¬λ„ŒνŠΈλ₯Ό μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 루트 μ»΄ν¬λ„ŒνŠΈλ‚˜ λΌμš°ν„°λ₯Ό κ°μ‹ΈλŠ” μ˜μ—­μ— μ‚½μž…ν•˜λ©΄, 라우트 λ³€κ²½ μ‹œ μžλ™μœΌλ‘œ 슀크둀 μœ„μΉ˜κ°€ μ΄ˆκΈ°ν™”λ˜λŠ” 효과λ₯Ό λˆ„λ¦΄ 수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, App.js νŒŒμΌμ—μ„œ λ‹€μŒκ³Ό 같이 μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    import React from 'react';
    import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
    import ScrollToTop from './ScrollToTop';
    import HomePage from './pages/HomePage';
    import AboutPage from './pages/AboutPage';
    import ContactPage from './pages/ContactPage';
    
    const App = () => {
      return (
        <Router>
          <ScrollToTop />
          <Routes>
            <Route path="/" element={<HomePage />} />
            <Route path="/about" element={<AboutPage />} />
            <Route path="/contact" element={<ContactPage />} />
          </Routes>
        </Router>
      );
    };
    
    export default App;

    이와 같이 κ΅¬μ„±ν•˜λ©΄ μ‚¬μš©μžκ°€ νŽ˜μ΄μ§€λ₯Ό μ „ν™˜ν•  λ•Œλ§ˆλ‹€ 슀크둀이 μžλ™μœΌλ‘œ μ΅œμƒλ‹¨μœΌλ‘œ μ΄λ™ν•˜μ—¬, 각 νŽ˜μ΄μ§€μ˜ μ‹œμž‘ λΆ€λΆ„λΆ€ν„° μ½˜ν…μΈ λ₯Ό 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

    λ‹€μ–‘ν•œ 상황에 맞좘 슀크둀 관리 μ „λž΅

    μ‹€μ œ ν”„λ‘œμ νŠΈμ—μ„œλŠ” λ‹¨μˆœνžˆ νŽ˜μ΄μ§€ 이동 μ‹œ μŠ€ν¬λ‘€μ„ μ΅œμƒλ‹¨μœΌλ‘œ μ΄ˆκΈ°ν™”ν•˜λŠ” 것 외에도 μ—¬λŸ¬ 상황을 κ³ λ €ν•΄μ•Ό ν•  λ•Œκ°€ μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, λ‹€μŒκ³Ό 같은 상황듀이 μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

    • λͺ¨λ‹¬ μ°½ λ˜λŠ” νŒμ—… μ˜€ν”ˆ μ‹œ
      νŽ˜μ΄μ§€ 전체가 μ•„λ‹Œ νŠΉμ • μ˜μ—­λ§Œ μ—…λ°μ΄νŠΈλ˜λŠ” 경우, 전체 νŽ˜μ΄μ§€μ˜ 슀크둀 μœ„μΉ˜λ₯Ό λ³€κ²½ν•˜λ©΄ 였히렀 μ‚¬μš©μžμ˜ ν˜Όλž€μ„ μ΄ˆλž˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λ•ŒλŠ” λͺ¨λ‹¬ 내뢀에 λ³„λ„μ˜ 슀크둀 μ»¨ν…Œμ΄λ„ˆλ₯Ό 두고 κ΄€λ¦¬ν•˜λŠ” 방법이 ν•„μš”ν•©λ‹ˆλ‹€.
    • νŠΉμ • νŽ˜μ΄μ§€μ—μ„œλŠ” 이전 슀크둀 μœ„μΉ˜ μœ μ§€
      예λ₯Ό λ“€μ–΄, 리슀트 νŽ˜μ΄μ§€μ—μ„œ 상세 νŽ˜μ΄μ§€λ‘œ μ΄λ™ν•œ ν›„ λ‹€μ‹œ 리슀트둜 λŒμ•„μ˜¬ λ•Œ 이전 슀크둀 μœ„μΉ˜λ₯Ό μœ μ§€ν•˜κ³  싢은 κ²½μš°κ°€ μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ κ²½μš°μ—λŠ” 슀크둀 μœ„μΉ˜λ₯Ό μƒνƒœ(state)λ‚˜ 둜컬 μŠ€ν† λ¦¬μ§€μ— μ €μž₯ν•œ ν›„, 볡귀 μ‹œ ν•΄λ‹Ή μœ„μΉ˜λ‘œ μŠ€ν¬λ‘€μ„ μ΄λ™μ‹œν‚€λŠ” λ‘œμ§μ„ μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • 라우트 변경에 λ”°λ₯Έ μ• λ‹ˆλ©”μ΄μ…˜ 효과 적용
      νŽ˜μ΄μ§€ 이동 μ‹œ λ‹¨μˆœνžˆ μŠ€ν¬λ‘€μ„ μ΄ˆκΈ°ν™”ν•˜λŠ” 것 외에도, μ „ν™˜ μ• λ‹ˆλ©”μ΄μ…˜μ„ ν•¨κ»˜ μ μš©ν•˜μ—¬ 보닀 λΆ€λ“œλŸ¬μš΄ UXλ₯Ό μ œκ³΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λ•Œ μ• λ‹ˆλ©”μ΄μ…˜κ³Ό 슀크둀 μ΄ˆκΈ°ν™” 타이밍을 μ‘°μœ¨ν•΄μ•Ό ν•˜λ―€λ‘œ, 좔가적인 둜직과 라이브러리 ν™œμš©μ΄ ν•„μš”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    이와 같이 λ‹€μ–‘ν•œ μ‚¬μš©μž μ‹œλ‚˜λ¦¬μ˜€λ₯Ό κ³ λ €ν•˜μ—¬ 슀크둀 관리 λ‘œμ§μ„ μ»€μŠ€ν„°λ§ˆμ΄μ§•ν•˜λ©΄, λ”μš± ν–₯μƒλœ μ‚¬μš©μž κ²½ν—˜μ„ μ œκ³΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    μ‹€λ¬΄μ—μ„œμ˜ 적용과 μ£Όμ˜μ‚¬ν•­

    싀무 ν™˜κ²½μ—μ„œλŠ” ν”„λ‘œμ νŠΈμ˜ 규λͺ¨μ™€ λ³΅μž‘λ„μ— 따라 슀크둀 μ΄ˆκΈ°ν™” κΈ°λŠ₯을 λ‹¨μˆœνžˆ ν•˜λ‚˜μ˜ μ»΄ν¬λ„ŒνŠΈλ‘œ ν•΄κ²°ν•˜κΈ° μ–΄λ €μš΄ κ²½μš°λ„ λ§ŽμŠ΅λ‹ˆλ‹€. λ‹€μŒκ³Ό 같은 사항듀을 κ³ λ €ν•΄λ³΄μ‹œκΈ° λ°”λžλ‹ˆλ‹€.

    1. λΌμš°ν„° 버전 및 라이브러리 ν˜Έν™˜μ„±
      React Router의 버전이 μ—…λ°μ΄νŠΈλ˜λ©΄μ„œ κΈ°λ³Έ μ œκ³΅λ˜λŠ” 슀크둀 볡원 κΈ°λŠ₯이 λ‹¬λΌμ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€. ν”„λ‘œμ νŠΈμ— μ μš©ν•˜κΈ° 전에 ν˜„μž¬ μ‚¬μš© 쀑인 λΌμš°ν„° 라이브러리의 λ¬Έμ„œλ₯Ό κΌΌκΌΌν•˜κ²Œ ν™•μΈν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.
    2. μ„±λŠ₯ μ΅œμ ν™”
      슀크둀 μ΄ˆκΈ°ν™” 둜직이 νŽ˜μ΄μ§€ μ „ν™˜ μ‹œλ§ˆλ‹€ μ‹€ν–‰λ˜λ―€λ‘œ, λΆˆν•„μš”ν•œ λ Œλ”λ§μ΄λ‚˜ κ³Όλ„ν•œ μ• λ‹ˆλ©”μ΄μ…˜ 효과둜 인해 μ„±λŠ₯ μ €ν•˜κ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. 특히 λͺ¨λ°”일 ν™˜κ²½μ—μ„œλŠ” μ„±λŠ₯에 λ―Όκ°ν•˜λ―€λ‘œ, λΆ€λ“œλŸ¬μš΄ 슀크둀 μ• λ‹ˆλ©”μ΄μ…˜ νš¨κ³Όμ™€ μ„±λŠ₯ κ°„μ˜ κ· ν˜•μ„ λ§žμΆ”λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€.
    3. μ‚¬μš©μž κ²½ν—˜(UX) κ³ λ €
      λͺ¨λ“  νŽ˜μ΄μ§€μ—μ„œ 무쑰건 μŠ€ν¬λ‘€μ„ μ΅œμƒλ‹¨μœΌλ‘œ μ΄λ™μ‹œν‚€λŠ” 것이 항상 μ΅œμ„ μ˜ 선택은 μ•„λ‹™λ‹ˆλ‹€. μ‚¬μš©μžκ°€ νŠΉμ • 컨텐츠λ₯Ό 읽닀가 λ‹€λ₯Έ νŽ˜μ΄μ§€λ‘œ μ΄λ™ν•œ ν›„ λ‹€μ‹œ λŒμ•„μ˜¬ λ•Œ 이전 μœ„μΉ˜λ₯Ό κΈ°μ–΅ν•˜λŠ” 것이 더 λ‚˜μ€ κ²½ν—˜μ„ μ œκ³΅ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ 각 νŽ˜μ΄μ§€μ˜ νŠΉμ„±κ³Ό μ‚¬μš©μžμ˜ 행동 νŒ¨ν„΄μ— 맞게 슀크둀 μ΄ˆκΈ°ν™” 정책을 μœ μ—°ν•˜κ²Œ μ μš©ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.
    4. μ—λŸ¬ 핸듀링
      λ§Œμ•½ 라우트 λ³€κ²½ 도쀑 μ—λŸ¬κ°€ λ°œμƒν•˜κ±°λ‚˜ 슀크둀 μ΄ˆκΈ°ν™” 둜직이 μ˜ˆμƒλŒ€λ‘œ μž‘λ™ν•˜μ§€ μ•ŠλŠ” 경우, μ‚¬μš©μžμ—κ²Œ ν˜Όλž€μ„ 쀄 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ 상황에 λŒ€λΉ„ν•˜μ—¬ μ μ ˆν•œ μ—λŸ¬ 핸듀링 λ‘œμ§μ„ μΆ”κ°€ν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€.

    κ²°λ‘ 

    SPA ν™˜κ²½μ—μ„œ Reactλ₯Ό μ‚¬μš©ν•˜μ—¬ νŽ˜μ΄μ§€λ₯Ό κ΅¬ν˜„ν•  λ•Œ, 슀크둀 μ΄ˆκΈ°ν™” κΈ°λŠ₯은 μ‚¬μš©μž κ²½ν—˜μ„ ν–₯μƒμ‹œν‚€κΈ° μœ„ν•œ ν•„μˆ˜ μš”μ†Œ 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€. λ³Έ ν¬μŠ€νŒ…μ—μ„œλŠ” React Routerλ₯Ό ν™œμš©ν•œ ScrollToTop μ»΄ν¬λ„ŒνŠΈ κ΅¬ν˜„ 방법을 λΉ„λ‘―ν•˜μ—¬, λ‹€μ–‘ν•œ μƒν™©μ—μ„œ μŠ€ν¬λ‘€μ„ κ΄€λ¦¬ν•˜λŠ” μ „λž΅μ— λŒ€ν•΄ μ‚΄νŽ΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€. κ°„λ‹¨ν•œ window.scrollTo λ©”μ„œλ“œ ν˜ΈμΆœμ—μ„œλΆ€ν„° μ»€μŠ€ν…€ μ»΄ν¬λ„ŒνŠΈλ₯Ό ν†΅ν•œ μ „μ—­ κ΄€λ¦¬κΉŒμ§€, 상황에 λ§žλŠ” 졜적의 방법을 μ„ νƒν•˜μ—¬ μ μš©ν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€.

    μ‹€λ¬΄μ—μ„œλŠ” λΌμš°ν„° 버전, μ„±λŠ₯ μ΅œμ ν™”, μ‚¬μš©μž κ²½ν—˜ 등을 μ’…ν•©μ μœΌλ‘œ κ³ λ €ν•˜μ—¬ 슀크둀 μ΄ˆκΈ°ν™” λ‘œμ§μ„ 섀계해야 ν•©λ‹ˆλ‹€. λ˜ν•œ, λ‹¨μˆœνžˆ μŠ€ν¬λ‘€μ„ μ΄ˆκΈ°ν™”ν•˜λŠ” κ²ƒλΏλ§Œ μ•„λ‹ˆλΌ, λͺ¨λ‹¬ μ°½μ΄λ‚˜ νŠΉμ • νŽ˜μ΄μ§€μ˜ 슀크둀 μƒνƒœλ₯Ό κ΄€λ¦¬ν•˜λŠ” λ“±μ˜ 좔가적인 UX κ°œμ„  μš”μ†Œλ₯Ό ν•¨κ»˜ κ³ λ €ν•˜λŠ” 것이 λ°”λžŒμ§ν•©λ‹ˆλ‹€. 이번 ν¬μŠ€νŒ…μ„ 톡해 SPA 개발 ν™˜κ²½μ—μ„œ 슀크둀 κ΄€λ¦¬μ˜ μ€‘μš”μ„±κ³Ό κ΅¬ν˜„ 방법을 μΆ©λΆ„νžˆ μ΄ν•΄ν•˜μ‹œμ–΄, 보닀 완성도 높은 μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ΅¬μΆ•ν•˜μ‹œκΈΈ λ°”λžλ‹ˆλ‹€.

    React 기반의 SPA ν”„λ‘œμ νŠΈμ—μ„œ νŽ˜μ΄μ§€ 이동 μ‹œ μŠ€ν¬λ‘€μ„ 항상 μ΅œμƒλ‹¨μœΌλ‘œ μœ μ§€ν•¨μœΌλ‘œμ¨ μ‚¬μš©μžμ—κ²Œ 직관적이고 κΉ”λ”ν•œ ν™”λ©΄ μ „ν™˜μ„ μ œκ³΅ν•  수 있으며, μ΄λŠ” 결과적으둜 μ›Ήμ‚¬μ΄νŠΈμ˜ μ „λ°˜μ μΈ ν’ˆμ§ˆκ³Ό μ‚¬μš©μžμ˜ λ§Œμ‘±λ„λ₯Ό λ†’μ΄λŠ” 데 크게 κΈ°μ—¬ν•  κ²ƒμž…λ‹ˆλ‹€.

    λ°˜μ‘ν˜•

    λŒ“κΈ€