1. 캐시(Cache)란?
캐시는 자주 사용하는 데이터를 더 빠르게 접근할 수 있는 저장소에 저장하여 성능을 최적화하는 기술이다.
- CPU, 메모리, DB, 네트워크 등 다양한 영역에서 사용됨
- 동일한 요청이 반복될 때 기존 데이터를 재사용하여 응답 속도를 향상
- 일반적인 캐시 저장소: Redis, Memcached, 로컬 메모리 등
2. 캐시의 동작 방식
- 클라이언트가 서버에 데이터를 요청
- 서버는 캐시 저장소에서 먼저 데이터를 확인(캐시 조회)
- 캐시에 데이터가 있다면(Cache Hit) 즉시 반환
- 없다면(Cache Miss), 원본 데이터베이스에서 가져와 캐시에 저장 후 반환
- 일정 시간이 지나면 캐시 만료(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);
}
@CacheEvict → DB에서 삭제 시 캐시에서도 제거
5. 캐시의 장점과 단점
장점
- 성능 향상 -> DB 접근 최소화
- 네트워크 트래픽 감소
- 빠른 응답 시간 제공
단점
- 데이터 일관성 문제 발생 가능 -> 캐시 갱신 필요
- 캐시 용량 관리 필요
- 불필요한 캐시 사용 시 메모리 낭비
6. 느낀 점
캐시는 웹 애플리케이션 성능을 최적화하는 데 필수적인 요소이다. 하지만 캐시 전략을 잘못 설계하면 데이터 일관성이 깨질 위험이 있으므로 적절한 캐시 정책을 적용하는 것이 중요하다는 점을 다시 한번 깨달았다.
Spring의 @Cacheable, @CacheEvict 등의 어노테이션을 활용하면 간편하게 캐시를 적용할 수 있으니 실무에서도 적극 활용해야겠다.