
세션 히스토리는 페이지를 이동할 때마다 쌓이게 되며, 이를 통해 뒤로가기나 앞으로 가기 등의 이동을 할 수 있다.
http://host:port/path?queryString게시물 작성을 예로 들면 작성을 다한 후
history.pushState는 작성이 끝난 페이지로 이동시킬 것이다. 이 때 이전버튼을 누르다면 다시 작성페이지로 돌아가 재작성 해야한다.. 하지만history.replaceState는 작성된 페이지의 url로 대체해버리기 때문에 작성하는 페이지로 돌아가지 않는다!!
ex) 뒤로가기로 이동이 불가능 하도록 처리할 때 사용 (replace)


location.href = '/product/1'를 사용하면 이 url로 이동을 해버리기 때문에 콘솔 입력이 날아간다... (! 주의)
product1, 2, 3을 넣고 뒤로 가기 앞으로 가기 등을 해본 결과 history length 자체에는 변화가 없지만 자유롭게 뒤로 가기, 앞으로 가기가 가능했다 😀

product4를 push로product/new를 replace로 생성하고 뒤로가기를 눌러보았는데 바로 이전인 product4로 돌아가는게 아니라 그 전인 3으로 돌아갔다! history의 length에도 replace로 생성한 new가 반영되지 않았다.(4를 new로 대체..?)로그인이나 장바구니? 같은 페이지를 구축할 때 매우 유용할 것 같다!!
예:index.html로 요청을 돌려주는 처리가 필요하다.npx serve -sfunction Route(){ // 1번 조건
const {pathname} = location
const $container = document.querySelector('#container')
if(pathname === '/'){
$container.innerHTML = '<h1>Home</h1>'
}else if(pathname === '/product-list'){
$container.innerHTML = '<h1>상품 목록</h1>'
}else if(pathname === '/article-list'){
$container.innerHTML = '<h1>게시글 목록</h1>'
}
}
Route();
window.addEventListener('click', e => {
if(e.target.className === "linkItem"){ // 2번 조건
e.preventDefault()
const {href} = e.target //http://127.0.0.1:5500/product-list
const path = href.replace(window.location.origin, '') /// product-list 앞에 url을 짤라버림
history.pushState(null, null, path) //이동 없이 url이 바뀐다.
Route()
}
})
// 3번 조건
window.addEventListener('popstate', Route) //이전이나 다음버튼을 눌렀을 때 멈춰있지 않고 Route에 따라 변하도록 설정
location의 pathname을 기준으로 어떤 페이지를 렌더링할 지 정해야한다. -> Route 로직pushState로 호출하는 식으로 바꿔야한다! popstate 이벤트 : 뒤로가기나 앞으로 가기를 할 때 발생하는 이벤트를 통해 제대로 동작하도록 한다.