캐싱
캐싱
캐싱이란 빈번하게 접근되는 데이터를 빠르게 저장하고 검색하기 위한 기술로, 원래의 느린 저장 매체에서 반복적으로 데이터를 가져와야 할 필요를 줄여준다. 데이터의 복사본을 주저장매체보다 더 빠르게 접근할 수 있는 위치에 저장하여 속도의 향상을 이루어낸다. 캐싱은 브라우저 캐싱, 애플리케이션 레벨 캐싱, 데이터베이스 캐싱 등 다양한 수준에서 구현할 수 있으며, 캐싱을 통해 레이턴시 감소, 네트워크 트래픽 감소, 서버 및 데이터베이스 부하 감소를 이루어내 애플리케이션의 성능을 향상시키기도 한다.
일반적으로 사용되는 캐싱 전략은 운영체제의 페이지 교체 알고리즘과 비슷하다. 시간에 기반한 캐싱과, LRU(Least Recently Used) 등의 알고리즘을 채택하여 캐싱할 데이터를 정한다. 캐싱은 속도와 성능의 향상을 모두 불러오지만 데이터의 일관성을 유지하는 데 어려움도 동반한다.
서버 사이드 vs 클라이언트 사이드 캐싱
서버 사이드 캐싱
서버 사이드 캐싱과 클라이언트 사이드 캐싱은 데이터에 접근하는 데 필요한 부하를 줄이고 성능을 향상시키는 두가지 방법이다.
서버 사이드 캐싱은 데이터를 애플리케이션 또는 데이터베이스가 있는 서버에 캐싱하며, 인메모리 방식(Redis, Memcached)을 사용하거나 또는 디스크에 캐싱한다. 서버는 요청을 받은 후 데이터베이스에 쿼리하거나 복잡한 계산을 하기 전 캐시를 먼저 확인하며, 이러한 특징으로 인해 데이터베이스 쿼리, API 응답 등을 캐싱한다.
이러한 방식을 사용하면 서버의 부하를 줄일 수 있으며, 자원을 사용하는 여러 반복적인 연산을 피할 수 있기 때문에 더 많은 사용자에 동시에 대응이 가능하다.
다만, 이런 방식은 캐시된 데이터를 더 많이 보관하기 위해 서버의 절대적인 메모리 양이 더 필요하며, 동적인 환경에서 캐싱된 데이터의 일관성을 보장하기 쉽지 않다.
클라이언트 사이드 캐싱
클라이언트 사이드 캐싱은 데이터를 로컬 환경, 즉 사용자의 브라우저나 모바일 기기에 보관함으로 서버로 요청을 보내지 않고 데이터를 받을 수 있는 방식이다.
일반적으로 HTML, CSS, 이미지 등의 정적 데이터를 보관하여 반복적인 서버로의 요청을 최소화한다.
이 방식은 네트워크 전송량을 줄일 수 있으며, 캐싱된 정적 데이터에 대해서는 사용자 기기에서 직접 로딩됨으로 속도가 향상된다.
Redis
인 메모리 데이터 구조 저장소로, 빠른 속도와 유연성을 제공한다. 문자열, 리스트, 셋, 해시, 등 다양한 자료구조를 지원하며, 캐싱, 세션 관리, 실시간 분석 등의 기능들이 있다.