캐시(Cache)와 캐싱 전략

Kkd·2025년 1월 12일
0

매일메일 개념정리

목록 보기
66/93

캐시(Cache)란?

캐시는 데이터를 임시로 저장하여 빠르게 접근할 수 있도록 하는 저장소입니다.

  • 주로 반복적이고 자주 요청되는 데이터를 저장하여, 데이터베이스나 원격 서버와의 통신 없이 빠르게 데이터를 제공하는 데 사용됩니다.
  • 캐시는 메모리(RAM)나 디스크 등의 빠른 스토리지를 활용하며, 성능 향상응답 속도 개선에 기여합니다.

캐싱의 장점

  1. 성능 향상
    • 자주 사용하는 데이터를 캐시에 저장하여 읽기 속도를 크게 향상.
  2. 부하 감소
    • 데이터베이스 또는 원격 서버 요청을 줄여 시스템 부하를 경감.
  3. 비용 절감
    • 외부 API 호출 비용이나 데이터베이스 요청 비용을 절약.
  4. 응답 속도 개선
    • 사용자 경험(UX)을 향상시키는 데 기여.

캐싱 전략

캐싱 전략은 데이터를 캐시에 저장하고 관리하는 방식입니다. 적절한 전략 선택은 효율적인 캐싱 시스템 구현에 필수적입니다.

1. Write-Through

  • 데이터를 캐시와 데이터베이스에 동시에 쓰기.

  • 데이터 일관성이 높지만, 쓰기 작업 속도가 다소 느릴 수 있음.

  • 특징:

    • 데이터는 항상 최신 상태로 유지.
    • 쓰기 연산 시 캐시와 DB 모두 갱신.

2. Write-Behind (Write-Back)

  • 데이터 쓰기를 캐시에만 수행하고, 나중에 비동기로 데이터베이스에 반영.

  • 장점:

    • 쓰기 성능이 뛰어남.
  • 단점:

    • 캐시 장애 시 데이터 손실 가능.

3. Read-Through

  • 데이터가 캐시에 없을 때 데이터베이스에서 읽어와 캐시에 저장.

  • 특징:

    • 읽기 작업을 자동으로 캐시와 동기화.

4. Cache-aside

  • 애플리케이션이 직접 캐시에 데이터를 읽고 쓸지 결정.

  • 동작 방식:

    1. 캐시에서 데이터 조회.
    2. 캐시에 데이터가 없으면 데이터베이스에서 조회 후 캐시에 저장.
    3. 갱신 필요 시 애플리케이션이 캐시와 DB를 직접 갱신.
  • 장점:

    • 캐시 장애 시에도 데이터베이스에서 데이터를 사용할 수 있음.

5. Eviction Policy (캐시 교체 정책)

  • 캐시 용량 초과 시 어떤 데이터를 제거할지 결정하는 전략.
  • 주요 정책:
    • LRU (Least Recently Used): 가장 오랫동안 사용되지 않은 데이터를 제거.
    • LFU (Least Frequently Used): 가장 적게 참조된 데이터를 제거.
    • FIFO (First In First Out): 먼저 캐시에 들어온 데이터를 먼저 제거.

캐싱 전략 선택 기준

  1. 데이터 일관성

    • 일관성이 중요한 경우 Write-Through 사용.
    • 일관성보다 성능이 중요한 경우 Write-Behind 선호.
  2. 데이터 접근 패턴

    • 읽기 작업이 많으면 Read-Through와 Cache-aside 조합이 유리.
    • 쓰기 작업이 많으면 Write-Back 방식 고려.
  3. 캐시 용량 및 비용

    • 용량 제한이 있다면 적절한 Eviction Policy 선택.

캐시의 구현 예

Java와 Spring Boot에서 캐시를 사용하는 방법을 예로 들어 설명합니다.

Spring Boot에서 캐싱 사용

  1. 의존성 추가

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-cache</artifactId>
    </dependency>
  2. 캐시 설정

    • 애플리케이션에 캐싱을 활성화하려면 @EnableCaching 어노테이션을 사용합니다.
    @Configuration
    @EnableCaching
    public class CacheConfig {
    }
  3. 캐싱 사용

    • @Cacheable 어노테이션을 사용하여 메소드의 결과를 캐시합니다.
    @Service
    public class UserService {
    
        @Cacheable("users")
        public User getUserById(Long id) {
            // 데이터베이스에서 사용자 조회
            System.out.println("Fetching user from database...");
            return userRepository.findById(id).orElseThrow();
        }
    }
  4. 캐시 설정 (EhCache, Redis 등)

    • Spring Boot는 다양한 캐시 라이브러리를 지원하며, Redis, EhCache 등이 자주 사용됩니다.
    • 예: Redis 캐시 설정
      spring.cache.type=redis
      spring.redis.host=localhost
      spring.redis.port=6379

캐시 사용 시 주의사항

  1. 일관성 문제
    • 데이터베이스와 캐시 간 데이터 불일치 가능성.
  2. 용량 제한
    • 캐시 크기를 초과할 경우 캐싱 효과 감소.
  3. 캐시 히트율
    • 캐시에 데이터가 없으면 조회 시간이 증가.
  4. 보안
    • 민감한 데이터를 캐시에 저장할 경우 보안 문제 발생 가능.

캐시 활용 사례

  1. 웹 애플리케이션

    • 자주 요청되는 데이터를 캐시에 저장하여 응답 속도 개선.
    • 예: 상품 목록, 사용자 프로필 등.
  2. 분산 시스템

    • Redis와 같은 분산 캐시를 활용하여 여러 애플리케이션 인스턴스 간 캐시 공유.
  3. 외부 API 호출 최적화

    • 외부 API의 결과를 캐시에 저장하여 불필요한 호출 감소.

결론

캐시는 시스템 성능과 사용자 경험을 크게 향상시킬 수 있는 중요한 도구입니다. 올바른 캐싱 전략을 선택하고 관리하면 효율적이고 빠른 애플리케이션을 개발할 수 있습니다.


추가 학습 자료

profile
🌱

0개의 댓글