25.03.19 TIL Cache

신성훈·2025년 3월 19일

TIL

목록 보기
151/162

1. 캐시(Cache)란?

캐시는 자주 사용하는 데이터를 더 빠르게 접근할 수 있는 저장소에 저장하여 성능을 최적화하는 기술이다.

  • CPU, 메모리, DB, 네트워크 등 다양한 영역에서 사용됨
  • 동일한 요청이 반복될 때 기존 데이터를 재사용하여 응답 속도를 향상
  • 일반적인 캐시 저장소: Redis, Memcached, 로컬 메모리 등

2. 캐시의 동작 방식

  1. 클라이언트가 서버에 데이터를 요청
  2. 서버는 캐시 저장소에서 먼저 데이터를 확인(캐시 조회)
  3. 캐시에 데이터가 있다면(Cache Hit) 즉시 반환
  4. 없다면(Cache Miss), 원본 데이터베이스에서 가져와 캐시에 저장 후 반환
  5. 일정 시간이 지나면 캐시 만료(Cache Expiration) 정책에 따라 데이터가 제거됨

3. 캐시 전략(Cache Strategy)

1. Write-Through

  • 데이터를 캐시에 먼저 저장하고 동시에 DB에도 반영
  • 장점: 데이터 일관성이 높음
  • 단점: 쓰기 속도가 느려질 수 있음

2. Write-Back (Write-Behind)

  • 캐시에 먼저 저장하고 일정 시간 후에 DB에 반영
  • 장점: 빠른 쓰기 성능
  • 단점: 장애 발생 시 데이터 유실 위험

3. Read-Through

  • 캐시에 데이터가 없을 경우 자동으로 DB에서 가져와 캐시에 저장
  • 장점: 캐시 관리가 자동화됨
  • 단점: 구현이 복잡할 수 있음

4. Cache Aside (Lazy Loading)

  • 애플리케이션이 캐시를 먼저 조회하고 없으면 DB에서 가져와 캐시에 저장
  • 장점: 캐시와 DB를 독립적으로 운영 가능
  • 단점: 초기 캐시 미스(Cache Miss) 시 지연 발생

4. 캐시 적용하기 (@Cacheable)

Spring에서는 @Cacheable 어노테이션을 활용하여 간단하게 캐시를 적용할 수 있다.

1) 캐시 예제 (Redis 사용)

@Service
public class UserService {
    @Cacheable(value = "users", key = "#id")
    public User getUserById(Long id) {
        System.out.println("DB에서 조회 중...");
        return userRepository.findById(id).orElse(null);
    }
}
  • @Cacheable(value = "users", key = "#id")
    조회 시 캐시에서 먼저 검색하고 없으면 DB에서 가져와 저장

2) 캐시 제거 (@CacheEvict)

데이터가 변경될 경우 기존 캐시를 제거해야 한다.

@CacheEvict(value = "users", key = "#id")
public void deleteUser(Long id) {
    userRepository.deleteById(id);
}
  • @CacheEvictDB에서 삭제 시 캐시에서도 제거

5. 캐시의 장점과 단점

장점

  • 성능 향상 -> DB 접근 최소화
  • 네트워크 트래픽 감소
  • 빠른 응답 시간 제공

단점

  • 데이터 일관성 문제 발생 가능 -> 캐시 갱신 필요
  • 캐시 용량 관리 필요
  • 불필요한 캐시 사용 시 메모리 낭비

6. 느낀 점

캐시는 웹 애플리케이션 성능을 최적화하는 데 필수적인 요소이다. 하지만 캐시 전략을 잘못 설계하면 데이터 일관성이 깨질 위험이 있으므로 적절한 캐시 정책을 적용하는 것이 중요하다는 점을 다시 한번 깨달았다.
Spring의 @Cacheable, @CacheEvict 등의 어노테이션을 활용하면 간편하게 캐시를 적용할 수 있으니 실무에서도 적극 활용해야겠다.

profile
조급해하지 말고, 흐름을 만들고, 기록하면서 쌓아가자.

0개의 댓글