SPA
Single Page Application
페이지 새로고침 없이 동작하는 웹 애플리케이션. React, Vue, Angular로 구현.
Single Page Application
페이지 새로고침 없이 동작하는 웹 애플리케이션. React, Vue, Angular로 구현.
SPA(Single Page Application)는 하나의 HTML 페이지에서 JavaScript를 통해 동적으로 콘텐츠를 변경하는 웹 애플리케이션 아키텍처입니다. 전통적인 MPA(Multi Page Application)와 달리 페이지 전환 시 전체 페이지를 새로 로드하지 않고, 필요한 데이터만 서버에서 가져와 DOM을 업데이트합니다.
SPA의 핵심은 클라이언트 사이드 라우팅입니다. History API를 사용하여 URL을 변경하면서도 페이지 새로고침 없이 뷰를 전환합니다. 이를 통해 네이티브 앱과 유사한 부드러운 사용자 경험을 제공하며, 페이지 간 상태 유지가 용이합니다.
React, Vue, Angular, Svelte 등의 프레임워크가 SPA 개발에 널리 사용됩니다. 이들은 Virtual DOM이나 반응형 시스템을 통해 효율적인 UI 업데이트를 지원하며, 컴포넌트 기반 아키텍처로 코드 재사용성을 높입니다.
SPA의 단점으로는 초기 로딩 시간이 길고 SEO에 불리하다는 점이 있습니다. 이를 보완하기 위해 코드 스플리팅, 프리렌더링, SSR과의 하이브리드 방식(Next.js, Nuxt 등)이 발전했습니다.
// React Router를 사용한 SPA 라우팅
import { BrowserRouter, Routes, Route, Link, useNavigate } from 'react-router-dom';
// 라우터 설정
function App() {
return (
<BrowserRouter>
<nav>
<Link to="/">홈</Link>
<Link to="/about">소개</Link>
<Link to="/products">제품</Link>
</nav>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
<Route path="/products" element={<Products />} />
<Route path="/products/:id" element={<ProductDetail />} />
<Route path="*" element={<NotFound />} />
</Routes>
</BrowserRouter>
);
}
// 동적 네비게이션
function ProductCard({ product }) {
const navigate = useNavigate();
const handleClick = () => {
navigate(`/products/${product.id}`, {
state: { fromList: true }
});
};
return (
<div onClick={handleClick}>
<h3>{product.name}</h3>
</div>
);
}
// 코드 스플리팅으로 번들 최적화
import { lazy, Suspense } from 'react';
const AdminDashboard = lazy(() => import('./AdminDashboard'));
function App() {
return (
<Suspense fallback={<Loading />}>
<Routes>
<Route path="/admin/*" element={<AdminDashboard />} />
</Routes>
</Suspense>
);
}
기술 미팅에서:
"마케팅팀에서 SEO 때문에 걱정하시던데, 저희 SPA에 SSR 적용해서 해결하죠. Next.js로 마이그레이션하면 기존 React 코드 대부분 재사용 가능합니다."
기술 면접에서:
"SPA의 장단점을 설명해주세요." - "장점은 앱 같은 UX와 빠른 페이지 전환입니다. 단점은 초기 로딩과 SEO인데, 코드 스플리팅과 SSR/SSG 하이브리드로 보완합니다."
코드 리뷰에서:
"이 페이지는 거의 정적인데 굳이 클라이언트에서 렌더링할 필요 없을 것 같아요. getStaticProps로 빌드 타임에 생성하면 성능 훨씬 좋아질 거예요."
원인: 대규모 JavaScript 번들(2MB+)로 인해 3G 환경에서 초기 로딩 10초 이상
영향: 모바일 사용자 이탈률 급증, 개발도상국 시장 진입 실패
해결: Server Components 도입, 적극적인 코드 스플리팅, Critical CSS 인라이닝
교훈: 번들 크기 예산(Budget) 설정, 성능 모니터링 CI 파이프라인 통합
원인: 클라이언트 사이드 렌더링만 사용, 크롤러가 콘텐츠 인식 불가
영향: Google 검색 결과에서 사라짐, 유기적 트래픽 급감
해결: Next.js로 마이그레이션하여 SSR/SSG 하이브리드 적용
교훈: 콘텐츠 사이트는 반드시 SSR/SSG 고려, 앱 성격에 따라 렌더링 전략 선택
Q1. SPA에서 페이지 전환 시 전체 페이지 새로고침 없이 동작하는 핵심 기술은?
Q2. SPA의 주요 단점을 해결하기 위한 방법으로 적절하지 않은 것은?
Q3. React에서 코드 스플리팅을 구현하는 방법은?
이 페이지에 오류가 있거나 추가하고 싶은 내용이 있다면 알려주세요!