# [[Single Page Applications (SPAs)]] ## ๐Ÿ“Œ Brief Summary ์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. (์ œ๊ณต๋œ ์†Œ์Šค์—์„œ๋Š” SPA์˜ ๊ฐœ๋…์„ ์ง์ ‘์ ์œผ๋กœ ์ •์˜ํ•˜๊ฑฐ๋‚˜ ์„ค๋ช…ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ํŠน์ • ์ปดํฌ๋„ŒํŠธ ์ˆ˜๋ช… ์ฃผ๊ธฐ์—์„œ์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฌธ์ œ [1]๋‚˜ React ์•ฑ ๊ตฌ์กฐ์— ๊ด€ํ•œ ์ฐธ์กฐ ๋ฌธ์„œ ์ œ๋ชฉ [2]์œผ๋กœ๋งŒ ๊ฐ„๋žตํžˆ ์–ธ๊ธ‰๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.) ## ๐Ÿ“– Core Content ์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. ## โš–๏ธ Trade-offs & Caveats ์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. ## ๐Ÿ”— Knowledge Connections ### Related Concepts #### [๊ด€๊ณ„ ์œ ํ˜• A (์„ฑ๋Šฅ ๋ฐ ๋””๋ฒ„๊น…)] - [[Memory Leaks]] - ์—ฐ๊ฒฐ ์ด์œ : ์†Œ์Šค์—์„œ SPA ํ™˜๊ฒฝ์˜ ํŠน์ • ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ ๋ฐ ์ปดํฌ๋„ŒํŠธ ์ˆ˜๋ช… ์ฃผ๊ธฐ ๋™์•ˆ ๋ฐœ์ƒํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ•ต์‹ฌ์ ์ธ ์„ฑ๋Šฅ ๋ฌธ์ œ๋กœ ๋‹ค๋ฃจ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [1]. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: SPA ๋‚ด๋ถ€์—์„œ DOM ๋…ธ๋“œ๊ฐ€ ๋ฌธ์„œ์—์„œ ์ œ๊ฑฐ๋˜์—ˆ์Œ์—๋„ JavaScript์—์„œ ์ฐธ์กฐ๋˜์–ด ๋‚จ์•„์žˆ๋Š” ํ˜„์ƒ(Detached DOM Nodes), ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋ˆ„์ , ํด๋กœ์ € ์ฐธ์กฐ ๋“ฑ SPA๊ฐ€ ์žฅ์‹œ๊ฐ„ ์‹คํ–‰๋  ๋•Œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์†๋„๋ฅผ ๋Šฆ์ถ”๊ณ  ์ถฉ๋Œ์„ ์ผ์œผํ‚ค๋Š” ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 3]. #### [๊ด€๊ณ„ ์œ ํ˜• B (์•„ํ‚คํ…์ฒ˜ ๋ฐ ๊ธฐ๋ฐ˜ ๊ธฐ์ˆ )] - [[React Architecture]] - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€๊ทœ๋ชจ SPA ๊ตฌ์ถ•์— ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ตฌ์กฐ์  ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๊ณ  ํ™•์žฅ์„ฑ์„ ํ™•๋ณดํ•˜๊ธฐ ์œ„ํ•œ ์„ค๊ณ„ ๋ฐฉ๋ฒ•๋ก ์ด ์†Œ์Šค์˜ ์ฃผ์š” ๋‚ด์šฉ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [4-6]. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: SPA ์‹œ์Šคํ…œ์„ ๋‹จ์ˆœํžˆ ๊ธฐ์ˆ ์  ํŒŒ์ผ ํƒ€์ž…(components, hooks ๋“ฑ)์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด, ๋น„์ฆˆ๋‹ˆ์Šค ๊ธฐ๋Šฅ(Features)๊ณผ ๋„๋ฉ”์ธ ์Šค์ฝ”ํ”„๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” Feature-Sliced Design(FSD)๊ณผ ๊ฐ™์€ ํ”„๋ก ํŠธ์—”๋“œ ์„ค๊ณ„ ์›์น™์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5, 7, 8]. ### Deeper Research Questions - SPA ์ปดํฌ๋„ŒํŠธ์˜ ์ˆ˜๋ช… ์ฃผ๊ธฐ(lifecycle) ๋™์•ˆ ๋ฐœ์ƒํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์˜ ๊ตฌ์ฒด์ ์ธ ํŒจํ„ด(์˜ˆ: ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋ˆ„์ , ํด๋กœ์ € ์ฐธ์กฐ ๋“ฑ)์„ ์–ด๋–ป๊ฒŒ ํšจ๊ณผ์ ์œผ๋กœ ์ถ”์ ํ•˜๊ณ  ํ”„๋ ˆ์ž„์›Œํฌ๋ณ„(React, Vue ๋“ฑ)๋กœ ์–ด๋–ป๊ฒŒ ์˜ˆ๋ฐฉํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? [1, 9] - ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๋Œ€๊ทœ๋ชจ SPA๋ฅผ ๊ตฌ์ถ•ํ•  ๋•Œ, ๊ธฐ์ˆ ์  ์—ญํ•  ๊ธฐ๋ฐ˜์˜ ๋ถ„๋ฆฌ(MVC)๊ฐ€ ์•„๋‹Œ ๊ธฐ๋Šฅ(Feature) ๊ธฐ๋ฐ˜์˜ ๊ณ„์ธตํ˜• ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ(FSD)๋ฅผ ์ฑ„ํƒํ•จ์œผ๋กœ์จ ์–ป๋Š” ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ์˜์กด์„ฑ ๊ด€๋ฆฌ์˜ ์ด์ ์€ ๋ฌด์—‡์ธ๊ฐ€? [5, 8, 10, 11] - SPA์—์„œ ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ๊ธฐ๋ณธ Context API๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง ๋ฌธ์ œ๋ฅผ Zustand๋‚˜ Redux ๊ฐ™์€ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•˜๋Š”๊ฐ€? [12, 13] - SPA์˜ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ณ  ์ดˆ๊ธฐ ๋กœ๋”ฉ ์„ฑ๋Šฅ(LCP, FCP ๋“ฑ)์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒฝ๋กœ ๊ธฐ๋ฐ˜์˜ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…(Code Splitting)๊ณผ ์ง€์—ฐ ๋กœ๋”ฉ(Lazy Loading) ์ „๋žต์€ ์‹ค์ œ ๋นŒ๋“œ ๋„๊ตฌ(Vite ๋“ฑ) ํ™˜๊ฒฝ์—์„œ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„๋˜๋Š”๊ฐ€? [14-16] - SPA์™€ ๋Œ€๋น„๋˜๋Š” SSR(Server Side Rendering) ๋˜๋Š” Native ๋ชจ๋ฐ”์ผ ์•ฑ ๊ตฌ์กฐ๋Š” ์–ด๋– ํ•œ ํ”„๋กœ์ ํŠธ ์š”๊ตฌ์‚ฌํ•ญ์— ๋”ฐ๋ผ ์„ ํƒ๋˜์–ด์•ผ ํ•˜๋Š”๊ฐ€? [2] ### Practical Application Contexts - **Implementation:** SPA ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ๋งˆ์šดํŠธ(unmount)๋  ๋•Œ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋‚˜ ๊ตฌ๋…(subscription)์ด ์ œ๋Œ€๋กœ ์ œ๊ฑฐ๋˜์ง€ ์•Š์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ์ง€์†์ ์œผ๋กœ ๋ˆ„์ ๋˜๋ฏ€๋กœ, React์˜ ๊ฒฝ์šฐ `useEffect`์˜ ๋ฐ˜ํ™˜(cleanup) ํ•จ์ˆ˜์—์„œ ์ ์ ˆํ•œ ์ •๋ฆฌ ์ž‘์—…์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [1, 9, 17]. - **System Design:** ๋Œ€๊ทœ๋ชจ SPA ์‹œ์Šคํ…œ ์„ค๊ณ„ ์‹œ Feature-Sliced Design(FSD) ์›์น™์„ ๋„์ž…ํ•˜์—ฌ, ๊ฐ ๊ธฐ๋Šฅ(Feature)์ด ๋ช…ํ™•ํ•œ ํผ๋ธ”๋ฆญ API(`index.ts`)๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์™ธ๋ถ€ ๋ชจ๋“ˆ๊ณผ ํ†ต์‹ ํ•˜๋„๋ก ์บก์Аํ™”ํ•จ์œผ๋กœ์จ ๋ชจ๋“ˆ ๊ฐ„ ๊ฒฐํ•ฉ๋„(Coupling)๋ฅผ ๋‚ฎ์ถ”๊ณ  ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [18-20]. - **Operation / Maintenance:** ์šด์˜ ์ค‘์ธ SPA์—์„œ ์‚ฌ์šฉ ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง์— ๋”ฐ๋ผ ์„ฑ๋Šฅ์ด ์ง€์†์ ์œผ๋กœ ์ €ํ•˜๋˜๊ฑฐ๋‚˜ ๋ธŒ๋ผ์šฐ์ € ํƒญ์ด ๋ฉˆ์ถ”๋Š” ํ˜„์ƒ์ด ๋ณด๊ณ ๋  ๊ฒฝ์šฐ, Chrome DevTools์˜ Heap Snapshot์ด๋‚˜ Allocation Timeline์„ ํ™œ์šฉํ•ด ์ ์ง„์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์ฐพ์•„ ๋””๋ฒ„๊น…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [21-23]. - **Learning Path:** ์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. - **My Project Relevance:** ์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. ### Adjacent Topics - [[Feature-Sliced Design (FSD)]] - ํ™•์žฅ ๋ฐฉํ–ฅ: SPA๊ฐ€ ๋น„๋Œ€ํ•ด์งˆ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๊ตฌ์กฐ์  ๋ณต์žก์„ฑ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, ๊ณ„์ธต(Layer), ์Šฌ๋ผ์ด์Šค(Slice), ์„ธ๊ทธ๋จผํŠธ(Segment)๋กœ ์ฝ”๋“œ๋ฅผ ๋‚˜๋ˆ„๊ณ  ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ์„ ๊ฐ•์ œํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก  ํƒ๊ตฌ [5, 7]. - [[React Performance Optimization]] - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋Œ€๊ทœ๋ชจ SPA์—์„œ ๋นˆ๋ฒˆํ•˜๊ฒŒ ์ผ์–ด๋‚˜๋Š” ๋ Œ๋”๋ง ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•œ `React.memo`, `useCallback`, ๊ฐ€์ƒํ™”(Virtualization), ๊ทธ๋ฆฌ๊ณ  React Compiler๋ฅผ ํ™œ์šฉํ•œ ๋นŒ๋“œ ํƒ€์ž„ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ธฐ๋ฒ• ํ•™์Šต [24-26]. - [[State Management Libraries]] - ํ™•์žฅ ๋ฐฉํ–ฅ: SPA ๋‚ด์—์„œ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด Context API, Zustand, Redux์˜ ์•„ํ‚คํ…์ฒ˜์  ์ฐจ์ด์™€ ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ์— ๋”ฐ๋ฅธ ์˜ฌ๋ฐ”๋ฅธ ๋„๊ตฌ ์ฑ„ํƒ ๊ธฐ์ค€ ๋น„๊ต [27-29]. --- *Last updated: 2026-04-30*