728x90
웹 개발에서 history.pushState와 history.replaceState는 HTML5 History API의 일부로, 페이지의 URL을 동적으로 변경하면서도 페이지를 새로고침하지 않고 상태를 관리할 수 있게 해줍니다. 이 API는 SPA(Single Page Application)에서 중요한 역할을 하며, 사용자 경험을 개선하는 데 사용됩니다.
1. history.pushState와 history.replaceState의 차이점
1.1 공통점
- 둘 다 **브라우저의 히스토리 스택(history stack)**을 조작할 수 있습니다.
- URL을 변경하지만 페이지를 다시 로드하지 않습니다.
- 추가적인 상태 데이터를 저장할 수 있습니다.
- popstate 이벤트와 함께 사용할 수 있습니다.
1.2 차이점
기능 | pushState | replaceState |
히스토리 스택 | 새로운 상태를 추가함 | 현재 상태를 대체함 |
뒤로가기 버튼 | 추가된 상태로 이동 가능 | 대체된 상태로 이동 불가 |
2. 각 메서드의 문법
history.pushState(state, title, url)
history.pushState(state, title, url);
- state: 상태 객체(데이터). 브라우저 히스토리에 저장되며, popstate 이벤트에서 사용할 수 있습니다.
- title: 현재 브라우저에서 무시되며 빈 문자열로 남겨둬도 됩니다.
- url: 새로 설정할 URL입니다. 같은 도메인 내에서만 변경 가능.
history.replaceState(state, title, url)
history.replaceState(state, title, url);
- pushState와 동일한 매개변수를 사용하지만, 현재 히스토리 항목을 대체합니다.
3. 사용 예제
3.1 pushState 사용 예제
새로운 상태를 추가하면서 URL을 변경합니다.
// 초기 상태
console.log(location.href); // https://example.com/
// 새로운 상태 추가
history.pushState({ page: 1 }, "Page 1", "/page1");
console.log(location.href); // https://example.com/page1
// popstate 이벤트 핸들링
window.addEventListener("popstate", (event) => {
console.log("Popstate triggered!", event.state);
});
// 뒤로가기 버튼을 누르면 popstate 이벤트 발생
3.2 replaceState 사용 예제
현재 상태를 대체합니다.
// 초기 상태
console.log(location.href); // https://example.com/
// 상태를 대체
history.replaceState({ page: 2 }, "Page 2", "/page2");
console.log(location.href); // https://example.com/page2
// popstate 이벤트 핸들링
window.addEventListener("popstate", (event) => {
console.log("Popstate triggered!", event.state);
});
// 뒤로가기 버튼을 눌러도 대체된 상태로 인해 이전 URL로 이동하지 않음
4. 실전 응용: SPA 라우팅
pushState와 replaceState는 SPA에서 라우팅을 구현하는 데 자주 사용됩니다.
// SPA 라우터 구현
function navigate(path) {
// 상태 추가
history.pushState({ path }, "", path);
// 새 콘텐츠 로드
renderContent(path);
}
function renderContent(path) {
const contentDiv = document.getElementById("content");
contentDiv.textContent = `You are on ${path}`;
}
// popstate 이벤트 처리
window.addEventListener("popstate", (event) => {
const path = event.state?.path || "/";
renderContent(path);
});
// 초기 렌더링
renderContent(location.pathname);
// 버튼 클릭 이벤트
document.getElementById("btn1").addEventListener("click", () => navigate("/page1"));
document.getElementById("btn2").addEventListener("click", () => navigate("/page2"));
HTML 구조:
<div id="content"></div>
<button id="btn1">Go to Page 1</button>
<button id="btn2">Go to Page 2</button>
LIST
'Develop' 카테고리의 다른 글
[JavaScript] Toastr js 간단하고 세련된 알림 메시지 라이브러리 (4) | 2024.12.17 |
---|---|
[PostgreSQL] 나누기 연산 소수점 계산하기 (4) | 2024.12.16 |
[JavaScript] a 링크에서 이동 없이 JavaScript 함수만 실행하기 (7) | 2024.11.29 |
Java의 객체 지향 프로그래밍 원칙 (OOP Principles in Java) (6) | 2024.11.10 |
[jQuery] script 실행 순서 ready, load 및 기타 실행 순서 제어 방법 (5) | 2024.11.07 |