[Spring Boot] - Cache

목차

참고

Spring Boot 캐시 추상화

Spring Boot 에서는 캐시를 쉽게 사용할 수 있도록 캐싱 기능들을 추상화해 제공합니다. 캐싱 추상화 가능으로 개발자는 특정 캐시 저장소에 종속적이지 않고 일관된 방식으로 캐싱기능을 사용할 수 있습니다.

✅ 의존성 추가

implementation 'org.springframework.boot:spring-boot-starter-cache'

✅ Cache 활성화

@EnableCaching 를 이용해 Cache 기능을 활성화 할 수 있다.

@EnableCaching
@Configuration
public class CacheConfig {

@Bean
public CacheManager cacheManager(){
return new ConcurrentMapCacheManager("cache");
}
}

✅ Cache 관련 어노테이션

스프링에서는 캐싱을 쉽게 제어할 수 있도록 캐시관련 어노테이션 들을 제공합니다.

1. @Cacheable

메서드 호출 시 동일한 파라미터 값이 있으면 캐시된 결과를 반환하여 실제 메서드 실행을 건너뜁니다.

// 1. 캐시에서 사용자 조회 (@Cacheable) 
// 캐시에서 사용자 조회. DB에서 조회 후, 캐시에 저장합니다.
@Cacheable(key = "#id")
public User getUserById(Long id) {
System.out.println("DB에서 사용자 조회: " + id);
return userRepository.findById(id).orElse(null);
}

2. @CachePut

메서드 실행 후 결과를 캐시에 업데이트합니다. 데이터 수정 후 최신 캐시를 유지할 때 사용합니다.

// 2. 사용자 업데이트 후 캐시 갱신 (@CachePut)
// 사용자 업데이트 후 캐시 갱신. DB 업데이트와 동시에 캐시 값을 최신화합니다.
@Transactional
@CachePut(key = "#user.id")
public User updateUser(User user) {
System.out.println("DB에서 사용자 업데이트: " + user.getId());
return userRepository.save(user);
}

3. @CacheEvict

특정 조건에 맞는 캐시 항목을 제거합니다. 데이터 삭제나 업데이트 시 캐시 무효화에 유용합니다.

// 3. 사용자 삭제 후 캐시 제거 (@CacheEvict)
// 사용자 삭제 후 캐시 제거. DB 삭제와 동시에 캐시된 데이터를 제거합니다.
@Transactional
@CacheEvict(key = "#id")
public void deleteUser(Long id) {
System.out.println("DB에서 사용자 삭제: " + id);
userRepository.deleteById(id);
}

4. @Caching

@Caching 어노테이션은 하나의 메서드에 여러 캐시 관련 애너테이션 (@Cacheable, @CachePut, @CacheEvict 등) 을 함께 적용할 수 있도록 그룹화하는 역할을 합니다.

// 4. 복합 캐시 작업: 캐시 조회, 캐시 업데이트, 그리고 다른 캐시("userList") 제거 (@Caching)
/**
* 복합 캐시 작업:
* - @Cacheable: 캐시에서 먼저 조회
* - @CachePut: 메서드 실행 후 캐시 갱신
* - @CacheEvict: 다른 캐시("userList")의 모든 엔트리를 제거
* DB에서 사용자 데이터를 조회하고, 수정 후 저장합니다.
*/
@Transactional
@Caching(
cacheable = { @Cacheable(key = "#id") },
put = { @CachePut(key = "#result.id") },
evict = { @CacheEvict(value = "userList", allEntries = true) }
)
public User getAndUpdateUser(Long id) {
System.out.println("DB에서 사용자 조회 후 업데이트: " + id);
User user = userRepository.findById(id).orElse(null);
if(user != null) {
// 예시로 이름 뒤에 " updated"를 붙여 업데이트
user.setName(user.getName() + " updated");
user = userRepository.save(user);
}
return user;
}

5. @CacheConfig

@CacheConfig 어노테이션은 클래스 레벨 에서 공통 캐시 설정을 정의할 수 있도록 도와줍니다. 이를 통해, 해당 클래스의 모든 캐시 관련 메서드에서 반복적으로 동일한 캐시 이름, 캐시 매니저 등과 같은 설정을 지정할 필요 없이 한 번에 설정할 수 있습니다.

@Service
@CacheConfig(cacheNames = "users") // 이 클래스의 모든 캐시 메서드는 기본적으로 "users" 캐시를 사용
public class UserService {
...
}
Share