์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋งŒ์œผ๋กœ SPA ๊ตฌํ˜„
728x90

 

Today, What I learned?

ํŠน๊ฐ•์—์„œ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ด์šฉํ•˜์ง€ ์•Š๊ณ  ๋ฐ”๋‹๋ผ JS๋กœ SPA๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฒ•๊ณผ, hashed url path์— ๋Œ€ํ•ด ๋ฐฐ์› ๋‹ค!

์ดํ›„ ์ข€ ์ฐพ์•„๋ณด๋‹ˆ ์ƒ๊ฐ๋ณด๋‹ค SPA๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ธ€๊ณผ ์˜์ƒ์ด ๋งŽ์•˜๋‹ค. ๐Ÿค”

๊ฐœ์ธ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•ด๋ณด์•˜์œผ๋ฉด ์ข‹์•˜์„ ํ…๋ฐ ์‹ถ์€ ์•„์‰ฌ์›€... ๊ธฐํšŒ๊ฐ€ ๋˜๋ฉด ๋ฆฌํŒฉํ† ๋ง ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์ข‹๊ฒ ๋‹ค..

์ผ๋‹จ ์˜ค๋Š˜ ๋ฐฐ์šด ๊ฒƒ์— ๋Œ€ํ•œ ์ •๋ฆฌ ์‹œ์ž‘!

 

 

MPA์™€ SPA

์šฐ์„  ์ด ๋‘ ์ฃผ์ œ์— ๋Œ€ํ•ด์„œ๋Š” ์ด์ „์— ๋”ฐ๋กœ ์ •๋ฆฌํ•ด๋ณด์•˜๋˜ ๊ธ€์ด ์žˆ๋‹ค. (๋ถ€์กฑํ•จ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Œ)

https://i-ten.tistory.com/174

 

MPA,SPA ๋ถ€ํ„ฐ CSR, SSR ๊นŒ์ง€

๋“ค์–ด๊ฐ€๋ฉฐ ์ƒํƒœ ๊ด€๋ฆฌ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๊ธฐ๋ฅผ ๊ฒฐ์‹ฌ!.. ์–ด๋””์„œ๋ถ€ํ„ฐ ์ด๋ฏธ ๋จผ์ € ์ž‘์„ฑ๋œ ๋งŽ์€ ๊ธ€๋“ค์„ ๋‘˜๋Ÿฌ๋ณด๋‹ค ๋ณด๋‹ˆ ์Œ.. ๐Ÿคจ ๋จผ์ € ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•˜๋Š” ์ด๋ก ์ด..... ์ด ๋ถ€๋ถ„์— ๋Œ€ํ•œ ์ง€์‹์ด ์•„์ฃผ ์–•์€ ์ƒํƒœ์ธ

i-ten.tistory.com

 

 

์š”์•ฝํ•˜์ž๋ฉด MPA๋Š” ์—ฌ๋Ÿฌ ํŽ˜์ด์ง€(multi page)๋กœ ๊ตฌ์„ฑ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜.

ํ•ญ์ƒ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์™„์„ฑ๋œ HTML์„ ๋ฐ›์•„์™€ ์ƒˆ๋กœ ๋ Œ๋”๋ง ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒˆ๋กœ๊ณ ์นจ์ด ์ผ์–ด๋‚œ๋‹ค.

 

SPA๋Š” ํ•˜๋‚˜์˜ ํŽ˜์ด์ง€๋กœ ๊ตฌ์„ฑ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋ฉฐ ๋ Œ๋”๋ง์„ ์œ„ํ•œ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๋ฅผ ์ตœ์ดˆ ์ ‘๊ทผ ์‹œ ํ•œ ๋ฒˆ๋งŒ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ ,

์ดํ›„ ํ•„์š”์— ๋”ฐ๋ผ์„œ ๋น„๋™๊ธฐ ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”์ธ๋”ฉํ•ด์˜ค๋Š” ๋ฐฉ์‹์ด๋‹ค.

์ตœ์ดˆ ๋ Œ๋”๋ง ์ดํ›„ ๋ถ€๋ถ„๋ถ€๋ถ„ ๋ Œ๋”๋ง์ด ์ผ์–ด๋‚˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒˆ๋กœ๊ณ ์นจ ์—†์ด ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ๊ณผ ๊ฐ™์€ ์œ ์—ฐํ•œ UX๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ตœ์ดˆ ๋ Œ๋”๋ง์‹œ MPA์ฒ˜๋Ÿผ ์™„์„ฑ๋œ HTML์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋ณด์•ˆ๊ณผ SEO์— ์ทจ์•ฝํ•˜๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

 

 

Hashed url path , Non-hashed url path

Non-hashed url path

์ผ๋ฐ˜์ ์œผ๋กœ ์šฐ๋ฆฌ๊ฐ€ ์ž์ฃผ ๋ณด๋Š” URL์ด๋‚˜, aํƒœ๊ทธ์˜ href์— / ๋ฅผ ์ด์šฉํ•ด์„œ ๊ฒฝ๋กœ๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ณค ํ•œ๋‹ค.

https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=1&ie=utf8&query=๋Œ€ํ•œ๋ฏผ๊ตญ

์œ„์˜ ๋„ค์ด๋ฒ„ ๊ฒ€์ƒ‰๊ฒฐ๊ณผ URL ๊ฐ™์€ ๊ฒฝ์šฐ๋งŒ ๋ด๋„ ๊ทธ๋ ‡๋‹ค.
๋ธŒ๋ผ์šฐ์ €๋Š” ์ด๋ ‡๊ฒŒ /๋ฅผ ์ด์šฉํ•ด ๊ตฌ๋ถ„๋œ URL์„ ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋‚˜ ๋ฌธ์„œ๋ฅผ GET ํ•ด์™€์•ผ ํ•œ๋‹ค๊ณ  ์ธ์‹ํ•œ๋‹ค.

๊ณ ๋กœ ์œ„์™€ ๊ฐ™์ด Cannot GET /abc ๊ฐ™์€ ์—๋Ÿฌ๋ฅผ ๋งŒ๋‚  ์ˆ˜ ์žˆ๋‹ค.

๋ณดํ†ต์˜ url์€ ์„œ๋ฒ„์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ƒˆ๋กœ๊ณ ์นจ์ด ์ผ์–ด๋‚  ์ˆ˜๋ฐ–์— ์—†๋‹ค.

 

 

Hashed url path

Url์— ํ•ด์‹œ # ๋ฅผ ๋ถ™์ด๋ฉด ๋ธŒ๋ผ์šฐ์ €๋Š” ํ•ด์‹œ ์•ž๋ถ€๋ถ„๊นŒ์ง€๋งŒ url๋กœ ์ธ์‹ํ•œ๋‹ค.

https://example.com/sample/#someting

์ด๋ ‡๊ฒŒ ์žˆ๋‹ค๋ฉด https://example.com/sample/ ๊นŒ์ง€๋งŒ ์ธ์‹ํ•œ๋‹ค๋Š” ๋ง!

๋”ฐ๋ผ์„œ ๋ธŒ๋ผ์šฐ์ €๋Š” ํ•ญ์ƒ https://example.com/ ์— ํ•ด๋‹นํ•˜๋Š” ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋ง ํ•  ๊ฒƒ์ด๋‹ค.

 

 

JS๋กœ SPA ๊ตฌํ˜„ํ•˜๊ธฐ

JS๋งŒ์œผ๋กœ SPA๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ƒˆ๋กœ๊ณ ์นจ ์—†์ด ๋ผ์šฐํ„ฐ๋ฅผ ํ†ตํ•ด ํŽ˜์ด์ง€ URL์ด ๋ฐ”๋€Œ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ํ•„์š”ํ•˜๋‹ค.
์ด๋ฅผ ์œ„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ history์™€ hash๊ฐ€ ์žˆ๋Š”๋ฐ, history๋Š” history ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•ด์„œ ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

 

history๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค๋ฅธ ๋ธ”๋กœ๊ทธ ๊ธ€๋“ค๋„ ๋งŽ์ด ์žˆ๊ธฐ๋„ ํ•˜๊ณ , ์˜ค๋Š˜ ๊ฐ•์˜์—์„œ ๋“ค์€ Hash๋ฅผ ์ด์šฉํ•œ ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•œ๋‹ค.

์šฐ์„  ๋ผ์šฐํ„ฐ๊ฐ€ ๊ตฌํ˜„์ด ๋˜์–ด์•ผ ๊ฒฝ๋กœ์— ๋”ฐ๋ผ์„œ ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋ง ํ•  ์ˆ˜ ์žˆ๋‹ค!

const routes = {
  "/": "/pages/index.html",
  about: "/pages/about.html",
  lorem: "/pages/lorem.html",
};

 

 

๊ตฌํ˜„์„ ์œ„ํ•œ ๋กœ์ง

  • window.location.hash๋ฅผ ์ด์šฉํ•ด์„œ ํ˜„์žฌ hash๋ฅผ ์•Œ์•„์˜จ๋‹ค.

window.location ๊ฐ์ฒด๋กœ ํ˜„์žฌ ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ ์ •๋ณด๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด ์ค‘์— hash๊ฐ€ ์šฐ๋ฆฌ๊ฐ€ ์ง€์ •ํ•œ url ๋ถ€๋ถ„์ด๋‹ค!

 

 

  • hash์— ๋ณ€๊ฒฝ์ด ์žˆ์„ ๊ฒฝ์šฐ, ํ•ด๋‹น hash์— ํ•ด๋‹นํ•˜๋Š” ๋ผ์šฐํ„ฐ ํŽ˜์ด์ง€๋ฅผ ์ฐพ๋Š”๋‹ค.
  • ํŽ˜์ด์ง€ html์„ fetch ํ•ด์™€์„œ index.html์˜ ๋ Œ๋”๋ง ํ•  ๋ถ€๋ถ„์— ๋ฟŒ๋ ค์ค€๋‹ค. ํ†ต์œผ๋กœ ๊ฐ€์ ธ์™€์„œ ๋ฟŒ๋ ค์ค€๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค!
    window ๊ฐ์ฒด ์ด๋ฒคํŠธ ์ค‘ hashchange ๋ผ๋Š” ์†์„ฑ ๊ฐ’์œผ๋กœ ํ•ด์‹œ์˜ ๋ณ€ํ™”๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
    window.addEventListener("hashchange", handleLocation);
  • ์ฒ˜์Œ ๋ Œ๋”๋ง ๋˜์—ˆ์„ ๋•Œ๋ฅผ ์œ„ํ•œ ์ด๋ฒคํŠธ ์ถ”๊ฐ€
    DOMContentLoaded๋ฅผ ์ด์šฉํ•ด์„œ DOM์ด ๋ชจ๋‘ ๋กœ๋“œ๋˜์—ˆ์„ ๋•Œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.
    document.addEventListener("DOMContentLoaded", handleLocation);

 

HTTP Status 304

์ฒ˜์Œ ์•Œ๊ฒŒ ๋œ ์ฝ”๋“œ 304 Not Modifeid ๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ–๊ณ  ์žˆ๋Š”๋ฐ, ์„œ๋ฒ„์—์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๊ฐ–๊ณ  ์žˆ๋Š” ์บ์‹ฑ๋œ ๊ฐ’์œผ๋กœ ๋ฆฌ๋””๋ ‰์…˜ ํ•œ๋‹ค๋Š” ๋œป์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

 

https://developer.mozilla.org/ko/docs/Web/HTTP/Status/304

 

304 Not Modified - HTTP | MDN

ํด๋ผ์ด์–ธํŠธ ๋ฆฌ๋””๋ ‰์…˜ ์‘๋‹ต ์ฝ”๋“œ 304 Not Modified ๋Š” ์š”์ฒญ๋œ ๋ฆฌ์†Œ์Šค๋ฅผ ์žฌ์ „์†กํ•  ํ•„์š”๊ฐ€ ์—†์Œ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์บ์‹œ๋œ ์ž์›์œผ๋กœ์˜ ์•”๋ฌต์ ์ธ ๋ฆฌ๋””๋ ‰์…˜์ด๋‹ค. ์ด ๋Š” GET ๋‚˜ HEAD ์š”์ฒญ์ฒ˜๋Ÿผ ์š”์ฒญ ๋ฐฉ๋ฒ•์ด ์•ˆ์ „ ํ•œ

developer.mozilla.org

 

 

 

 

๋ญ”๊ฐ€ ๋” ๊น”๋”ํ•˜๊ฒŒ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์ง€๋งŒ?..

์ง์ ‘ ๊ตฌํ˜„ํ•˜๋ฉด์„œ ์‹œ๊ฐ„์  ์—ฌ์œ ๊ฐ€ ์žˆ๋‹ค๋ฉด ์ถ”๊ฐ€ ๋ณด์™„ํ•ด๋ณด๋Š” ๊ฒƒ์œผ๋กœ.. ๐Ÿค”๐Ÿค”

 

 

 

728x90