230809(์)
๐ค ์ฑ์ฅ์ผ์ง 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๋๊น..! ์ด๋ ๊ฒ ๊ฐ๋จํ ๋ฌธ์ ์๋ค๋โฆ ๊ทธ๋๋ ์ด์ ๋ ์๋ฒ ์ฌ์ด๋ ๋ผ์ฐํ ๊ณผ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ผ์ฐํ ์ด ์ด๋ป๊ฒ ๊ตฌ๋ถ๋๊ณ ์ด๋ป๊ฒ ๋ค๋ฅด๊ฒ ๋์ํ๋์ง ์ ๊ฒ ๊ฐ๋ค.
๐ ์ค๋์ ํ๊ณ
๊ทธ๋๋ ๋๋ฆ ์ด๋ ฅ์๊ฐ ์์ฑ๋์ด๊ฐ๋ค. ํ๋ก์ ํธ ์ข๋ ์ ๋ฆฌํ๊ณ ์์ํ ๋ด์ฉ๋ค ์ถ๊ฐ๋ณด์ถฉํ ๋ค์ ํผ๋๋ฐฑ ๋ฐ์ผ๋ฉด์ ์์ ํด๋๊ฐ๋ฉด ๋ ๊ฒ ๊ฐ๋ค. ๊ทธ๋ฌ๋ฉด์ ๊ณ์ ํ์ฌ์ ์ง์ํด๋ณด๋๋ก ํด์ผ์ง! ๋งํ ํ์๋ ์์ง๋ง, ๋๋ฌด ์ํ๊ณ ์๋ค!
๐พ ์ค๋์ ๊ตํ
๊ทธ๋ฅ ๋ด๊ฐ ๊ฐ๋ ๊ธธ์ ๋ฌต๋ฌตํ ์ ๋์๊ฐ๋ฉด ๋ชจ๋ ๊ฒ ๋ค ํผ๊ฐ ๋๊ณ ์ด์ด ๋๋ค.