๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Frontend/JavaScript

[ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ(JavaScript) ] window.history.pushState์™€ history.replaceState์„ ์•Œ์•„๋ณด์ž

by YWTechIT 2022. 10. 26.
728x90

๐Ÿ“ window.history.pushState์™€ history.replaceState์„ ์•Œ์•„๋ณด์ž

history.pushState()๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ ์„ธ์…˜ ๊ธฐ๋ก ์Šคํƒ์— ์ƒˆ๋กญ๊ฒŒ ์ถ”๊ฐ€ํ•œ๋‹ค. ๋ฌธ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€๋ฐ, (pushState(state, unused, url?)) state๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•  ๋•Œ๋งˆ๋‹ค popstate ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. unused๋Š” ์—ญ์‚ฌ์  ์ด์œ ๋กœ ์กด์žฌํ•˜๋ฉฐ, ์ƒ๋žตํ•  ์ˆ˜ ์—†๋‹ค. ์ถ”ํ›„์— ๋ณ€๊ฒฝ ์˜ˆ์ •์ด๋ฏ€๋กœ ๋‹น๋ถ„๊ฐ„ ๋นˆ ๋ฌธ์ž์—ด('')์„ ์‚ฌ์šฉํ•˜์ž. url์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น URL๋กœ ์ด๋™ํ•˜์ง€ ์•Š์ง€๋งŒ, ๋‚˜์ค‘์— ์‚ฌ์šฉ์ž๊ฐ€ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์žฌ ์‹œ์ž‘ํ•˜๋ฉด ํ•ด๋‹น URL ๋กœ๋“œ๋ฅผ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฐ˜ํ™˜ ๊ฐ’์€ undefined์ด๋‹ค.

 

ํฌ์ธํŠธ๋Š” URL๊ฐ’์€ ํ˜„์žฌ URL๊ณผ ๋™์ผํ•œ ์ถœ์ฒ˜(same origin)์—ฌ์•ผ ํ•˜๋Š”๋ฐ, ์˜ˆ๋ฅผ ๋“ค์–ด ํ˜„์žฌ ํŽ˜์ด์ง€๊ฐ€ www.google.com์ธ๋ฐ, history.pushState({ foo: 'bar' }, "", 'https://www.naver.com/')์„ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์—†๋‹ค. ๋งŒ์•ฝ, ์™ธ๋ถ€ URL์„ ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

 

history.pushState()์™€ window.location = "#foo"์€ ํ˜„์žฌ ํŽ˜์ด์ง€์˜ history๋ฅผ ์ƒ์„ฑํ•˜๋Š”๊ฒƒ์€ ๊ฐ™์ง€๋งŒ, history.pushState()์˜ ์ด์ (advantage)์ด ์กฐ๊ธˆ ๋” ํฌ๋‹ค.

  1. history.pushState()์—์„œ ์‚ฌ์šฉํ•˜๋Š” URL์€ same origin์ด๋‹ค. ๋ฐ˜๋ฉด window.location์€ hash๋งŒ ์ˆ˜์ •ํ•˜๋Š” ๊ฒฝ์šฐ์— ๋™์ผํ•œ ํŽ˜์ด์ง€๋กœ ์œ ์ง€๋œ๋‹ค.
  2. ์„ธ ๋ฒˆ์งธ ์ธ์ž์˜ URL์€ optional์ด์ง€๋งŒ, window.location = "#foo"์™€ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ํ˜„์žฌ hash๊ฐ’์ด #foo๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ์—๋งŒ ์ƒˆ๋กœ์šด history๋ฅผ ๋งŒ๋“ ๋‹ค.
  3. ์ž„์˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒˆ history ํ•ญ๋ชฉ์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค. hash ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋“  ๊ด€๋ จ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฌธ์ž์—ด๋กœ ์ธ์ฝ”๋”ฉํ•ด์•ผ ํ•œ๋‹ค.
  4. ์ƒˆ URL์ด ์ด์ „ URL๊ณผ ํ•ด์‹œ๋งŒ ๋‹ฌ๋ผ๋„ pushState()๋Š” ์ ˆ๋Œ€ hashchange ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š๋Š”๋‹ค.
728x90

history.replaceState()๋Š” history.pushState()์™€ ๋น„์Šทํ•˜์ง€๋งŒ, ํ˜„ depth์˜ session history๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค๋Š” ์ ์—์„œ history.pushState()์™€ ๋‹ค๋ฅด๋‹ค. (history.pushState()๋Š” session history์— ์ƒˆ๋กœ์šด ์„ธ์…˜ ๊ธฐ๋ก์„ ์ถ”๊ฐ€ํ•œ๋‹ค.) ๋ฌธ๋ฒ•์€ history.pushState()์™€ ๋™์ผํ•˜๊ฒŒ replaceState(stateObj, un(used, url?)๋กœ ์ž‘์„ฑํ•œ๋‹ค. ๋ฐ˜ํ™˜ ๊ฐ’์€ undefined์ด๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด ํ˜„์žฌ ํŽ˜์ด์ง€(https://www.mozilla.org/foo.html)์—์„œ ์ƒˆ ํƒญ์— ๋‹ค์Œ์„ ์ž…๋ ฅํ•ด๋ณด์ž. history.pushState({ foo: 'bar' }, '', 'bar.html'); ๊ทธ๋Ÿฐ ํ›„ ์ฝ˜์†”์ฐฝ์— history๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์—ฌ์ „ํžˆ length๊ฐ€ 1๊ฐœ์ธ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์•Œ ์ˆ˜ ์žˆ๋Š” ์ ์€ history.pushState()์™€ ๋‹ค๋ฅด๊ฒŒ session history์— ์ƒˆ๋กœ์šด history๋ฅผ ์ถ”๊ฐ€ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ธฐ์กด์— ์žˆ๋˜ session history๊ฐ’์„ ๋ฐฉ๊ธˆ ์„ ์–ธํ•œ ๊ฐ’์œผ๋กœ ๋Œ€์ฒดํ•œ ๊ฒƒ์ด๋‹ค. ๋˜ history์˜ state๋ฅผ ๋ณด๋ฉด ๊ธฐ์กด์— ์—†๋˜ state: { foo: 'bar' }๊ฐ€ ์ƒ๊ธด ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋‹ค์Œ history.replaceState({ bar: 'baz' },'', 'bar2.html')๋ฅผ ์ž…๋ ฅํ•ด๋ณด๋ฉด ์—ฌ์ „ํžˆ length๊ฐ€ 1๊ฐœ์ด๋‹ค. ์•Œ์•„๋‘์–ด์•ผ ํ•  ์ ์€ ์„ธ ๋ฒˆ์งธ ์ธ์ž์ธ URL ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋„ฃ๋Š”๋‹ค๊ณ  ํ•ด๋„ ๋ธŒ๋ผ์šฐ์ €๋Š” bar2.html๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ ์ฃผ์†Œ ํ‘œ์‹œ์ฐฝ์— www.naver.com์„ ์ž…๋ ฅํ•˜์—ฌ ์—”ํ„ฐ๋ฅผ ํด๋ฆญํ•˜๊ณ  ๋ธŒ๋ผ์šฐ์ €์˜ ๋’ค๋กœ ๊ฐ€๊ธฐ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ๋งˆ์ง€๋ง‰์— ์ž‘์„ฑํ•œ bar2.html์ด ๋‚˜์˜ค๊ณ  ํ•œ๋ฒˆ ๋” ๋’ค๋กœ ๊ฐ€๊ธฐ๋ฅผ ๋ˆ„๋ฅด๋ฉด bar.html ๋Œ€์‹  foo.html๊ฐ€ ๋‚˜์˜ค๊ณ  bar.html์„ ์™„์ „ํžˆ ์šฐํšŒํ•œ๋‹ค๋Š” ์ ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

Reference

  1. History.pushState - MDN
  2. History.replaceState - MDN
  3. window: popstate event - MDN
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€