Rails 캐싱 전략 — 페이지, 프래그먼트, 러시아 인형 캐시

2025. 8. 12. 09:00·Ruby On Rails
728x90
반응형

빠른 웹사이트는 사용자 경험을 향상시키고, 서버 부하도 줄여줍니다.
Rails는 이를 위해 강력한 캐싱 기능을 기본 제공하고 있어요.
이번 글에서는 Rails의 세 가지 주요 캐싱 전략인 페이지 캐시, 프래그먼트 캐시, 러시아 인형 캐시(Russian Doll Caching)를 하나씩 예제와 함께 설명해볼게요.


📄 1. 페이지 캐시 (Page Caching)

전체 HTML 페이지를 캐싱해서, 컨트롤러를 거치지 않고 직접 파일을 서빙합니다.
하지만 이는 Rails 4 이후 core에서 제거되었고, 현재는 nginx 등 웹서버에서 직접 구현하는 것이 일반적이에요.

# 사용 권장 ❌ (대신 nginx로 정적 파일 처리 권장)

예전에는 다음과 같이 썼습니다:


caches_page :index

이 글에서는 더 실용적인 프래그먼트 캐싱부터 다뤄볼게요.


🧩 2. 프래그먼트 캐시 (Fragment Caching)

페이지 전체가 아니라, 일부 뷰 블록 단위로 캐싱하는 전략입니다.

✅ 예제


<% cache(@post) do %>
  <div class="post">
    <h2><%= @post.title %></h2>
    <p><%= @post.body %></p>
  </div>
&lt% end %>

@post 객체의 cache_key를 기준으로 캐싱됩니다.

🔁 자동 무효화

Post 객체가 업데이트되면 cache_key가 바뀌므로 자동으로 캐시가 무효화됩니다.


@post.update(title: "새 제목") # => 새로운 캐시가 생성됨

🪆 3. 러시아 인형 캐시 (Russian Doll Caching)

프래그먼트 캐시를 중첩 구조로 사용하는 전략입니다.
예를 들어, Post 내부에 Comment 목록이 있고, 그 각각도 캐싱한다면?

✅ 예제


<% cache(@post) do %>
  <div class="post">
    <h2><%= @post.title %></h2>

    <% cache([@post, @post.comments]) do %>
      <ul>
        <% @post.comments.each do |comment| %>
          <li><%= comment.body %></li>
        <% end %>
      </ul>
    <% end %>

  </div>
&lt% end %>

cache([@post, @post.comments])는 댓글 목록이 바뀌면 해당 블록만 무효화되도록 도와줍니다.


💾 캐시 저장소 설정

Rails는 다양한 캐시 저장소를 지원합니다. 기본은 메모리지만, Redis나 Memcached를 추천합니다.

✅ Redis 설정

# Gemfile
gem 'redis-rails'
# config/environments/production.rb
config.cache_store = :redis_cache_store, { url: ENV['REDIS_URL'] }

✅ 캐시 활성화


# config/environments/development.rb
config.action_controller.perform_caching = true

🧪 캐시 키 직접 지정


<% cache(["post", post.id, post.updated_at]) do %>
  ...
<% end %>

updated_at을 포함하면 수정 시 자동으로 캐시가 무효화돼요.


🧹 캐시 무효화 & 삭제


Rails.cache.delete("some_cache_key")

혹은 전체 삭제도 가능합니다:


Rails.cache.clear

🎯 마치며

Rails의 캐시 전략은 매우 강력하면서도 간단하게 사용할 수 있습니다.
특히 러시아 인형 캐시는 부분 캐싱과 자동 무효화가 조화를 이루어, 실제 서비스에서 매우 유용하죠.
성능을 높이고 싶다면 꼭 한 번 적용해보세요!

728x90
반응형

'Ruby On Rails' 카테고리의 다른 글

API 서버로서의 Rails — Rails + React/Vue 조합 만들기  (2) 2025.08.14
Rails에서 환경변수 관리 — dotenv와 secrets.yml  (3) 2025.08.07
Capistrano로 자동 배포 파이프라인 만들기  (2) 2025.08.05
Heroku로 Rails 앱 배포하기 — 빠르고 간단한 클라우드 배포  (2) 2025.07.31
Rails 앱 보안 점검 — CSRF, SQL Injection 막기  (2) 2025.07.29
'Ruby On Rails' 카테고리의 다른 글
  • API 서버로서의 Rails — Rails + React/Vue 조합 만들기
  • Rails에서 환경변수 관리 — dotenv와 secrets.yml
  • Capistrano로 자동 배포 파이프라인 만들기
  • Heroku로 Rails 앱 배포하기 — 빠르고 간단한 클라우드 배포
코드를 걷는 사람
코드를 걷는 사람
devwanderer 님의 블로그 입니다.
  • 코드를 걷는 사람
    터미널 밖으로 나온 개발자
    코드를 걷는 사람
  • 전체
    오늘
    어제
    • 분류 전체보기 N
      • Flutter
        • Flutter 게시판 앱 만들기
        • Flutter 뉴스 앱 만들기
        • Flutter 메모 앱 만들기
        • Flutter 캘린더 앱 만들기
        • Flutter 날씨 앱 만들기
      • Next.js
      • Ruby On Rails N
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    ActiveRecord
    RubyOnRails
    Flutter
    fluttertips
    메모앱
    flutterui
    날씨앱
    UI디자인
    캘린더앱
    모바일앱개발
    openweather
    개발블로그
    flutter게시판
    flutter디자인
    flutter개발
    table_calendar
    백엔드개발
    rails보안
    flutter상태관리
    다크모드
    flutter기초
    Firebase
    Nextjs
    정적사이트
    감성앱
    북마크기능
    UIUX
    뉴스앱
    코드를걷는사람
    flutter앱개발
  • 최근 댓글

  • 최근 글

  • 반응형
    250x250
  • hELLO· Designed By정상우.v4.10.3
코드를 걷는 사람
Rails 캐싱 전략 — 페이지, 프래그먼트, 러시아 인형 캐시
상단으로

티스토리툴바