티스토리 뷰
매번 같은 형태의 데이터를 각 메뉴마다 지속적으로 사용한다면
큰 부하는 아니지만 DB에 수시로 접근하여 조회를 해와야 한다.
여기서 복잡도가 올라가게 되고 조회해오는 항목들이 방대해지면
이제 점차적으로 DB에 부하를 야기하게 될 것이다.
그래서 반복 호출 되는 이러한 것들을 기존에 사용하고 있는 Redis 활용하여 cache 로 사용하고자 한다.
심플하게 한번 적용해보자
Redis data 를 build.gradle 에 추가한다.
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
application 프로퍼티에 redis 를 설정한다
(필자는 기존에 redis session을 사용하고 있어서 되어있었다.)
spring:
redis:
host: localhost
port: 6379
redis cache 관련 설정 클래스를 작성한다.
@Configuration
@EnableCaching
public class RedisCacheConfig {
@Bean
public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) {
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofDays(1))
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()));
return RedisCacheManager.builder(connectionFactory).cacheDefaults(config).build();
}
}
springboot 에서는 프로퍼티 redis 설정에 의해서 RedisConnectionFactory 를 자동으로 인지할 것이고
cache 유효기간인 Ttl 을 상황에 맞게 설정해주면 되고
Key 와 Value 값을 직렬화 해주면 되는데
제 코드는 일단 Key 값만 직렬화를 해준 상태입니다.
일단 위 상태로도 정상적인 동작은 가능합니다.
Value 에 대한 직렬화도 아래와 같이 해주면 되긴 하는데
가장 기본적인 GenericJackson2JsonRedisSerializer 를 썼을때 약간의 문제점들이 존재합니다.
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()))
일단 DTO 에 LocalDateTime의 데이터형이 있는경우 이를 변환해주는 객체맵퍼가 필요하고
또 class 및 전체 패키지 정보를 직렬화 해버려서 역직렬화 할때 문제가 발생한다는 것입니다.
이런 상황들을 해결해야 하는데
일단 이번 포스트에서는 심플하게 사용하는 법 까지만 작성하고
Value 의 역직렬화 문제점은 제가 참고했던 블로그들을 하단에 공유 하고 넘어 가도록 하겠습니다.
서비스 로직에서 cache 어노테이션을 사용합니다.
@Cacheable(value="CodeCache", key="'CodeList'")
public List<sampleDTO> getData() {...}
@CacheEvict(value="CodeCache", key="'CodeList'")
public void save() {...}
@Cacheable 어노테이션을 통해 캐시가 없으면 생성하고
존재하면 캐시값을 가져오게 하였고
@CacheEvict 어노테이션을 사용하여 리스트에 값이 추가 되었을때 캐시를 삭제 시키도록 하였습니다.
이외에도 캐시 어노테이션이 있어 상황에 맞게 사용하시면 됩니다.
주요 캐시 관련 애노테이션
@Cacheable: 캐시 생성 및 조회
@CachePut: 캐시 갱신
@CacheEvict: 캐시 삭제
@Caching: 복합 캐싱 작업
@CacheConfig: 클래스 수준에서 캐시 설정
여기까지 하고 해당 메소드를 호출되는 기능을 사용해보면
최초에 한번 데이터를 조회하고 그 뒤에는 캐시가 생성되어 더 이상 db 에서 조회해오지 않습니다.
redis-cli 에서 keys * 조회해보면 캐시가 생성된 것을 확인 할 수 있습니다.
127.0.0.1:6379> keys *
1) "CodeCache::CodeList"
Spring Redis 역직렬화 삽질기 (feat. RedisSerializer)
redis에 객체(dto)를 저장할 때 serializer를 통해 직렬화해주어야 한다.이 때, 선택할 수 있는 여러가지 직렬화 방법이 존재한다.Class Type을 지정해야 하며, redis에 객체를 저장할 때 class 값 대신 Classy
velog.io
RedisTemplate 을 이용해서 Multi Pojo get/set 할 때 이슈사항
Spring Boot에서 제공하는 RedisTemplate 을 이용하면 쉽게 Redis 데이터를 Get/Set 할 수 있다. 이 때, Data를 Serialize 하는 방법을 설정할 수 있는데 org.springframework.data.redis.serializer 패키지에서 확인할 수 있
mongsil-jeong.tistory.com
'Java > SpringBoot&Spring' 카테고리의 다른 글
[Java] IP 주소 상세하게 체크하기. (1) | 2024.12.19 |
---|---|
[SpringBoot] poi 라이브러리 버전에 따른 오류해결 (feat.ibSheet8 엑셀다운로드) (1) | 2024.11.20 |
[Springboot] 운영서버에 로그파일 설정 (0) | 2024.08.30 |
[Thymeleaf] 주간 요일 구하기 (0) | 2024.06.28 |
[Springboot] 외부 라이브러리 추가 (feat.intelliJ) (0) | 2024.06.18 |