우선 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 관련 어노테이션을 달아주면 된다.
그 전에 어떤 어노테이션이 있는지 알아보자.
value: 객체
key: 기준이 되는 속성
unless == null: 데이터가 null 혹은 비어있지 아니한 경우만 캐싱
cacheManager: 등록했던 redisCacheManager 이름
@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) {
...
}
}
추후에 성능에 대한 비교도 정리 해보면 좋을 것 같다.