티스토리 뷰

반응형

 

 

 

 

 



 

 

SpringBoot

 

 

 

매번 같은 형태의 데이터를 각 메뉴마다 지속적으로 사용한다면

큰 부하는 아니지만 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

 

 

 

 

 

반응형
댓글
반응형
최근에 올라온 글
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Total
Today
Yesterday