[From Hello To QueryDSL] Cache with Redis (8/12)

By | 2020년 3월 15일
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) {
        // ......
    }
}

답글 남기기