뷰 캐싱은 뷰가 생성하는 HTML을 저장하여 재사용하는 Rails의 강력한 기능입니다. 캐시 스토어로는 개발 환경에서는 memory_store가 편리하지만, 프로덕션 환경에서는 Memcached나 Redis와 같은 독립형 캐싱 서버를 사용하는 것이 일반적입니다.
뷰 캐싱 활성화 및 기본 사용
-
config.cache_store설정을 통해 캐시 스토어를 지정할 수 있습니다. -
rails dev:cache명령어로 개발 환경에서 캐싱을 쉽게 켜고 끌 수 있습니다. -
<% cache do %> ... <% end %>블록을 사용하여 특정 코드 블록의 결과를 캐싱합니다. 첫 로딩 시에는 블록 내부가 실행되지만, 이후에는 캐시된 결과가 즉시 반환됩니다.
캐시 무효화 전략: cache(@object)
-
단순히
cache do를 사용하는 경우, 데이터 변경 시 캐시가 무효화되지 않아 오래된 정보가 표시될 수 있습니다. -
cache(@user) do와 같이 모델 객체를cache메서드에 전달하면, 해당 모델의updated_at속성을 기반으로 캐시 키가 생성됩니다. 모델이 업데이트될 때마다 캐시가 자동으로 무효화되어 최신 내용이 렌더링됩니다.
러시안 인형 캐싱 (Russian Doll Caching)
-
중첩된 모델(예: User와 Post)의 경우, 상위 모델만 캐싱하면 하위 모델이 변경되어도 캐시가 무효화되지 않는 문제가 발생합니다.
-
이를 해결하기 위해
cache(@user) do ... <% cache(post) do %> ... <% end %> ... <% end %>와 같이 캐시 블록 안에 또 다른 캐시 블록을 중첩하여 사용합니다. 이를 러시안 인형 캐싱이라고 합니다. -
하위 모델이 업데이트될 때 상위 모델의
updated_at을 자동으로 갱신하려면belongs_to관계에touch: true옵션을 추가해야 합니다 (예:belongs_to :user, touch: true).
컬렉션 캐싱의 효율성
<%= render partial: 'posts/post', collection: @posts, cached: true %>구문은 컬렉션의 각 항목에 대해 캐싱을 적용하며,multiget기능을 활용하여 캐시 스토어에 대한 단일 왕복으로 여러 키/값 쌍을 읽을 수 있어 효율적입니다.
동적 페이지 콘텐츠 처리
-
일부 페이지는 전체 페이지보다 훨씬 빠르게 변경되는 동적 콘텐츠(예: 오늘의 요일, 활동 피드)를 포함할 수 있습니다.
-
이러한 콘텐츠를 캐싱 블록에 포함하면 캐시 무효화 빈도가 높아져 캐싱의 이점이 상쇄될 수 있습니다.
-
해결책으로는 JavaScript를 사용하여 동적 콘텐츠를 나중에 채우는 “JavaScript sprinkles” 방식이나, 동적 콘텐츠 부분을 캐싱 블록 외부로 분리하는 방법이 있습니다.