세션 저장소 기반 탭 전환 문제 해결: Turbo 캐시 무효화 활용

Hotwire Caching Problem | Flagrant

작성자
발행일
2025년 09월 02일

핵심 요약

  • 1 기존 세션 저장소 기반 탭 관리는 외부 `link_to`를 통한 탭 전환 시 캐싱된 값으로 인해 의도치 않은 탭이 표시되는 문제가 있었습니다.
  • 2 `Turbo.cache.exemptPageFromCache()` 메서드를 활용하여 `link_to` 클릭 시 페이지 캐시를 무효화하는 Stimulus 액션을 구현하여 문제를 해결했습니다.
  • 3 이 해결책을 통해 사용자는 외부 링크를 통해 원하는 탭으로 정확하게 이동할 수 있게 되어 사용자 경험이 크게 개선되었습니다.

도입

현재 웹 애플리케이션에서 사용자 대시보드의 "탭"은 세션 저장소를 통해 관리됩니다. 사용자가 탭을 클릭하면 Stimulus 컨트롤러가 해당 탭의 제목을 세션 저장소에 저장하여, 사용자가 페이지를 다시 방문할 때 마지막으로 선택했던 탭을 기억하게 함으로써 원활한 사용자 경험을 제공했습니다. 이 방식은 일반적인 페이지 내비게이션에는 효과적이었으나, 애플리케이션의 다른 부분에서 `link_to`를 통해 특정 탭으로 직접 이동하려는 새로운 기능 요청이 발생하면서 문제가 드러났습니다.

문제점: 세션 저장소의 한계

현재 대시보드 탭은 Stimulus 컨트롤러를 통해 세션 저장소(sessionStorage.setItem(...))에 선택된 탭 정보를 저장하여 사용자가 페이지를 재방문할 때 마지막 상태를 유지합니다. 이는 일반적인 내비게이션에는 유용하지만, 애플리케이션 내 다른 곳에서 link_to를 통해 특정 탭으로 직접 이동하려는 새로운 기능 요청에서 문제가 발생했습니다. link_to가 클릭되어도 페이지는 세션 저장소에 캐싱된 이전 탭 정보를 우선적으로 로드하여, link_to가 의도하는 탭이 아닌 기존 탭이 표시되는 현상이 나타났습니다. 이는 사용자 경험을 저해하는 요인이었습니다.

해결책: Turbo 캐시 무효화 활용

이 문제를 해결하기 위해 Hotwire의 Turbo 프레임워크가 제공하는 캐시 관리 기능을 활용했습니다. Turbo는 특정 페이지를 캐시에서 제외시키는 메서드를 제공합니다.

  • Stimulus 액션 추가: link_to 요소에 `data: { action: ‘submenu

clearCache’ } 속성을 추가하여, 링크 클릭 시 clearCache` Stimulus 액션이 실행되도록 합니다.

  • clearCache 함수 구현: Stimulus 컨트롤러 내부에 다음과 같은 clearCache() 메서드를 정의합니다. javascript clearCache() { Turbo.cache.exemptPageFromCache(); } Turbo.cache.exemptPageFromCache() 메서드는 현재 페이지가 Turbo의 캐시에서 제외되도록 지시합니다. 이로 인해 다음 페이지 로드 시 캐시된 버전 대신 서버로부터 새로운 페이지를 요청하게 됩니다.

결과

이러한 구현을 통해 link_to가 클릭될 때마다 페이지 캐시가 무효화되고 서버로부터 최신 페이지가 로드됩니다. 결과적으로 세션 저장소의 캐싱된 탭 정보에 얽매이지 않고 link_to가 가리키는 정확한 탭이 표시되어, 새로운 기능 요구사항을 성공적으로 충족시키고 사용자 경험을 크게 향상시켰습니다.

결론

세션 저장소는 사용자 상태를 유지하는 데 유용하지만, 외부 링크를 통한 특정 상태 강제 전환과 같은 시나리오에서는 캐싱된 데이터로 인해 예상치 못한 동작을 유발할 수 있습니다. 본 문제 해결 사례는 Hotwire의 Turbo가 제공하는 `exemptPageFromCache` 기능을 활용하여 이러한 캐싱 문제를 효과적으로 극복하는 방법을 제시합니다. 이 접근 방식은 세션 저장소의 장점을 유지하면서도, 특정 상황에서 강제로 페이지 상태를 초기화하여 일관된 사용자 경험을 제공하는 유연성을 확보할 수 있음을 보여줍니다. 이는 복잡한 웹 애플리케이션에서 캐싱 전략을 설계할 때 중요한 고려사항이 됩니다.

댓글 0

댓글 작성

0/1000
정중하고 건설적인 댓글을 작성해 주세요.

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!