Spring/Redis

[Spring] Spring 캐싱 애노테이션 정리 (@Cacheable, @CachePut, @CacheEvict)

신민석 2024. 4. 21. 13:38

🎯 캐싱 추상화

 

스프링에서는 메서드에 캐시를 적용할 수 있는 애노테이션을 제공합니다. 이는 AOP 방식으로 제공해 캐싱 관련 설정만 등록해준다면 매우 쉽게 캐싱 기능을 사용할 수 있습니다. 이를 통해 핵심 비지니스 로직을 분리할 수 있어 높은 확장성을 가지고 있습니다. 

 

또한 Spring 에서 제공하는 캐시 기능은 추상화되어 있기에 환경이 바뀌거나 캐시 관련 기능이 변경되어도 애플리케이션 코드에 영향을 주지 않습니다.

 

그렇다면 Spring 에서 제공하는 캐싱 관련 애노테이션은 무엇이 있을까? 

 

캐시 데이터를 저장과 조회를 동시에 하는 @Cacheable 

캐시 데이터를 저장하는 @CachePut 

캐시 데이터를 삭제하는 @CacheEvict 

 

크게 3개 정도의 애노테이션을 이용해 @AOP 를 적용하듯이 애노테이션을 사용해 쉽게 캐싱 기능을 적용할 수 있습니다.

 

 


 

🎯 캐시 애노테이션

 

 

해당 포스팅에선 캐시 관련 설정을 추가하는 내용을 포함하지 않습니다. 

 

 

 ✅ @Cacheable

 

@Cacheable 애노테이션은 데이터를 저장/조회하는 기능을 제공합니다. 우선적으로 조회하고자 하는 데이터가 캐시 저장소에 있으면 더이상 메서드 로직을 실행하지 않고 캐시 데이터를 반환합니다.

 

반대로 캐시 저장소에 조회하고자 하는 데이터가 없으면 기존 메서드 로직을 실행한 뒤, 캐시에 데이터를 추가합니다.

 

사용법

 

@Cacheable 안에는 value 와 key 를 각각 설정해 줄 수 있는데 (value = "myCache", key = "#id") 와 같이 설정하면 캐시 데이터에 저장될 때 myCache::{id} 가 key 가 되고 메서드 반환 값이 value 가 됩니다.

@Cacheable(value = "myCache", key = "#id")
public Member getData(Long id) {
        return Member.builder()
                .id(id)
                .nickName("닉네임")
                .name("이름")
                .build();
    }

 

 

 ✅ @CachePut 

 

@CachePut 애노테이션은 캐시에 데이터를 저장하는 용도로 사용됩니다. 

일반적으로 캐시를 업데이터 or 추가할때 사용합니다. 메서드가 호출 될때마다 캐시를 갱신하고, 해당 메서드의 반환값을 캐시에 저장합니다.

 

사용법

 

key = "#member.id" 로 키 값에 접근하는데, 이는 SpEl 이 사용되기 대문에 가능한 기능입니다. 이처럼 파라미터가 객체라면 하위 속성에 접근해 사용할 수 있습니다.

@CachePut(value = "myCache", key = "#member.id")
    public Member updateData( Member member) {
        // 데이터 업데이트 로직
        return member;
    }

 

 

 ✅ @CacheEvict 

 

캐시는 적절한 시점에 제거되어야 합니다. DB 와 캐시 저장소의 데이터가 달라질 시점이 있을거고, DB 에 삭제된 데이터가 캐시 저장소에 있어서도 안됩니다. 때문에 보통 두가지 방법을 사용해 캐시 저장소 데이터를 삭제합니다.

 

- 일정한 주기로 캐시 제거

- 값이 변환될 때 캐시 제거

 

사용법

   @CacheEvict(value = "myCache", key = "#member.id")
    public void deleteData(Member member) {

    }

 

 


 

🎯 정리

 

Spring 에서 제공하는 캐시 관련 애노테이션에 대해 알아봤습니다. 각각의 캐시 애노테이션에서 제공하는 element 도 있으니 이에 대해 더 자세히 알아본다면 보다 효율적인 캐싱 기능을 구현할 수 있습니다.

 

캐싱은 서비스 성능을 위해 꼭 필요한 기능이라 생각합니다. 때문에 서비스에 적합한 캐시 전략과 기능을 적용해 나아가며 고품질의 서비스를 만들어보는 고민을 계속하는게 좋은 개발자로서 갖춰야할 역량이라 생각합니다.