SPA (Single Page Application)

1. ๊ฐœ์š”

์›น ํ”„๋ก ํŠธ์•ค๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋Š” React, Vue, Angular๋Š” SPA(Single Page Application)์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด SPA๋Š” ๋ฌด์—‡์ผ๊นŒ? SPA๋ฅผ ๊ณผ๊ฑฐ์˜ ์›น ํŽ˜์ด์ง€ ํ˜•ํƒœ(MPA, Multi Page Application)์™€ ๋น„๊ตํ•˜๋ฉฐ SPA์˜ ํŠน์ง•๊ณผ ์žฅ์  ๋ฐ ๋‹จ์ ์„ ์‚ดํŽด๋ณด์ž.


2. SPA์ด์ „์˜ MPA (Multi Page Application)

MPA ๋™์ž‘ ๋ฐฉ์‹

MPA๋Š” ์ „ํ†ต์ ์ธ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ ๋ฐฉ์‹์ด๋‹ค. ์ด๋Ÿฌํ•œ ๊ตฌ์กฐ๋Š” jsp, ํ˜น์€ php ๋“ฑ๊ณผ ๊ฐ™์€ ์›น ์„œ๋ฒ„ ์–ธ์–ด๋กœ ๊ตฌ์ถ•๋œ ์›น์‚ฌ์ดํŠธ์—์„œ ๋งŽ์ด ๋ณด์ธ๋‹ค. ์›น ๋ธŒ๋ผ์šฐ์ €(Client)์—์„œ ํŠน์ • ํŽ˜์ด์ง€๋ฅผ ์š”์ฒญ์„ ์„œ๋ฒ„์— ๋ณด๋‚ด๋ฉด, ์„œ๋ฒ„๋Š” ๋ฐ์ดํ„ฐ๋ฅผ HTML ๋ฌธ์„œ๋กœ ์›น ๋ธŒ๋ผ์šฐ์ €(Client)์—๊ฒŒ ๋ณด๋‚ธ๋‹ค. ์„œ๋ฒ„์—์„œ HTML ๋ฌธ์„œ๋ฅผ ๋ณด๋‚ผ ๋•Œ ๋งˆ๋‹ค ์ „์ฒด ํŽ˜์ด์ง€๊ฐ€ ๋‹ค์‹œ ๋ถˆ๋Ÿฌ์™€์ง€๋ฏ€๋กœ ํ™”๋ฉด์€ ๊นœ๋นก๊ฑฐ๋ฆฌ๊ฒŒ ๋œ๋‹ค. ์ด๋Š” ์›น ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ์‚ฌ์šฉ์ž์˜ ์ž…์žฅ์—์„œ๋Š” ์ข‹์ง€ ์•Š๋Š” ๊ฒฝํ—˜์ผ ๊ฒƒ์ด๋‹ค. ๋งŒ์•ฝ ๋ถˆ๋Ÿฌ์˜ค๊ฒŒ ๋˜๋Š” ๋ฐ์ดํ„ฐ์˜ ์–‘์ด ๋งŽ๋‹ค๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ๋ชจ๋‘ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ ๊นŒ์ง€ ์šฐ๋ฆฌ๊ฐ€ ๋ณผ ์ˆ˜ ์žˆ๋Š” ํŽ˜์ด์ง€๋Š” ์•„๋ฌด๊ฒƒ๋„ ์—†๋Š” ํฐ ํŽ˜์ด์ง€์ด๋‹ค.

๋˜ํ•œ ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ๊ฐ€ ์„œ๋กœ ๋ฐ€์ ‘ํ•ด๊ฒŒ ์—ฐ๊ด€๋˜์–ด ๊ฐœ๋ฐœ์ด ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ MPA์—๋„ ์žฅ์ ์ด ์žˆ๋‹ค.

  • SEO ์นœํ™”์ : ์™„์„ฑ๋œ ํ˜•ํƒœ์˜ HTMLํŒŒ์ผ์„ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ๋„ค์ด๋ฒ„๋‚˜ ๊ตฌ๊ธ€ ๊ฐ™์€ ๊ฒ€์ƒ‰ ์‚ฌ์ดํŠธ์— ๋…ธ์ถœ๋˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•œ ์›น์‚ฌ์ดํŠธ๋ผ๋ฉด MPA ๊ตฌ์กฐ์˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ ํ•ฉํ•˜๋‹ค.

    SEO(๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™”)๋Š” ์›น์‚ฌ์ดํŠธ๊ฐ€ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์— ๋” ์ž˜ ๋ณด์ด๋„๋ก ์ตœ์ ํ™” ํ•˜๋Š” ๊ณผ์ •์ด๋‹ค. hํƒœ๊ทธ, ๋ฉ”ํƒ€ํƒœ๊ทธ, ์ด๋ฏธ์ง€ ์ตœ์ ํ™”, ์ฝ˜ํ…์ธ  ์ตœ์ ํ™”, ๊ธ€์ž์˜ ์ˆ˜, ๋‚ด๋ถ€๋งํฌ๋“ฑ์˜ ์š”์†Œ๋ฅผ ์ž‘์—…ํ•˜์—ฌ ๊ฒ€์ƒ‰ ์—”์ง„์„ ์ตœ์ ํ™” ํ•œ๋‹ค. ์ฐธ๊ณ  - ๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™”

  • ๋งค์šฐ ์งง์€ ์ฒซ ๋กœ๋”ฉ: ์„œ๋ฒ„์—์„œ ์ด๋ฏธ ๋žœ๋”๋งํ•˜์—ฌ ๊ฐ€์ ธ์˜ค๊ธฐ ๋•Œ๋ฌธ, ํ•˜์ง€๋งŒ Client๊ฐ€ JSํŒŒ์ผ์„ ๋ชจ๋‘ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์ ์šฉํ•˜๊ธฐ ์ „ ๊นŒ์ง€๋Š” ๊ฐ๊ฐ์˜ ๊ธฐ๋Šฅ์€ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค.


3. SPA์˜ ๋“ฑ์žฅ ๋ฐฐ๊ฒฝ

  1. ์„œ๋ฒ„์˜ ๋ถ€ํ•˜

    • ๊ณผ๊ฑฐ์˜ ์›น ํŽ˜์ด์ง€์—์„œ ๋ธŒ๋ผ์šฐ์ €๋Š” ํ™”๋ฉด์„ ๋ณด์—ฌ์ฃผ๊ธฐ๋งŒ ํ•  ๋ฟ์ด๋‹ค. ์š”์ฒญํ•œ ์›น ๋ฌธ์„œ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋Š” ์ „๋ถ€ ์„œ๋ฒ„์—์„œ ๋‹ด๋‹นํ•˜๊ธฐ ํŽ˜์ด์ง€๋ฅผ ์š”์ฒญํ•  ๋•Œ ๋งˆ๋‹ค ์„œ๋ฒ„์— ๋ถ€ํ•˜๊ฐ€ ์ƒ๊ฒผ๋‹ค.

    • SPA๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํ•„์š”ํ•œ ์ •์  ๋ฆฌ์†Œ์Šค(Html, Css, Javascript)๋ฅผ ์ตœ์ดˆ ์ ‘๊ทผ ์‹œ ๋‹จ ํ•œ ๋ฒˆ๋งŒ ๋‹ค์šด๋กœ๋“œํ•œ๋‹ค. ์ดํ›„ ์„œ๋ฒ„๋Š” ๋ธŒ๋ผ์šฐ์ €์— ํ•„์š”ํ•œ ์ •๋ณด์— ๋Œ€ํ•œ ์š”์ฒญ(Ajax)์ด ์˜ค๋ฉด ์‘๋‹ต(Json)๋งŒ ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„์— ๋ถ€ํ•˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

  2. ๋ชจ๋ฐ”์ผ ์ตœ์ ํ™”

    • ์˜จ๋ผ์ธ ์„ธ์ƒ์—์„œ ๋ชจ๋ฐ”์ผ์˜ ์ค‘์š”์„ฑ์ด ์ปค์ง€๋ฉด์„œ ๋ชจ๋ฐ”์ผ ์ตœ์ ํ™”์— ๋Œ€ํ•œ ๋‹ˆ์ฆˆ๋ฅผ ์ถฉ์กฑํ•ด์•ผ ํ•œ๋‹ค. ๋ชจ๋ฐ”์ผ ์›น์ด MPA ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„๋๋‹ค๋ฉด, ์ˆ˜๋งŽ์€ ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ•  ๋•Œ, ํŽ˜์ด์ง€๋ฅผ ๋ฆฌ๋žœ๋”๋ง ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(UX)์ด ๊ฐ์†Œํ•  ๊ฒƒ์ด๋‹ค.

    • SPA์—์„œ๋Š” ์ˆ˜์ •๋œ ๋ถ€๋ถ„๋งŒ ๋ Œ๋”๋ง ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๊ธฐ์กด์˜ ์›น ํŽ˜์ด์ง€๋ณด๋‹ค UX๊ฐ€ ํ–ฅ์ƒ๋œ๋‹ค.


4. SPA

SPA ์ž‘๋™ ๋ฐฉ์‹

SPA๋Š” ํ•œ ๊ฐœ(Single)์˜ Page๋กœ ๊ตฌ์„ฑ๋œ Application์œผ๋กœ ์ตœ์ดˆ ๋‹จ ํ•œ ๋ฒˆ๋งŒ ๋ฆฌ์†Œ์Šค(HTML, CSS, Javascript)๋ฅผ ๋กœ๋”ฉํ•˜๊ณ  ์ดํ›„์—๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ฌ ๋•Œ๋งŒ ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•œ๋‹ค.

์ตœ์ดˆ ๋กœ๋”ฉ ๋•Œ ์‹คํ–‰ํ•œ HTMLํŒŒ์ผ์—์„œ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„์€ ๊ทธ๋Œ€๋กœ ๋‘๊ณ  ๋ณ€๊ฒฝ๋˜๋Š” ๋ถ€๋ถ„๋งŒ ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜์—ฌ ํšจ์œจ์ ์ธ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด๋Š” SPA์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์ด๋ฉฐ ์ƒˆ๋กœ๊ณ ์นจ์ด ๋˜์ง€ ์•Š๊ณ  ๋ณ€๊ฒฝ๋œ๋‹ค๋Š” ์ ์—์„œ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ข‹์€ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•ด ์ค„ ์ˆ˜ ์žˆ๋‹ค.

React, Vue, Angular๋“ฑ์˜ ํ”„๋ก ํŠธ์•ค๋“œ ๊ธฐ์ˆ ๋“ค์ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๋ฐฉ์‹์ด๋‹ค.


5. SPA์˜ ์žฅ์ ๊ณผ ๋‹จ์ 

5-1. SPA์˜ ์žฅ์ 

  1. ์ž์—ฐ์Šค๋Ÿฌ์šด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(UX): ๊นœ๋นก๊ฑฐ๋ฆผ์ด ์—†๋‹ค

  2. ํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค๋งŒ ๋ถ€๋ถ„์ ์œผ๋กœ ๋กœ๋”ฉ

  3. ์ปดํฌ๋„ŒํŠธ๋ณ„ ๊ฐœ๋ฐœ ์šฉ์ด

  4. ๋ชจ๋ฐ”์ผ ์•ฑ ๊ฐœ๋ฐœ์„ ์—ผ๋‘์— ๋‘”๋‹ค๋ฉด ๋™์ผํ•œ API๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค๊ณ„ ๊ฐ€๋Šฅ


5-2. SPA์˜ ๋‹จ์ 

  1. ๋А๋ฆฐ ์ดˆ๊ธฐ ๊ตฌ๋™ ์†๋„: JavaScript ํŒŒ์ผ์„ ๋ฒˆ๋“ค๋งํ•ด์„œ ํ•œ ๋ฒˆ์— ๋ฐ›๊ธฐ ๋•Œ๋ฌธ

  2. SEO(๊ฒ€์ƒ‰์—”์ง„์ตœ์ ํ™”)์˜ ์–ด๋ ค์›€: SSR๋กœ ํ•ด๊ฒฐ ๊ฐ€๋Šฅ

  3. ๋ณด์•ˆ ์ด์Šˆ: CSR๋ฐฉ์‹์˜ SPA์—์„œ๋Š” ํด๋ผ์ด์–ธํŠธ์ธก์˜ ์ฟ ํ‚ค๋ง๊ณ ๋Š” ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ €์žฅํ•  ๊ณต๊ฐ„์ด ๋งˆ๋•…์น˜ ์•Š์Œ, SSR์—์„œ๋Š” ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์„œ๋ฒ„์ธก์—์„œ ์„ธ์…˜์œผ๋กœ ๊ด€๋ฆฌ

CSR๊ณผ SSR์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ค๋ฅธ ์ฑ•ํ„ฐ์—์„œ ๋‹ค๋ฃฌ๋‹ค.


6. MPA vs SPA

SPA vs MPA

์š”์ฆ˜ ๊ธฐ์—…๋“ค์˜ ๋Œ€๋ถ€๋ถ„์€ SPA๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค ๊ทธ๋ ‡๋‹ค๋ฉด SPA๊ฐ€ ๋ฌด์กฐ๊ฑด MPA๋ณด๋‹ค ์ข‹๊ณ  ์›น ๊ฐœ๋ฐœ์„ ํ•  ๋•Œ์— SPA๋งŒ ์‚ฌ์šฉํ•ด์•ผ๋งŒ ํ• ๊นŒ? ๊ทธ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ๊ฐ๊ฐ์˜ ์žฅ์ ์„ ์ž˜ ๋น„๊ตํ•ด์„œ ์ƒํ™ฉ์— ๋งž๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ฐœ๋ฐœ์„ ํ•ด์•ผ ํ•œ๋‹ค.

๊ณ ๋ คํ•ด์•ผ ํ•  ์ 

  • ๋กœ๋”ฉ ์†๋„์˜ ์ฐจ์ด

  • ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ์˜ ์ƒํ˜ธ ์˜์กด์„ฑ

  • SEO

  • ์œ ์ € ๊ฒฝํ—˜์„ฑ(UX)

  • ๋ณด์™„์„ฑ

  • ๊ฐœ๋ฐœ ์ฒ˜๋ฆฌ ์†๋„

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์˜์กด์„ฑ


7. Conclusion

html, css, js๋งŒ ๋ฐฐ์šฐ๋‹ค๊ฐ€ ์ฒ˜์Œ react๋ฅผ ๋ฐฐ์šธ ๋•Œ๊ฐ€ ์ƒ๊ฐ์ด๋‚œ๋‹ค. ๋ถ€ํ’ˆ์„ ์กฐ๋ฆฝํ•˜์—ฌ ์žฅ๋‚œ๊ฐ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค์–ด ํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐ€์ ธ์™€ ์—ฌ๋Ÿฌ ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์ด ๋„ˆ๋ฌด ์žฌ๋ฐŒ๊ณ  ์‹ ์„ ํ•ด์„œ ์ง€๊ธˆ๊นŒ์ง€ ๊ณต๋ถ€ํ•˜๊ณ  ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ 'MPA๋ณด๋‹ค๋Š” SPA๋ฐฉ์‹์ด ๋” ์ข‹์€ ๊ฒƒ์ด๋‹ค'๋ผ๊ณ  ์ƒ๊ฐ์„ ํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ SPA์— ๋Œ€ํ•ด ์ •๋ฆฌ๋ฅผ ํ•˜๋‹ค๋ณด๋‹ˆ ๊ผญ ๊ทธ๋ ‡์ง€๋Š” ์•ˆ์•˜๋‹ค. ๋‹จ์ ๋„ ๋ถ„๋ช… ์กด์žฌํ•˜๊ณ  ์ด๋ฅผ ๋ณด์•ˆํ•  ์ˆ˜ ์žˆ๋Š” SSR๋„ ์žˆ์–ด ์ดํ›„์—๋Š” SSR๊ณผ CSR์— ๋Œ€ํ•ด ์ •๋ฆฌํ•˜๊ณ ์ž ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์šฉ์–ด์กฐ์ฐจ ์ œ๋Œ€๋กœ ์•Œ์ง€ ๋ชปํ•˜๊ณ  ์ง€๋‚ด์™”๋˜ ๊ฒƒ์— ๋Œ€ํ•ด ๋ฐ˜์„ฑํ•˜์ž. ๋Œ€์ถฉ ๋“ค์–ด๋งŒ ๋ดค์ง€ ์ •ํ™•ํžˆ ์–ด๋–ค ๊ฐœ๋…์ธ์ง€ ๋ชจ๋ฅด๋Š” ์šฉ์–ด๊ฐ€ ๋งŽ๋‹ค.๐Ÿ˜ญ


์ฐธ๊ณ 


๐Ÿ“… 2022-07-13

Last updated