๐Ÿšค ์„ฑ์žฅ์ผ์ง€ 6.0

์ฑ… ํ–‰๋ณตํ•œ ์ด๊ธฐ์ฃผ์˜์ž(์›จ์ธ ๋‹ค์ด์–ด)์˜ ๋‚ด์šฉ์— ์ž๊ทน๋ฐ›์•„ ์‹œ์ž‘ํ•˜๋Š” ์†Œ๋ฐ•ํ•œ ์„ฑ์žฅ๊ธฐ๋ก

์‚ด์•„์žˆ๋Š” ๊ฝƒ๊ณผ ์ฃฝ์€ ๊ฝƒ์€ ์–ด๋–ป๊ฒŒ ๊ตฌ๋ณ„ํ•˜๋Š”๊ฐ€?
์„ฑ์žฅํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ์‚ด์•„ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.
์ƒ๋ช…์˜ ์œ ์ผํ•œ ์ฆ๊ฑฐ๋Š” ์„ฑ์žฅ์ด๋‹ค!

๐ŸŒพ (4.0)ํ•™์Šต ํ‚ค์›Œ๋“œ์—์„œ ์ตœ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ์ •๋ณด ์ œ๊ณต, ๊ณ ๋ฏผ์—์„œ ๋‚ด ๊ฒฝํ—˜์„ ์ž์„ธํžˆ ์ ์ž!
๐ŸฅŠ (5.0)ํ•™์Šต ํ‚ค์›Œ๋“œ๋Š” ํ•œ์ค„์˜ ํ•ต์‹ฌ์œผ๋กœ๋งŒ ์ •๋ฆฌ, ์„ฑ๊ณต/์‹คํŒจ ์ผ์ง€ ์ž‘์„ฑํ•˜๊ธฐ! ์ด ๋•Œ, ์‹คํŒจ์˜ ๊ฒฝํ—˜์€ ์ž์„ธํžˆ ์ ๊ธฐ!
๐Ÿ‰ (6.0)<์™„์ „ ๊ฐœํŽธ!!!> ๋งค์ผ ์Šต๊ด€์ ์œผ๋กœ ํ•ต์‹ฌ๋งŒ ์ ์„ ์ˆ˜ ์žˆ๊ฒŒ ํ”„๋ ˆ์ž„ ๋ณ€๊ฒฝ. ์„ฑ๊ณต๋ณด๋‹จ ์‹คํŒจ์— ์ดˆ์ ์„ ๋งž์ถ”๊ธฐ.

  • ๐Ÿ‰ (6.1)<์ˆ˜์ •> ๋งค๋ฒˆ ์„ฑ๊ณต, ์‹คํŒจ๋ฅผ ๋”ฐ๋กœ ์ ๋Š” ๊ฒƒ๋ณด๋‹จ ๊ฒฝํ—˜์œผ๋กœ ํ‘œํ˜„ํ•˜์ž!
  • ๐Ÿ‰ (6.2)<์ˆ˜์ •> ์ผ์ง€ ์นดํ…Œ๊ณ ๋ฆฌ ์ˆ˜์ • ๋ณ€๊ฒฝ!(๊ฒฝํ—˜ -> ๊ณ ๋ฏผ -> ํšŒ๊ณ  -> ๊ตํ›ˆ)

โ˜€๏ธ ์˜ค๋Š˜์˜ ๊ฒฝํ—˜

pushState()์™€ popstate ์ด๋ฒคํŠธ

์ •๋ง ๋‹จ์ˆœํ•˜๊ฒŒ ์ƒ๊ฐํ•˜๋ฉด history.pushState()๋Š” ์–ด๋–ค ์ƒํƒœ์™€ ํ•จ๊ป˜ url์„ ๋ณ€๊ฒฝํ•˜๊ณ  history stack์— ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด๊ณ , popstate ์ด๋ฒคํŠธ๋Š” history stack์—์„œ ์ƒํƒœ๊ฐ€ pop๋˜์—ˆ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ์ด๋‹ค.(๋’ค๋กœ๊ฐ€๊ธฐ, ์•ž์œผ๋กœ๊ฐ€๊ธฐ ๋“ฑ) ์ด ๋‘˜์„ ์ž˜ ํ™œ์šฉํ•˜๋ฉด SPA์—์„œ ๋ธŒ๋ผ์šฐ์ €์˜ ๋’ค๋กœ๊ฐ€๊ธฐ, ์•ž์œผ๋กœ๊ฐ€๊ธฐ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ง๊ทธ๋Œ€๋กœ ์„œ๋ฒ„์— ์š”์ฒญ์—†์ด JS ์ฝ”๋“œ๋กœ๋งŒ ๋ธŒ๋ผ์šฐ์ €์˜ ๋ผ์šฐํŒ…์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿซง ์˜ค๋Š˜์˜ ๊ณ ๋ฏผ

history stack์—์„œ ๋น ์ ธ๋‚˜๊ฐ„ state๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜๋Š” ์—†์„๊นŒ?

์ด ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ ๊ถ๊ธˆํ•˜์—ฌ ์†ํ•ด์žˆ๋Š” ๋””์Šค์ฝ”๋“œ์— ์˜ฌ๋ฆฐ ์งˆ๋ฌธ์„ ๊ทธ๋Œ€๋กœ ๋‚จ๊ธด๋‹ค.


history.pushState()๋ฅผ ํ†ตํ•ด history stack์— ๊ฐ์ฒด๋ฅผ ํ•˜๋‚˜ ์ง‘์–ด๋„ฃ์€ ๋’ค์—, ๋’ค๋กœ๊ฐ€๊ธฐ๋ฅผ ํ–ˆ์„ ๋•Œ(popstate ํ–ˆ์„ ๋•Œ), pop๋˜๋Š” history ๊ฐ์ฒด(์œ„์—์„œ ์ง‘์–ด๋„ฃ์—ˆ๋˜)๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†๋‚˜์š”?

์ •๋ง ๋‹จ์ˆœํ•œ ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด๋ณด๋ฉด

// popstate์— ๋Œ€ํ•œ ๋ฆฌ์Šค๋„ˆ ๋“ฑ๋ก window.addEventListener(โ€˜popstateโ€™, (event) => { console.log(event); });

// pushState๋กœ { number: 123 }์ด๋ผ๋Š” state๋ฅผ ๋„˜๊ธฐ๋ฉด์„œ path๋Š” /sinabro๋กœ ๋ณ€๊ฒฝ history.pushState({ number: 123 }, โ€, โ€˜sinabroโ€™);

์œ„์˜ ์ฝ”๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๋‚˜์„œ, ๋’ค๋กœ๊ฐ€๊ธฐ๋ฅผ ํ•˜๊ฒŒ ๋˜๋ฉด ๋ธŒ๋ผ์šฐ์ €์˜ ์ฝ˜์†” ์ฐฝ์— event ๊ฐ์ฒด๊ฐ€ ์ถœ๋ ฅ์ด ๋˜๋Š”๋ฐ, ์ €๋Š” ๋‹จ์ˆœํ•˜๊ฒŒ popstate์— ๋Œ€ํ•œ event ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด ์•ˆ์— ์ด์ „์— push ํ–ˆ๋˜ state, ์ฆ‰ { number: 123 }์ด ๋“ค์–ด์žˆ์„ ๊ฑฐ๋ผ ์ƒ๊ฐํ–ˆ๊ฑฐ๋“ ์š”..! ๊ทผ๋ฐ ์ด ๋•Œ event ๊ฐ์ฒด๋Š” ์ง€๊ธˆ ๋’ค๋กœ๊ฐ€๊ธฐ๋กœ ํ•ด์„œ ๋ณด์—ฌ์ง€๋Š” state๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ ๊ฐ™๋”๋ผ๊ตฌ์š”..! ์ด ๋•Œ, ์ด์ „์— pushํ–ˆ๋˜ state๋ฅผ ์ฐธ์กฐํ•  ๋ฐฉ๋ฒ•์ด ์žˆ์„๊นŒ์š”?

(์ถ”๊ฐ€) ์ƒ๊ฐํ•ด๋ณด๋ฉด ํŽ˜์ด์ง€ ์ด๋™ ํ›„์—, ๋’ค๋กœ๊ฐ€๊ธฐ๋ฅผ ํ•˜๊ณ ๋‚˜์„œ ์ด๋™ํ–ˆ์—ˆ๋˜ ํŽ˜์ด์ง€์—์„œ์˜ ์ƒํƒœ๋ฅผ ๊ตณ์ด ๊ฐ€์ ธ์˜ฌ ํ•„์š”๊ฐ€ ์žˆ๋‚˜..? ์‹ถ๊ธฐ๋Š” ํ•˜๋„ค์š”..! ๊ทธ๋Ÿผ์—๋„ ๊ถ๊ธˆํ•ด์„œ ์งˆ๋ฌธ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. :)!


์ผ๋‹จ ๊ฒฐ๋ก ๊ณผ ๋‹ต๋ณ€์€ ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋‹ค๋งŒ ๋ช‡๋ช‡ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ monkey patching์„ ํ†ตํ•ด ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.

monkey patching: ๋Ÿฐํƒ€์ž„์— ๋™์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ธฐ๋ฒ•

์ƒ๊ฐํ•ด๋ณด๋ฉด 1, 2 ํŽ˜์ด์ง€๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•  ๋•Œ 1์—์„œ 2๋กœ state๋ฅผ push ํ•ด๋†“๊ณ ์„œ๋Š” 2์—์„œ 1๋กœ ๊ฐˆ ๋•Œ ๋‹ค์‹œ ๊ทธ state๋ฅผ 2๋ฅผ ํ†ตํ•ด์„œ ์ฐธ์กฐํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ์–ด์ฐจํ”ผ 1์—์„œ 2๋กœ ๊ฐˆ ๋•Œ ๋„˜๊ฒจ์ค€ state๋‹ˆ๊นŒ..! ์ด๋ ‡๊ฒŒ ๊ฐ„๋‹จํ•œ ๋ฌธ์ œ์˜€๋‹ค๋‹ˆโ€ฆ ๊ทธ๋ž˜๋„ ์ด์ œ๋Š” ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ผ์šฐํŒ…๊ณผ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋ผ์šฐํŒ…์ด ์–ด๋–ป๊ฒŒ ๊ตฌ๋ถ„๋˜๊ณ  ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ์•Œ ๊ฒƒ ๊ฐ™๋‹ค.

๐ŸŒˆ ์˜ค๋Š˜์˜ ํšŒ๊ณ 

๊ทธ๋ž˜๋„ ๋‚˜๋ฆ„ ์ด๋ ฅ์„œ๊ฐ€ ์™„์„ฑ๋˜์–ด๊ฐ„๋‹ค. ํ”„๋กœ์ ํŠธ ์ข€๋” ์ •๋ฆฌํ•˜๊ณ  ์ž์ž˜ํ•œ ๋‚ด์šฉ๋“ค ์ถ”๊ฐ€๋ณด์ถฉํ•œ ๋’ค์— ํ”ผ๋“œ๋ฐฑ ๋ฐ›์œผ๋ฉด์„œ ์ˆ˜์ •ํ•ด๋‚˜๊ฐ€๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค. ๊ทธ๋Ÿฌ๋ฉด์„œ ๊ณ„์† ํšŒ์‚ฌ์— ์ง€์›ํ•ด๋ณด๋„๋ก ํ•ด์•ผ์ง€! ๋งํ•  ํ•„์š”๋„ ์—†์ง€๋งŒ, ๋„ˆ๋ฌด ์ž˜ํ•˜๊ณ  ์žˆ๋‹ค!

๐Ÿพ ์˜ค๋Š˜์˜ ๊ตํ›ˆ

๊ทธ๋ƒฅ ๋‚ด๊ฐ€ ๊ฐ€๋Š” ๊ธธ์„ ๋ฌต๋ฌตํžˆ ์ž˜ ๋‚˜์•„๊ฐ€๋ฉด ๋ชจ๋“  ๊ฒŒ ๋‹ค ํ”ผ๊ฐ€ ๋˜๊ณ  ์‚ด์ด ๋œ๋‹ค.

๐Ÿชต ์ฐธ๊ณ