[Redis] Spring 3.x Redis Cache 사용

경민·2024년 5월 14일

Redis

목록 보기
3/4
post-thumbnail

Redis Cache를 사용해보자.

  • Redis는 Cache 용도로도 많이 사용된다.

Cache를 왜 사용할까?

우선 Cache를 사용하는 이유에 대해 알아보자.
본인은 정보처리기사를 공부할 때 파레토의 법칙에 대해 알아본 적이 있다.

파레토의 법칙이란?
전체 결과의 80%가 전체 원인의 20%에서 일어나는 현상을 가리킨다고 한다.
이게 무슨 말인가.. 하면
적은 비율의 원인이 아주 큰 영향을 가져온다는 말이라고 하는데..

캐싱 기능에 적용할 때의 파레토의 법칙을 내 주관적으로 해석해보자면,
사용자가 조회하는 데이터의 80%는 총 데이터 비율의 20%에서 온다.
그래서 캐싱 기능을 활성화한다면, 20%를 다 캐시에 박진 못 하더라도
어느 정도만 박아 놓으면 상대적으로 성능이 좋아지는 현상이
좋은 사용자 경험을 제공하기에 적합한 것 같다.

여기서 자주 조회되는 데이터를 선별하여 캐시에 박아 놓자.


환경

JDK: 17
Spring Boot: 3.2.5
Redis: 3.2.4


~Application.java

@SpringBootApplication
@EnableCaching // 캐시 허용
public class RedisTestApplication {

    public static void main(String[] args) {
        SpringApplication.run(RedisTestApplication.class, args);
    }

}

근데 원래 스프링에서 지원하는 Cache가 있기 때문에
Redis Cache를 사용하겠다고 별도로 설정 해줘야 한다.

근데 왜 하필 Redis의 Cache일까? 그건
https://velog.io/@gang00/Redis-Redis%EB%9E%80 여기에 정리 해뒀다.

application.yml

spring:
  cache:
    type: redis # spring의 cache를 redis껄 쓰겠다고 설정

RedisCacheConfig.java

@Configuration
@EnableCaching
public class RedisCacheConfig {

    public CacheManager redisCacheManager(RedisConnectionFactory redisConnectionFactory) {
        RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()))
                .entryTtl(Duration.ofMinutes(3L)); // entity ttl 캐시 유효 시간을 3분으로 설정.
        
        return RedisCacheManager // RedisCacheManager에 내가 설정한 Configuration을 넣어준다.
                .RedisCacheManagerBuilder
                .fromConnectionFactory(redisConnectionFactory)
                .cacheDefaults(redisCacheConfiguration)
                .build();
    }
    
}

설정은 끝났다.
이제 Service단에 Redis Cache 관련 어노테이션을 달아주면 된다.

그 전에 어떤 어노테이션이 있는지 알아보자.

@Cacheable

  • Redis의 String으로 저장
  • Bean으로 등록된 cacheManager를 통해 serialize 정보 등을 참조
  • 해당 메서드 호출 전에 캐시 레이어에서 데이터를 조회, 데이터가 없으면 메서드 내 로직 수행
  • 데이터가 있으면 메서드 내 로직 수행하지 않고, 그대로 리턴함

value: 객체
key: 기준이 되는 속성
unless == null: 데이터가 null 혹은 비어있지 아니한 경우만 캐싱
cacheManager: 등록했던 redisCacheManager 이름

@CacheEvict

  • 캐시 정보 삭제

@CachePut

  • 캐시 정보 추가
@Service
public class BoardService {

    @Cacheable(value = "Board", key = "#boardSeq", unless = "#result == null", cacheManager = "redisCacheManager")
    public Board findByBoardSeq() {
		...
    }

    @CacheEvict(value = "Board", key = "#board.boardSeq", cacheManager = "redisCacheManager")
    public void deleteByBoardSeq(Board board) {
		...
    }

    @CachePut(value = "Board", key = "#board.boardSeq", cacheManager = "redisCacheManager")
    public void updateBoard(Board board) {
		...
    }
}

추후에 성능에 대한 비교도 정리 해보면 좋을 것 같다.

profile
안녕하세요

0개의 댓글