Table of Contents
Cache with Redis
Redis 기반으로 캐시 기능을 설정합니다.
개발환경
- Spring Boot 2.1.x
- Gradle 4.10.2
파일추가 및 수정
build.gradle
......
dependencies {
// ......
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
implementation 'org.springframework.boot:spring-boot-starter-cache'
// ......
}
......
src/main/java/kr/co/episode/example/config/CacheConfig.java
@Configuration
@EnableCaching
public class CacheConfig {
}
@Cacheable
어노테이션을 추가합니다.
src/main/java/kr/co/episode/example/service/posts/PostsPagingService.java
// ......
@Transactional(readOnly = true)
@Cacheable(value="Posts")
public Page<PostsListResponseDto> search(Pageable pageable, PostsSearchDto postsSearchDto) {
// ......
}
// ......
@ToString
어노테이션을 추가합니다. 이것때문에 꽤 고생했는데… 이유를 설명합니다.
캐시는 기본적으로 key-value 기반입니다. 그럼 위에 캐시 하려는 메소드에서 key 는 어떻게 자동생성될까요? 파라미터 기반으로 key 를 생성할겁니다.
그럼 클래스가 어떻게 key 가 될까요? toString()
으로 key 를 생성할겁니다. toString()
이 없다면? 그럼 key 를 수동으로 생성해 주거나, 아니면 key 를 생성할 수 없고… 캐시 기능이 작동하지 않습니다.
클래스가 상속을 받은 경우, 상위 클래스 모두에 @ToString
이 있어야 합니다.
src/main/java/kr/co/episode/example/web/dto/PostsSearchDto.java
@ToString
@Getter
public class PostsSearchDto {
// ......
}
@CacheEvict
은 캐시를 삭제합니다.
src/main/java/kr/co/episode/example/service/posts/PostsService.java
public class PostsService {
// ......
@Transactional
@CacheEvict(value="Posts")
public Long update(Long id, PostsUpdateRequestDto postsUpdateRequestDto) {
// ......
}
@Cacheable(value="Posts")
public PostsResponseDto findById(Long id) {
// ......
}
@Transactional
@CacheEvict(value="Posts")
public void delete(Long id) {
// ......
}
}