fix(ux): 페이지 이동 시 스크롤 맨 위로 (ScrollToTop)

SPA 특성상 라우트가 바뀌어도 스크롤 위치가 유지돼, 강좌 목록을 내려가
강좌를 클릭하면 강좌 페이지가 중간부터 보이던 불편.
useLocation의 pathname 변화 시 window.scrollTo(0,0). App 최상단에 배치.

검증: 학습센터 3000px 스크롤 후 React Native 클릭 → 강좌 페이지 스크롤 0 확인.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
AWESOMEDEV 2026-07-17 15:43:22 +09:00
parent 4d5c6d2e2b
commit d9bd1a55c6
2 changed files with 30 additions and 2 deletions

View File

@ -8,6 +8,7 @@ import { Routes, Route, NavLink, Navigate, Outlet } from 'react-router-dom';
import { useAuth } from './AuthContext';
import { ALL_COURSES } from './courseCatalog';
import CourseShell from './components/CourseShell';
import ScrollToTop from './components/ScrollToTop';
import LoginPage from './pages/LoginPage';
import SignupPage from './pages/SignupPage';
import FindAccountPage from './pages/FindAccountPage';
@ -121,7 +122,10 @@ function Layout() {
export default function App() {
return (
<Routes>
<>
{/* 주소가 바뀔 때마다 화면을 맨 위로 — 강좌를 클릭하면 페이지 처음부터 보이게. */}
<ScrollToTop />
<Routes>
{/* : ·· .
학습 포인트: 라우트들은 RequireAuth 바깥에 있어서 세션 없이도 열린다.
당연한 얘기 같지만, 회원가입 페이지가 "로그인해야 접근 가능"하면 아무도 가입할 없다. */}
@ -163,6 +167,7 @@ export default function App() {
</Route>
{/* 그 외 주소는 대시보드로 */}
<Route path="*" element={<Navigate to="/" replace />} />
</Routes>
</Routes>
</>
);
}

View File

@ -0,0 +1,23 @@
// : () .
//
// SPA( ) .
// " " .
// React SPA " ".
// ,
// .
//
// : (pathname) useEffect window .
// (null ) " " .
import { useEffect } from 'react';
import { useLocation } from 'react-router-dom';
export default function ScrollToTop() {
const { pathname } = useLocation();
// pathname . ( )
useEffect(() => {
window.scrollTo(0, 0);
}, [pathname]);
return null;
}