22.5.25 [Spring] 캐시 추상화 (@Cacheable, @CachePut, @CacheEvict)

서태욱·2022년 5월 25일
1

Spring

목록 보기
2/2
post-thumbnail

1. Cache?

캐시는 서버 부담을 줄이고, 성능을 높이기 위해 사용하는 기술이다. 요청을 처리하는 데 필요한 계산이 복잡하거나, DB에서 조회하는 데 시간이 오래 걸리는 일이 있다면, 결과를 저장해두고 가져와 좀 더 빠르게 처리할 수 있다.

값을 저장하고 불러온다는 점에서, 반복적으로 동일한 결과를 반환하는 경우 사용하는 것이 좋다.

스프링에서는 AOP 방식으로 메소드에 캐시 서비스를 적용하는 기능을 제공하고 있다. 트랜잭션과 마찬가지로 AOP를 이용해 메소드 실행과정에 투명하게 적용된다.

2. Spring에서 Cache를 사용하는 방법

먼저 설정 클래스에 @EnableCaching을 추가해 준다.

1) @Cacheable

이 어노테이션은 캐시를 저장/조회하는 데 사용한다. 캐시에 데이터가 없으면 기존의 로직을 실행한 뒤 캐시에 데이터를 추가하고, 캐시에 데이터가 있으면 그 데이터를 리턴한다.

@Cacheable(cacheNames = "book", key="#bookId")
public Book findById(String bookId){
	return boardRepository
    	.findById(bookId)
    	.orElseThrow(EntityNotFoundException::new);
}

메소드 파라미터가 없으면 0이라는 디폴트 값을 Key로 저장한다. 만약 파라미터가 여러개면 파라미터들의 hashCode 값을 조합하여 키를 생성한다.
여러 개의 파라미터 중 1개의 키 값으로 지정하고 싶다면 위 예시와 같이 key값을 별도로 지정해 주면 된다.

2) @CachePut

이 어노테이션은 캐시에 값을 저장하는 용도로만 사용한다. @Cacheable과 유사하게 실행 결과를 캐시에 저장하지만, 조회 시 저장된 캐시 내용을 사용하지 않고 항상 메소드의 로직을 실행한다는 점이 다르다.

3) @CacheEvict

값이 달라지는 경우에는 잘못된 값을 반환하는 것을 막기 위해 캐시가 제거되어야 한다.

@CacheEvict에 캐시 이름을 넣어주면 메소드가 실행될 때 캐시 내용이 제거된다.

@CacheEvict(value = "book", key="#bookId")
public updateBook (Book book){

}

@CacheEvict는 기본적으로 메소드의 키에 해당하는 캐시만 제거하나, 위의 예시와 같이 적용할 경우 bookId와 같은 키값을 가진 캐시만 제거된다. 만약 모두 제거하려면 key부분을 allEntries = true로 지정하면 된다.

👉 참고

profile
re:START

0개의 댓글