캐싱이란 무엇인가? 

캐싱(Caching)은 데이터나 결과를 임시 저장소에 저장하여 동일한 데이터에 대한 반복적인 요청을 더 빠르게 처리할 수 있도록 하는 기술이다. 캐싱을 사용하면 데이터를 매번 새로 가져오거나 계산하지 않아도 되므로, 시스템의 성능을 최적화하고 응답속도를 높이며 자원소비를 줄일 수 있습니다. 

 

캐싱의 기본 동작 원리 

캐싱은 다음과 같은 단계를 거쳐 작동합니다. 

1. 요청 발생 : 사용자가 어떤 데이터를 요청합니다. 

2. 캐시확인: 시스템이 캐시에 해당 데이터가 저장되어 있는지 확인합니다. 

- 데이터가 캐시에 있다면 이를 캐시 히트(cache hit)라고 하며 캐시에서 데이터를 바로 반환합니다. 

- 데이터가 캐시에 없다면 이를 캐시 미스(cache miss)라고 하며 데이터 소스 (예: 데이터 베이스)에서 데이터를 가져옵니댜. 

3. 캐시에 저장 : 캐시에 데이터가 없는 경우 가져온 데이터를 캐시에 저장합니다. 

4. 응답 반환 : 데이터를 요청한 사용자에게 반환합니다. 

 

캐싱의 종류 

캐싱은 시스템의 계층과 데이터의 사용 목적에 따라 여러 유형으로 나눌 수 있습니다. 

1. 메모리 캐싱 

- 데이터를 RAM과 같은 빠른 메모리에 저장합니다. 

- 예 : Redis, Memcached

- 장점: 빠른 속도로 데이터를 제공합니다. 

- 단점: 데이터의 용량이 메모리 크기에 제한된다. 

2. 디스크 캐싱

- 데이터를 디스크에 저장하여 캐싱한다. 

- 브라우저의 http캐시 (이미지, CSS파일 등 ) 

- 장점 : 더 많은 데이터를 저장할 수 있다. 

- 단점 : 메모리 캐싱보다 속도가 느리다. 

3. 브라우저 캐싱 

- 사용자가 웹 페이지를 요청할 때 CSS, JS, 이미지와 같은 정적 파일을 브라우저에 캐싱한다. 

- 장점 : 서버 요청을 줄이고 웹페이지 로드 속도를 개선한다. 

- 단점: 캐시가 오래된 경우, 최신 버전의 파일을 사용하지 못할 수 있다. 

4. 애플리케이션 캐싱 

- 애플리케이션 코드에서 데이터를 캐싱하여 중복 작업을 방지한다. 

- 예: React의 상태관리 라이브러리 (Recoil, Redux)에서 사용하는 메모리 캐시 

5. 데이터베이스 캐싱 

- 데이터베이스 조회 결과를 캐싱하여 동일한 쿼리에 대한 중복 요청을 방지한다. 

- 예 : mysql Query cache, postgresql의 materialized view

6. 분산캐싱

- 대규모 시스템에서 여로 노드에 걸쳐 데이터를 캐싱한다. 

- 예 content delivery network, Redis Cluster

 

캐싱의 주요 전략 

1. TTL (Time To Live) 

- 캐시에 저장된 데이터가 유효한 시간을 설정한다. TTL이 지나면 데이터를 만료시킨다. 

- 예: 뉴스 데이터는 10분 동안만 캐싱.

2. LRU(Least Recently Used)

- 가장 오랫동안 사용되지 않은 데이터를 제거하는 알고리즘이다. 

- 메모리 캐시의 용량 제한이 있을 때 주로 사용한다. 

3. Write-Through

- 데이터를 캐시와 데이터베이스에 동시에 기록한다.

- 장점 : 캐시와 데이터 소스가 동기화된다. 

- 단점 : 쓰기 속도가 느려질 수 있다. 

4. Lazy Loading

- 캐시에 없는 데이터를 요청 시에만 로드하여 저장한다. 

- 장점 : 초기 로드 시간이 짧아진다. 

- 단점: 사용자가 데이터를 수정하면 캐시를 삭제한다. 

 

캐시의 장점 

1. 성능향상 

- 데이터를 빠르게 제공하여 응답시간을 줄인다. 

- 특히 데이터베이스 조회, API 호출이 많은 시스템에서 큰 효과를 발휘한다. 

2. 트래픽 감소 

- 동일한 데이터를 반복적으로 가져오는 작업을 줄여 네트워크 사용량을 감소시킨다. 

3. 비용절감 

- 서버 부하를 줄여 추가적인 리소스 비용을 절약할 수 있다. 

 

캐싱의 단점 및 주의점 

1. 데이터 일관성 문제 

- 캐시에 저장된 데이터가 원본 데이터와 다를 수 있다. 이를 방지하려면 적절한 갱신 정책이 필요하다. 

2. 캐시 메모리 한계 

- 캐시 크기가 제한되어 있어 오래딘 데이터를 제거하는 과정에서 중요한 데이터가 삭제 될 수 있다. 

3. 캐시 복잡성 

 - 캐싱 전략을 잘못 설정하면 오히려 성능에 악영향을 미칠 수 있다. 

4. 초기 로딩 시간 

- 캐시가 비어 있는 경우 초기 요청 시간이 길어질 수 있다. 

 

예시 : 브라우저 캐싱 

HTTP캐싱 헤더를 사용하여 브라우저에 캐시를 설정할 수 있다. 

1. Cache-Control 

Cache-Control: max-age=3600

- 리소스를 1시간 동안 (3600초)캐싱합니다. 

2. ETag

ETag: "abc123"

- 리소스의 버전을 식별하는 고유 값으로, 변경 여부를 확인합니다. 

 

캐싱이 사용되는 곳

  1. 웹 애플리케이션: React, Next.js에서 클라이언트 상태를 관리할 때.
  2. CDN(Content Delivery Network): 정적 자산(CSS, JS, 이미지) 제공.
  3. 데이터베이스: 쿼리 결과 캐싱.
  4. API 서버: 외부 API 호출 결과를 캐싱.

+ Recent posts