# [[Single Page Application (SPA)]] ## ๐Ÿ“Œ Brief Summary Single Page Application(SPA)์€ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€๋ฅผ ๋กœ๋“œํ•˜๋Š” ๊ธฐ๋ณธ ๋ฐฉ์‹ ๋Œ€์‹ , ์›น ์„œ๋ฒ„์—์„œ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„ ํ˜„์žฌ ์›น ํŽ˜์ด์ง€๋ฅผ ๋™์ ์œผ๋กœ ๋‹ค์‹œ ์ž‘์„ฑํ•˜์—ฌ ์‚ฌ์šฉ์ž์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ž…๋‹ˆ๋‹ค [1]. ์ด๋Ÿฌํ•œ ์ „ํ™˜์€ JavaScript๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ ์ธก(๋ธŒ๋ผ์šฐ์ €)์—์„œ ์ด๋ฃจ์–ด์ง€๋ฉฐ, Gmail์ด๋‚˜ Spotify์™€ ๊ฐ™์ด ๋น ๋ฅด๊ณ  ์œ ๋™์ ์ธ ์•ฑ๊ณผ ๊ฐ™์€ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [1, 2]. ํ•˜์ง€๋งŒ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(CSR)์— ์˜์กดํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ ํŠน์„ฑ์ƒ ๊ฒ€์ƒ‰ ์—”์ง„ ํฌ๋กค๋Ÿฌ์™€ AI ์—์ด์ „ํŠธ๊ฐ€ ์ฝ˜ํ…์ธ ๋ฅผ ์ƒ‰์ธํ•˜๊ณ  ๋ Œ๋”๋งํ•˜๋Š” ๋ฐ ์‹ฌ๊ฐํ•œ ์–ด๋ ค์›€์„ ๊ฒช๋Š”๋‹ค๋Š” ๋‹จ์ ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค [3-5]. ## ๐Ÿ“– Core Content * **๋™์ž‘ ์›๋ฆฌ ๋ฐ ์žฅ์ :** SPA๋Š” ์ดˆ๊ธฐ ์…ธ(Shell)์ด ๋กœ๋“œ๋œ ํ›„์—๋Š” ํ™”๋ฉด ์ „ํ™˜์ด ์ฆ‰๊ฐ์ ์œผ๋กœ ๋А๊ปด์ง€๋ฉฐ, ํŽ˜์ด์ง€๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๋™์•ˆ์—๋„ ์˜ค๋””์˜ค๊ฐ€ ์ค‘๋‹จ ์—†์ด ์žฌ์ƒ๋˜๋Š” ๋“ฑ์˜ ์ƒํƒœ ์œ ์ง€(State Persistence)๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค [2]. ๋˜ํ•œ ํ”„๋ก ํŠธ์—”๋“œ(UI)์™€ ๋ฐฑ์—”๋“œ(API)๋ฅผ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค [2]. ๊ธฐ๋ณธ์ ์œผ๋กœ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(CSR) ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค [6]. * **๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™”(SEO)์˜ ์ฃผ์š” ๊ณผ์ œ:** * **๋ Œ๋”๋ง ์ง€์—ฐ (The CSR Gap):** ์ „ํ†ต์ ์ธ SPA๋Š” ๋นˆ HTML ์…ธ์„ ๋จผ์ € ๋กœ๋“œํ•œ ๋’ค JavaScript๋ฅผ ํ†ตํ•ด ์ฝ˜ํ…์ธ ๋ฅผ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค. Googlebot์€ ์ดˆ๊ธฐ HTML์„ ๋จผ์ € ์ƒ‰์ธํ•œ ๋’ค JavaScript๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๋Œ€๊ธฐ์—ด(Queue)์— URL์„ ๋ฐฐ์น˜ํ•˜๋Š” ๋‘ ๋‹จ๊ณ„(Two-wave) ์ƒ‰์ธ ๊ณผ์ •์„ ๊ฑฐ์น˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ Œ๋”๋ง ์ž์› ํ•œ๊ณ„์™€ ํƒ€์ž„์•„์›ƒ ๋“ฑ์œผ๋กœ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ๋ฐ˜์˜์ด ๋ฉฐ์น ์”ฉ ์ง€์—ฐ๋˜๊ฑฐ๋‚˜ ์ฝ˜ํ…์ธ  ๋ˆ„๋ฝ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4, 7]. * **AI ํฌ๋กค๋Ÿฌ์˜ ํ•œ๊ณ„:** AI ๋ชจ๋ธ์„ ํ›ˆ๋ จ์‹œํ‚ค๋Š” ํฌ๋กค๋Ÿฌ(์˜ˆ: GPTBot, ClaudeBot)๋Š” ๋น„์šฉ ๋ฐ ๊ทœ๋ชจ์˜ ๋ฌธ์ œ๋กœ JavaScript ์‹คํ–‰์„ ๊ฑด๋„ˆ๋›ฐ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„, ์ˆœ์ˆ˜ SPA์˜ ํ…์ŠคํŠธ๋ฅผ ์ธ์‹ํ•˜์ง€ ๋ชปํ•˜์—ฌ AI ๊ฒ€์ƒ‰ ์—”์ง„ ๊ฒฐ๊ณผ๋‚˜ ๋‹ต๋ณ€์— ์ธ์šฉ๋˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5]. * **์ฝ”์–ด ์›น ๋ฐ”์ดํƒˆ (Core Web Vitals):** ํฌ๊ณ  ๋ฌด๊ฑฐ์šด JavaScript ๋ฒˆ๋“ค์„ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ํŒŒ์‹ฑ, ์‹คํ–‰ํ•˜๋А๋ผ ๋ธŒ๋ผ์šฐ์ €์˜ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฉˆ์ถ”๋Š” 'Hydration Bloat' ํ˜„์ƒ์ด ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ ์ง€์—ฐ์„ ์ธก์ •ํ•˜๋Š” ํ•ต์‹ฌ ์ง€ํ‘œ์ธ INP(Interaction to Next Paint) ์ ์ˆ˜๋ฅผ ์•…ํ™”์‹œ์ผœ ํŽ˜๋„ํ‹ฐ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5]. * **์†Œํ”„ํŠธ 404 (Soft 404s) ๋ฌธ์ œ:** ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ๋ผ์šฐํŒ…์ด ์ฒ˜๋ฆฌ๋˜๋ฏ€๋กœ, ์กด์žฌํ•˜์ง€ ์•Š๋Š” URL์— ์ ‘์†ํ•ด๋„ ์„œ๋ฒ„๋Š” ์ •์ƒ ์ƒํƒœ(200 OK)๋กœ ๋นˆ HTML์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์ดํ›„์—์•ผ JavaScript๊ฐ€ "Not Found"๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํฌ๋กค๋Ÿฌ์—๊ฒŒ ์ฝ˜ํ…์ธ ๊ฐ€ ์–‡์€ ์œ ํšจ ํŽ˜์ด์ง€๋กœ ์ธ์‹๋˜์–ด ๋„๋ฉ”์ธ ์ „์ฒด์˜ ํ’ˆ์งˆ ์ ์ˆ˜๋ฅผ ๋–จ์–ด๋œจ๋ฆฌ๊ณ  ํฌ๋กค ์˜ˆ์‚ฐ์„ ๋‚ญ๋น„ํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค [8, 9]. * **SPA ์ตœ์ ํ™” ๋ฐ ๋ชจ๋ฒ” ์‚ฌ๋ก€:** * **์„œ๋ฒ„ ๊ธฐ๋ฐ˜ ๋ Œ๋”๋ง ๋„์ž…:** SEO์™€ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ๊ทผ๋ณธ์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ˆœ์ˆ˜ CSR ๋Œ€์‹  Server-Side Rendering(SSR), Static Site Generation(SSG), ๋˜๋Š” Incremental Static Regeneration(ISR) ๋ฐฉ์‹ ๋“ฑ์œผ๋กœ ๋ Œ๋”๋ง์˜ ์ฃผ์ฒด๋ฅผ ์„œ๋ฒ„๋‚˜ ๋นŒ๋“œ ๊ณผ์ •์œผ๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ์ด ๊ฐ•๋ ฅํžˆ ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [10-12]. * **URL ๋ฐ ๋ผ์šฐํŒ… ์„ค์ •:** ๊ฒ€์ƒ‰ ์—”์ง„์ด ๊ฐœ๋ณ„ ํŽ˜์ด์ง€๋กœ ์ƒ‰์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์‹œ ๋ผ์šฐํŒ…(`/#/about`)์„ ํ”ผํ•˜๊ณ  HTML5 History API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊น”๋”ํ•œ URL ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [13]. ๋˜ํ•œ ๋‚ด๋ถ€ ๋‚ด๋น„๊ฒŒ์ด์…˜์€ JavaScript์˜ `onClick` ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์•„๋‹Œ ํ‘œ์ค€ `` ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํฌ๋กค๋Ÿฌ๊ฐ€ ๋งํฌ๋ฅผ ์ถ”์ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [13, 14]. * **๋™์  ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ:** ํŽ˜์ด์ง€๊ฐ€ ์ „ํ™˜๋  ๋•Œ๋งˆ๋‹ค ``, ๋ฉ”ํƒ€ ์„ค๋ช…(Meta Description), ์บ๋…ธ๋‹ˆ์ปฌ(Canonical) ํƒœ๊ทธ๊ฐ€ ๋™์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. React Helmet๊ณผ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๋ Œ๋”๋ง์— ๋งž๊ฒŒ ๊ด€๋ฆฌํ•ด์•ผ SEO์—์„œ ๋ถˆ์ด์ต์„ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค [15, 16]. ## ๐Ÿ”— Knowledge Connections - **Related Topics:** [[Client-Side Rendering (CSR)]], [[Server-Side Rendering (SSR)]], [[Static Site Generation (SSG)]], [[Core Web Vitals]], [[Search Engine Optimization (SEO)]], [[Interaction to Next Paint (INP)]] - **Projects/Contexts:** [[React Router]], [[Next.js]] - **Contradictions/Notes:** ๊ฒ€์ƒ‰ ์—”์ง„ ๋ด‡์—๊ฒŒ๋Š” ์‚ฌ์ „ ๋ Œ๋”๋ง๋œ HTML์„ ์ œ๊ณตํ•˜๊ณ  ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” CSR์„ ์ œ๊ณตํ•˜๋Š” 'Dynamic Rendering(๋™์  ๋ Œ๋”๋ง)' ๊ธฐ๋ฒ•์€ ๊ณผ๊ฑฐ์— SPA์˜ ๋Œ€์•ˆ์œผ๋กœ ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ 2026๋…„ ๊ธฐ์ค€ Google์€ ์‚ฌ์šฉ์ž์™€ ๋ด‡์—๊ฒŒ ๋‹ค๋ฅธ ์ฝ˜ํ…์ธ ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ํด๋กœํ‚น(Cloaking) ์œ„ํ—˜์ด ์žˆ๋‹ค๋ฉฐ ๋ช…์‹œ์ ์œผ๋กœ ๊ถŒ์žฅํ•˜์ง€ ์•Š๊ณ  ์žˆ์œผ๋ฉฐ, SSR์ด๋‚˜ SSG๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์˜ ์ตœํ›„์˜ ์ˆ˜๋‹จ์œผ๋กœ๋งŒ ์—ฌ๊ฒจ์•ผ ํ•ฉ๋‹ˆ๋‹ค [17, 18]. --- *Last updated: 2026-04-26*