캐싱(Caching)은 컴퓨터 과학에서 매우 중요한 개념이며, 웹 애플리케이션 개발과도 직접적인 연관이 있습니다. 캐싱의 핵심 원리는 간단합니다. 메모리 조회가 데이터베이스 쿼리보다 훨씬 빠르고 컴퓨팅 자원도 적게 소모된다는 점을 활용하는 것입니다. 반복적으로 실행될 가능성이 높은 데이터베이스 쿼리가 있다면, 그 결과를 캐시에 저장해두는 것만으로도 실행 흐름 전체를 크게 가속할 수 있습니다. Rails 애플리케이션도 예외는 아니며, 많은 프로젝트에서 Redis 같은 메모리 기반 캐시를 사용해 데이터를 저장하고 애플리케이션 성능을 개선하고 있습니다.

데이터베이스를 캐시로 사용한다는 발상은 얼핏 비효율적으로 들릴 수 있습니다. 하지만 역설적이게도, Solid Cache처럼 상대적으로 느린 데이터베이스 기반 캐시를 사용하면 오히려 애플리케이션이 더 빨라질 수 있습니다. 그 이유는 저렴한 저장소 덕분에 더 많은 데이터를 더 오랜 기간 동안 캐싱해둘 수 있기 때문입니다. Rails 7.1에 정식으로 도입된 Solid Cache는 이제 데이터베이스 기반 애플리케이션 캐시를 손쉽게 선택할 수 있게 해줍니다.
Rails 캐시의 작동 방식
Ruby on Rails에서 캐싱은 애플리케이션 성능 최적화의 핵심 요소입니다. 개발자가 활용할 수 있는 캐싱 유형은 다양합니다. 페이지 캐싱(page caching), 액션 캐싱(action caching), 프래그먼트 캐싱(fragment caching), 로우레벨 캐싱(low-level caching), SQL 캐싱 등이 대표적입니다. 이 글에서는 설정이 간단하고 cache_store와 호환되는 로우레벨 캐싱을 중심으로 살펴보겠습니다.
Rails 프레임워크의 핵심 구성 요소인 ActiveSupport는 cache_store를 통해 캐시와 상호작용하고 설정할 수 있는 인터페이스를 제공합니다. config/environments/ 디렉토리에는 환경별 설정 파일이 존재하며, 여기서 캐시 스토어 선택을 포함한 다양한 구성을 지정할 수 있습니다.
cache_store 값 설정하기
Redis는 업계 전반에서 폭넓게 채택된 가장 인기 있는 캐시 스토어입니다. 프로덕션 환경에서 Redis로 캐싱을 처리하는 애플리케이션이라면 config/environments/production.rb 파일에서 다음과 같은 코드를 확인할 수 있습니다.
config.cache_store = :redis_cache_store
Redis를 사용하는 이유는 메모리 캐시이기 때문입니다. 메모리는 디스크 접근이나 데이터베이스 쿼리보다 전통적으로 훨씬 빠른 읽기 속도를 제공해왔습니다.
Rails에서 데이터베이스 쿼리 캐싱하기
자주 변경되지 않는 데이터를 반환하는 비용이 큰 데이터베이스 쿼리의 결과를 로우레벨 캐싱으로 저장할 수 있습니다. 코드는 대략 다음과 같습니다.
Rails.cache.fetch("courses", expires_in: 12.hours) do
Courses.all
end
Redis를 캐시 스토어로 사용하는 경우, 위 코드는 먼저 "courses"라는 키에 지난 12시간 이내에 저장된 값이 있는지 확인합니다. 값이 존재하면 코드 블록을 실행하지 않고 즉시 해당 값을 반환합니다. 만약 캐시에 값이 없다면 이를 "캐시 미스(cache miss)"라고 부릅니다. 캐시 미스가 발생하면 인터프리터가 블록을 실행하고, 그 결과를 캐시에 저장한 뒤 결과를 반환하게 됩니다.
Rails Solid Cache란 무엇인가?
앞서 살펴본 캐싱 패턴이 성능상 이점을 제공하는 이유는 메모리 접근이 API 호출이나 데이터베이스 쿼리보다 빠르기 때문입니다. 하지만 메모리는 비싸고, 그만큼 용량도 제한적입니다. 메모리가 한정되어 있기 때문에 캐시에 무엇을, 얼마나 오래 저장할지 신중하게 결정해야 합니다. 모든 데이터를 무기한 캐싱하면 금세 캐시 메모리가 고갈됩니다. 결국 캐싱의 성능 이점은 모두 트레이드오프의 문제입니다. 시간이 많이 걸리는 작업의 반복을 피하기 위해 일부 데이터를 일정 기간 동안만 캐싱하는 것이죠.
Rails 7.1 릴리스에는 Solid Cache가 함께 포함되었습니다. 이는 SQL 데이터베이스를 캐시 스토어로 사용하는 ActiveRecord::Cache::Store 옵션입니다. 캐시에서 읽을 때마다 속도는 다소 느려지지만, 기술의 발전과 수많은 데이터베이스에 내장된 메모리 캐시 덕분에 그 차이는 여전히 충분히 유용한 수준입니다.
SQL 데이터베이스를 캐시 스토어로 사용하면 훨씬 낮은 비용으로 수 배 이상의 저장 공간을 확보할 수 있습니다. 이를 통해 애플리케이션은 더 많은 데이터를 더 긴 기간 동안 캐싱할 수 있습니다. 실제로 Basecamp 팀은 이러한 방식이 어떻게 애플리케이션 속도를 향상시켰는지에 대한 글을 발표했는데, 겉보기에는 다소 직관에 어긋나 보일 수 있는 내용입니다.
Solid Cache는 언제 사용해야 할까?
Redis 같은 메모리 캐시가 일반적으로 더 빠른 읽기 속도를 제공하지만, Solid Cache는 여러 시나리오에서 훌륭한 대안이 됩니다.
첫째, 애플리케이션이 대용량 데이터를 캐싱해야 하는 경우입니다. 막대한 데이터를 메모리에 저장하면 비용이 감당하기 어려운 수준까지 치솟을 수 있습니다. Solid Cache는 훨씬 큰 캐시 용량을 극히 일부의 비용으로 제공합니다.
둘째, 캐시 조회 시 몇 밀리초 추가되는 지연에 민감하지 않은 애플리케이션의 경우입니다. 이 정도의 잠재적 지연 증가를 감수할 수 있다면, Solid Cache는 성능과 비용 사이에서 훌륭한 균형점을 제공합니다.
셋째, 별도의 Redis 인스턴스를 운영하는 것이 현실적으로 어려운 환경입니다. Solid Cache를 사용하면 Redis를 추가로 지원할 필요 없이 기존 데이터베이스로 캐싱을 처리할 수 있어 배포가 크게 단순해집니다.
Solid Cache 설치하기
Solid Cache의 공식 Readme에는 Rails 애플리케이션에 도입하는 방법이 잘 정리되어 있습니다. 먼저 Gemfile에 gem을 추가합니다.
gem "solid_cache"
다음으로 Bundler로 설치를 진행합니다.
bundle install
이후 데이터베이스가 Solid Cache와 함께 작동하도록 마이그레이션을 추가해야 합니다. 아래 명령어를 실행하세요.
bin/rails solid_cache:install:migrations
마지막으로 생성된 마이그레이션을 실행합니다.
bin/rails db:migrate
Rails 앱에 Solid Cache 적용하기
기존 캐시를 Solid Cache로 교체하는 작업은 대체로 간단합니다. config/environments/production.rb 같은 환경 설정 파일에서 cache_store 설정을 다음과 같이 변경하면 됩니다.
config.cache_store = :solid_cache_store
Solid Cache를 캐시 스토어로 사용하기 위해 필요한 설정은 이것이 전부입니다. ActiveSupport::Cache::Store의 기존 설정 옵션을 모두 지원할 뿐만 아니라, 데이터베이스 샤딩(sharding)이나 기타 특수한 요구사항을 위한 추가 옵션도 제공합니다.
단, 위 설정은 프로덕션 환경의 캐시 스토어만 변경한다는 점에 유의하세요. 다른 환경에서도 테스트할 계획이라면 해당 환경의 설정값도 함께 변경해야 합니다.
Rails에서 Solid Cache로 전환할 준비가 되셨나요?
Rails 7.1에 Solid Cache가 도입된 것은 Rails 캐싱 전략의 중요한 전환점이었습니다. 이 솔루션은 Redis 같은 메모리 기반 캐시에 대한 전통적인 선호에 도전하며, 애플리케이션 성능 최적화에 대한 새로운 관점을 제시합니다.
SQL 데이터베이스를 캐싱에 활용함으로써 Solid Cache는 애플리케이션이 더 많은 데이터를 더 오랜 기간 저장할 수 있게 해주고, 메모리 스토리지의 비용과 용량 제약이라는 한계를 극복합니다. 이 접근 방식은 효과적으로 캐싱할 수 있는 데이터의 양을 넓힐 뿐만 아니라, 더 큰 성능 향상으로 이어질 잠재력도 지니고 있습니다.
물론 전환 여부는 애플리케이션의 구체적인 요구사항에 따라 달라집니다. 고속 캐싱의 이점이 크고 Redis를 지원할 인프라가 이미 갖춰져 있다면 Solid Cache가 꼭 필요하지 않을 수 있습니다. 하지만 스택에 새로운 서비스를 추가하지 않으면서도 방대한 데이터를 비용 효율적으로 캐싱하고 싶다면, Solid Cache는 충분히 검토할 가치가 있습니다. 단순히 Redis 운영 부담을 피하고 싶은 경우에도, Solid Cache는 여러분의 앱에 충분히 훌륭한 선택이 될 것입니다.