본문 바로가기
Javascript/javascript

자바스크립트 history로 세션 히스토리 관리하기

by 노마드 산코디 2023. 9. 26.
728x90

자바스크립트 history로 세션 히스토리 관리하기

 

 

안녕하세요!

이번 포스팅에서는 자바스크립트의 History API에 대한 내용을 다뤄보려고 합니다. 웹 개발을 하다 보면 사용자가 뒤로 가기와 앞으로 가기를 누를 때 페이지 전환을 어떻게 다루는지가 중요한 부분이며, 이때 History API는 매우 유용한 도구입니다. 웹 페이지의 브라우저 히스토리를 조작하고 관리하는 방법을 배우며, 사용자 경험을 개선하는 방법을 알아보도록 하겠습니다. 






History API란?


자바스크립트의 History API는 웹 브라우저의 히스토리를 관리하고 조작할 수 있는 기능을 제공합니다. 사용자가 뒤로가기 또는 앞으로 가기 버튼을 클릭할 때 발생하는 페이지 전환을 자바스크립트로 제어하는 데 사용됩니다. 이를 통해 단일 페이지 애플리케이션(SPA)에서도 브라우저의 히스토리를 제어하며 사용자 경험을 향상시킬 수 있습니다.



History API는 웹 애플리케이션에서 다음과 같은 주요 기능을 제공합니다.

1. 페이지 전환 제어
History API를 사용하면 페이지 전환을 자바스크립트 코드로 제어할 수 있습니다. 새로운 페이지를 로드하지 않고도 URL과 상태를 변경하여 사용자에게 더 나은 경험을 제공할 수 있습니다.

2. URL 조작
pushState와 replaceState 메서드를 사용하여 URL을 변경하고 히스토리에 새로운 항목을 추가하거나 현재 항목을 변경할 수 있습니다. 이를 통해 동적으로 URL을 업데이트하여 페이지의 상태를 반영할 수 있습니다.

3. SPA와 브라우저 히스토리 동기화
단일 페이지 애플리케이션에서도 브라우저의 히스토리와 상태를 관리할 수 있어 사용자 경험을 더욱 개선할 수 있습니다. 사용자가 뒤로가기, 앞으로 가기 버튼을 클릭하면 페이지가 자연스럽게 전환되는 효과를 제공할 수 있습니다.

4. 상태 관리
pushState와 replaceState 메서드를 사용하여 페이지의 상태 데이터를 관리할 수 있습니다. 이를 통해 페이지 전환 간에 데이터를 유지하거나 공유할 수 있습니다.

5. 페이지 전환 애니메이션
페이지 전환 시에 애니메이션 효과를 추가하여 사용자에게 시각적으로 더 나은 경험을 제공할 수 있습니다.


History API를 활용하면 웹 애플리케이션의 사용자 경험을 개선하고 브라우저의 히스토리를 유연하게 조작할 수 있습니다. SPA와 같은 모던 웹 애플리케이션에서 뒤로 가기, 앞으로 가기 등의 동작을 원활하게 관리하며, URL 및 페이지 상태를 효과적으로 제어할 수 있습니다.





History API의 구성 요소


History API는 브라우저의 세션 히스토리를 조작하고 관리하는 데 사용되는 다양한 구성 요소를 포함합니다. 이러한 구성 요소들은 웹 애플리케이션에서 페이지 전환과 상태 관리를 조작하는 데 필요한 도구들입니다. 



1. window.history
window.history 객체는 현재 브라우저 창의 히스토리를 나타냅니다. 이 객체를 통해 사용자의 페이지 전환 내역을 확인하고 조작할 수 있습니다. window.history 객체의 주요 메서드에는 pushState(), replaceState(), go(), back(), forward() 등이 있습니다.

2. pushState()와 replaceState()
pushState()와 replaceState() 메서드는 새로운 히스토리 항목을 추가하거나 기존 항목을 변경할 때 사용됩니다. pushState()는 새로운 히스토리 항목을 추가하며, replaceState()는 현재 항목을 변경합니다. 각 메서드는 상태 객체와 제목, URL을 인수로 받습니다.

3. popstate 이벤트
popstate 이벤트는 사용자가 뒤로가기 또는 앞으로 가기 버튼을 클릭하거나 history.back() 또는 history.forward() 메서드를 호출했을 때 발생합니다. 이 이벤트를 사용하여 페이지 전환이 발생할 때 필요한 동작을 수행할 수 있습니다.

4. window.onpopstate
window.onpopstate 이벤트 핸들러는 popstate 이벤트가 발생할 때 호출되는 함수를 정의합니다. 이 핸들러를 사용하여 popstate 이벤트에 대한 처리를 추가할 수 있습니다.

5. go(), back(), forward()
go(), back(), forward() 메서드는 브라우저의 히스토리를 탐색하거나 이동하는 데 사용됩니다. go() 메서드는 상대적인 페이지 인덱스를 인수로 받아 해당 페이지로 이동하며, back()은 뒤로 가기 동작을 수행하고 forward()는 앞으로 가기 동작을 수행합니다.


History API의 이러한 구성 요소들을 조합하여 웹 애플리케이션의 페이지 전환과 상태 관리를 조작할 수 있습니다. 이를 활용하여 브라우저의 히스토리를 세밀하게 제어하고 사용자 경험을 개선할 수 있습니다.






브라우저 히스토리 변화 감지


브라우저 히스토리의 변화 감지는 웹 애플리케이션이 사용자의 브라우저 내에서 발생하는 페이지 전환 및 상태 변화를 감지하고 처리하는 데 사용되는 중요한 기능입니다. 



1. popstate 이벤트
popstate 이벤트는 브라우저의 히스토리가 변경될 때마다 발생하는 이벤트입니다. 이 이벤트는 사용자가 뒤로가기 또는 앞으로 가기 버튼을 클릭하거나 history.back(), history.forward() 메서드를 호출했을 때도 발생합니다. popstate 이벤트는 다음과 같이 등록하고 사용할 수 있습니다.

window.addEventListener('popstate', function(event) {
    // 히스토리 변화에 대한 처리 로직
    // event.state 객체를 통해 변화된 상태 정보에 접근할 수 있음
});




2. window.onpopstate
window.onpopstate 이벤트 핸들러는 popstate 이벤트가 발생했을 때 호출되는 함수를 정의합니다. 아래와 같이 사용할 수 있습니다.

window.onpopstate = function(event) {
    // 히스토리 변화에 대한 처리 로직
    // event.state 객체를 통해 변화된 상태 정보에 접근할 수 있음
};




3. pushState()와 replaceState()
페이지 전환 시 pushState() 또는 replaceState() 메서드로 새로운 히스토리 항목을 추가하거나 변경할 수 있습니다. 이 때 popstate 이벤트가 발생하여 페이지 전환에 대한 처리를 수행할 수 있습니다.



브라우저 히스토리의 변화 감지를 통해 웹 애플리케이션은 사용자의 페이지 전환 및 상태 변화에 적절히 대응하고, 뒤로가기 또는 앞으로 가기 동작에 따른 UI 및 데이터 상태를 조정할 수 있습니다. 이를 통해 사용자 경험을 향상시키고 웹 애플리케이션의 노출된 상태를 효과적으로 관리할 수 있습니다.






History API의 활용 예제


1. 뒤로가기와 앞으로 가기 제어

// 뒤로가기 버튼 클릭 시 이전 페이지로 이동
document.getElementById('backButton').addEventListener('click', () => {
  history.back();
});

// 앞으로가기 버튼 클릭 시 다음 페이지로 이동
document.getElementById('forwardButton').addEventListener('click', () => {
  history.forward();
});


위의 소스 코드에서 history의 기능은 뒤로 가기와 앞으로 가기 버튼을 클릭했을 때 사용됩니다.


history.back() 메서드는 뒤로가기 버튼을 클릭했을 때 이전 페이지로 이동하는 역할을 합니다. 이전 페이지로 돌아갈 수 있게 해주는 기능입니다.

history.forward() 메서드는 앞으로가기 버튼을 클릭했을 때 다음 페이지로 이동하는 역할을 합니다. 이전에 뒤로 가기로 이동한 페이지를 다시 앞으로 이동할 수 있게 해주는 기능입니다.




2.  페이지 내에서 라우팅

// 페이지 전환 시 URL 변경과 히스토리 관리
function navigateTo(pageName) {
  history.pushState(null, null, pageName);
  // 페이지 전환 로직 추가
}

// 라우팅 버튼 클릭 시 페이지 내에서 전환
document.getElementById('page1Button').addEventListener('click', () => {
  navigateTo('/page1');
});

document.getElementById('page2Button').addEventListener('click', () => {
  navigateTo('/page2');
});


위의 소스 코드는 페이지 전환 시 history를 사용하여 URL을 변경하고 히스토리를 관리하는 기능을 보여주고 있습니다.


navigateTo 함수는 페이지를 전환할 때 사용되며, 전환할 페이지의 이름을 받아와 URL을 변경합니다. history.pushState를 통해 URL을 업데이트하고, 페이지 전환에 필요한 로직을 추가합니다.

또한, 각각의 라우팅 버튼에 이벤트 리스너가 추가되어 있습니다. 버튼을 클릭할 때마다 navigateTo 함수가 호출되어 해당 페이지로 URL을 변경합니다. 이를 통해 페이지 간의 전환을 관리할 수 있습니다.




3. 모달 창 관리

// 모달 열기 시 URL 변경과 히스토리 관리
function openModal(modalName) {
  history.pushState(null, null, `/${modalName}`);
  // 모달 열기 로직 추가
}

// 모달 닫기 시 URL 복원
function closeModal() {
  history.back();
  // 모달 닫기 로직 추가
}

// 모달 열기 버튼 클릭 시 모달 열기
document.getElementById('openModalButton').addEventListener('click', () => {
  openModal('modal1');
});

// 모달 닫기 버튼 클릭 시 모달 닫기
document.getElementById('closeModalButton').addEventListener('click', () => {
  closeModal();
});


위의 소스 코드는 모달을 열고 닫을 때 history를 사용하여 URL을 변경하고 히스토리를 관리하는 기능을 보여주고 있습니다.
openModal 함수는 모달을 열 때 사용되며, 해당 모달의 이름을 받아와 URL을 변경합니다. 
history.pushState를 통해 URL을 업데이트하고, 모달을 열기 위한 로직을 추가합니다.

closeModal 함수는 모달을 닫을 때 사용되며, history.back()을 호출하여 이전 페이지로 되돌아갑니다. 모달을 닫는 로직을 추가합니다.




4. 검색 결과 및 필터 관리

// 검색 결과 페이지로 이동하면서 필터 설정을 URL에 포함
function navigateToSearchResults(query, filters) {
  const queryString = new URLSearchParams(filters).toString();
  history.pushState(null, null, `/search?query=${query}&${queryString}`);
  // 검색 결과 및 필터 로직 추가
}

// 검색 버튼 클릭 시 검색 결과 페이지로 이동
document.getElementById('searchButton').addEventListener('click', () => {
  const searchQuery = document.getElementById('searchInput').value;
  const filterOptions = {
    category: 'electronics',
    price: 'under50',
  };
  navigateToSearchResults(searchQuery, filterOptions);
});


위의 소스 코드는 navigateToSearchResults 함수를 사용하여 검색 결과 페이지로 이동하면서 URL에 필터 설정을 포함하는 기능을 구현한 것입니다. URLSearchParams를 이용해 필터를 쿼리 스트링으로 변환하고, history.pushState를 사용하여 URL을 변경하고 히스토리를 관리합니다. 검색 버튼 클릭 시에는 입력된 검색어와 미리 정의된 필터 옵션을 사용하여 navigateToSearchResults 함수를 호출하여 검색 결과 페이지로 이동하게 됩니다.








브라우저 지원 및 주의사항


브라우저 지원
history 객체는 대부분의 현대 웹 브라우저에서 지원됩니다. 주요 브라우저들은 다음과 같은 방식으로 history 객체를 지원합니다:

  • Chrome
  • Firefox
  • Safari
  • Edge
  • Opera


하지만, 일부 오래된 브라우저나 특정 환경에서는 지원이 불안정할 수 있습니다.



주의사항


1. 사용자 경험 고려
history 객체를 사용하여 페이지를 조작할 때 사용자 경험에 주의해야 합니다. 잘못된 사용으로 인해 사용자가 불편함을 느낄 수 있으므로 신중하게 사용해야 합니다.

2. 단일 페이지 애플리케이션(SPA) 주의
history 객체는 단일 페이지 애플리케이션(SPA)에서 라우팅을 관리하는 데 사용됩니다. 하지만 SPA에서 history 객체를 사용할 때 브라우저 역사와 충돌할 수 있는 문제를 다루어야 할 수 있습니다.

3. 브라우저 뒤로가기와 연동
history 객체로 페이지를 조작할 때 브라우저의 뒤로 가기와 앞으로 가기 기능도 함께 고려해야 합니다. 사용자가 기대하는 대로 동작하지 않을 수 있으므로 브라우저의 기본 동작과 함께 사용하는 것이 중요합니다.

4. 서버 사이드 라우팅과 연동
서버 사이드 라우팅과 함께 사용하는 경우, history 객체를 이용하여 클라이언트 사이드에서 라우팅을 관리할 때 서버와 동기화되도록 조정해야 합니다.

5. IE와 호환성
구형 브라우저인 Internet Explorer에서는 history 객체를 지원하는데 제약이 있을 수 있습니다. IE의 경우 hash를 활용하는 라우팅 방식이 더 안정적일 수 있습니다.

6. 보안 이슈
history 객체를 사용하여 URL을 조작할 때 보안 이슈가 발생할 수 있습니다. 사용자 입력을 적절하게 검증하거나, 서버 측에서도 유효성을 검사하여 보안을 강화해야 합니다.


history 객체를 사용할 때는 브라우저 지원을 확인하고, 사용자 경험과 보안 등 다양한 측면을 고려하여 신중하게 구현해야 합니다.






최종 정리

오늘은 자바스크립트의 History API에 대한 내용을 주제로 정리해 보았습니다. History API는 웹 브라우저의 뒤로 가기, 앞으로 가기, 페이지 전환 등의 기능을 조작하고 관리하는 강력한 도구입니다. 이를 통해 웹 애플리케이션의 라우팅을 보다 유연하게 다룰 수 있으며, 사용자 경험을 개선하는 데 도움이 됩니다.


그럼 다음 포스팅에서도 자바스크립트의 다양한 주제들로 내용을 정리해 보도록 하겠습니다.

감사합니다.

728x90
반응형