Computer >> 컴퓨터 >  >> 프로그래밍 >> Ruby

Rails 내장 캐시 저장소 완벽 가이드: 종류별 특징과 선택 기준

새로운 Rails 앱을 생성하면 캐싱은 이미 설정되어 있습니다. 덕분에 cache 헬퍼로 뷰 조각을 감싸거나 Rails.cache.fetch로 외부 API 결과를 저장하는 것만으로도 빠르게 시작할 수 있습니다. 캐시된 데이터는 Rails의 캐시 저장소(cache store) 중 하나에 보관되며, 메모리, Memcached, Redis에 저장하거나 디스크에 직접 기록할 수도 있습니다.

그렇다면 여러 캐시 저장소 중 어떤 것이 어떤 상황에 가장 적합할까요? 이 글에서는 각 옵션의 특징과 장단점을 하나씩 살펴보겠습니다.

👋 이 글이 마음에 드셨다면 Ruby (on Rails) 성능에 관한 다른 글들도 확인해 보세요. 저희가 정리한 Ruby 성능 모니터링 체크리스트도 함께 참고하시길 추천합니다.

1. 파일 저장소(File Store)

별도의 캐시 저장소가 설정되지 않으면 기본적으로 :file_store가 사용됩니다. 이름 그대로 파일 시스템에 캐시 항목을 기록하는 방식으로, 애플리케이션 루트 디렉터리의 tmp/cache 폴더에 저장됩니다. 다른 위치를 사용하고 싶다면 cache_store 설정을 :file_store로 명시하고 원하는 경로를 함께 지정하면 됩니다.

config.cache_store = :file_store , "/path/to/cache/directory"

캐시 파일은 디스크에 저장되며 자동으로 삭제되지 않습니다. 따라서 디스크가 가득 차지 않도록 직접 관리해야 합니다. 예를 들어 주기적으로 Rails.cache.cleanup을 실행하면 만료된 항목이 정리되어 캐시를 깨끗하게 유지할 수 있습니다.

파일 저장소는 개발 환경에서 특히 유용합니다. 각 항목이 캐시 디렉터리에 개별 파일로 저장되기 때문에 해당 파일을 삭제하기만 하면 특정 항목을 캐시에서 바로 제거할 수 있습니다. 캐시 무효화(invalidation) 로직을 테스트할 때 큰 도움이 됩니다.

프로덕션 환경에서는 모든 서버 프로세스가 동일한 파일 시스템을 공유할 때 유용합니다. 메모리 기반 캐시보다는 느리지만, 캐시 용량이 매우 커질 가능성이 있는 경우라면 좋은 선택이 될 수 있습니다.

2. 메모리 저장소(Memory Store)

Rails 5.0부터는 새 애플리케이션 생성 시 개발 환경 설정에 :memory_store가 자동으로 구성됩니다. 메모리 저장소를 사용하면 캐시 데이터가 Ruby 웹 서버 프로세스의 메모리에 보관됩니다.

데이터가 웹 서버와 같은 프로세스의 메모리에 저장되므로, 개발 서버를 재시작할 때마다 캐시가 자동으로 비워집니다. 이러한 특성 덕분에 개발 환경에서 사용하기에 매우 적합합니다.

기본적으로 메모리 저장소는 32MB를 사용하지만, 캐시 저장소 설정 시 :size 옵션을 전달하여 이 값을 변경할 수 있습니다.

config.cache_store = :memory_store, { size: 16.megabytes }

캐시가 가득 차면 가장 오랫동안 사용되지 않은(least recently used) 항목이 자동으로 제거되어 새 항목을 위한 공간이 확보됩니다.

프로덕션 환경에서 메모리 저장소를 사용하는 것도 가능하며, 속도 면에서는 사실상 가장 빠른 방식입니다. 다만 여러 서버 프로세스를 실행하는 시스템에는 권장되지 않습니다. 프로세스 간에 서로의 캐시에 접근할 수 없기 때문에, 각 프로세스가 자신만의 캐시 복사본을 따로 유지해야 하기 때문입니다.

3. 멤키지 저장소(Memcache Store)

:mem_cache_store는 Dalli 젬(gem)과 Memcached를 사용하여 캐시 항목을 중앙화된 인메모리 캐시에 저장합니다.

데이터는 Ruby 서버 프로세스가 아닌 별도의 프로세스에 보관됩니다. 그래서 앱을 재시작해도 캐시가 사라지지 않고, Memcached 서버가 실행되는 한 계속 메모리에 유지됩니다. 물론 Memcached 서버 자체를 재시작하면 새로운 상태의 캐시로 시작하게 됩니다.

멤키지 저장소는 기본적으로 캐시 서버가 localhost에서 실행 중이라고 가정하지만, 하나 이상의 주소를 전달하여 원격 서버를 사용할 수도 있습니다.

config.cache_store = :mem_cache_store, "cache-1.example.com", "cache-2.example.com"

Memcached는 기본적으로 최대 캐시 크기가 64MB로 설정되어 있지만, 명령줄 옵션이나 memcached.conf 파일을 통해 변경할 수 있습니다. 메모리 저장소와 마찬가지로 캐시가 최대 크기에 도달하면 가장 오랫동안 사용되지 않은 항목부터 제거하기 시작합니다.

:mem_cache_store는 프로덕션 환경의 대표적인(go-to) 캐시 저장소입니다. 중앙화된 Memcached 서버를 사용하면 여러 웹 서버 간에 캐시를 공유할 수 있고, 원격 Memcached 서버를 사용하면 여러 호스트에 걸쳐서도 캐시 공유가 가능합니다.

4. Redis 캐시 저장소(Redis Cache Store)

Rails 5.2에서 도입된 :redis_cache_store를 사용하면 Memcache 저장소와 유사한 방식으로 Redis에 캐시 항목을 저장할 수 있습니다.

Redis를 Rails 캐시 저장소로 사용할 때는 기존에 사용 중인 Redis 서버를 그대로 가리키기보다, LRU(Least Recently Used) 캐시로 설정된 전용 Redis 캐시 인스턴스를 사용하는 것이 좋습니다. 이렇게 해야 캐시가 최대 크기에 도달했을 때 항목이 올바르게 제거됩니다.

Redis 저장소는 Redis 젬(Redis::Distributed 포함)과 hiredis를 지원하며, 단일 또는 복수의 원격 서버 설정 등 다양한 구성 옵션도 제공합니다.

cache_servers = %w[redis://cache-01:6379/0 redis://cache-02:6379/0]
config.cache_store = :redis_cache_store, { url: cache_servers }

Redis는 주기적으로 데이터셋을 디스크에 기록하므로, 캐시 서버가 재시작되어도 대부분의 캐시 데이터가 보존됩니다. 개발 환경에서는 콘솔에서 Rails.cache.delete를 사용해 캐시 항목을 손쉽게 삭제할 수 있습니다.

프로덕션 환경에서 Redis는 중앙화된 캐시 저장소라는 측면에서 Memcached에 필적하는 강력한 선택지입니다. 아직 Rails 앱에서의 사용률은 Memcached만큼 높지 않지만, 앞으로 Redis 저장소가 널리 사용되는 대표적인 Rails 캐시 저장소로 자리 잡을 가능성이 높습니다.

어떤 캐시 저장소를 사용해야 할까?

일반적으로 Rails의 파일 저장소와 메모리 저장소는 개발 환경에 매우 적합하며, 각각의 특성과 한계를 잘 이해하고 있다면 소규모 애플리케이션의 프로덕션 환경에서도 충분히 활용할 수 있습니다. 반면 대규모 프로덕션 앱이라면, 특히 여러 호스트에서 여러 웹 서버를 운영하는 경우에는 Memcached나 Redis 같은 프로덕션급 저장소가 일반적으로 더 나은 선택입니다.

이상으로 Rails 캐시 저장소에 대한 개요를 마칩니다. 각 저장소에 대한 더 자세한 정보와 설정 옵션은 Rails 공식 가이드의 Cache stores 섹션을 참고해 보세요.

이 글과 AppSignal Academy 시리즈의 다른 글들은 어떠셨나요? Rails 캐싱에 관한 글을 더 준비하고 있습니다. 다음에 다루었으면 하는 주제(캐싱 관련이든 아니든)가 있다면 언제든 의견을 들려주세요!