무작정 Cache를 사용하게 되면 오히려 성능 저하가 올 수 있다.
따라서 자신이 가지고 있는 비즈니스로직에 정말 필요하다면 활용하길 바란다.
@Cacheable, redis, @CacheEvict, redisConfig(lettuce)
IDE : Intellij
DB : Redis
글에서는 토큰 관리를 위해Redis, Cacheable, CacheEvict를 활용하였다.
하루 한 번 토큰을 갱신하는데계속 DB에 접근하기에는 성능이 저하가 우려되어 Cache 용도로 Redis를 활용하게 되었다.
흐름은 아래와 같다.
RedisConfig 설정
@Configuration
@EnableCaching
public class RedisConfig {
@Value("${spring.redis.host}")
private String redisHost;
@Value("${spring.redis.port}")
private int redisPort;
@Value("${spring.redis.timeout}")
private int redisTimeout;
@Bean
public LettuceConnectionFactory lettuceConnectionFactory() {
LettuceClientConfiguration clientConfig = LettuceClientConfiguration.builder()
.commandTimeout(Duration.ofMillis(redisTimeout))
.build();
RedisStandaloneConfiguration serverConfig = new RedisStandaloneConfiguration(redisHost, redisPort);
LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(serverConfig, clientConfig);
lettuceConnectionFactory.setValidateConnection(true);
return new LettuceConnectionFactory(serverConfig, clientConfig);
}
@Bean
public RedisTemplate<byte[], byte[]> redisTemplate() {
RedisTemplate<byte[], byte[]> redisTemplate = new RedisTemplate<>();
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
redisTemplate.setConnectionFactory(lettuceConnectionFactory());
return redisTemplate;
}
}
다음 내용에 포함되어있지만
Timeout 시간을 추가했다.
기존에는 1분 Timeout이 있으나 .yml 파일에 3000ms로 바꾸었다.
public interface SampleTokenRepository extends JpaRepository<SampleToken, String>, SampleTokenRepositoryCustom {
@Cacheable(value = "sampleToken")
Token findByTokenId(String tokenId);
@CacheEvict(value = "sampleToken", allEntries = true)
public void evictToken() {}
}
Jpa를 호출하여 DB에 있는 내용을 @Cacheable을 활용하여 Redis로 옮긴다.
이후 서비스 로직에서
해당 토큰을 삭제해야 하는 일이 있는 경우
@CacheEvict 메서드를 호출하여
Redis의 Value를 삭제 할 수 있다.
출처
https://www.baeldung.com/spring-webflux-cacheable
https://www.baeldung.com/spring-boot-evict-cache
'SpringBoot' 카테고리의 다른 글
String, StringBuilder, StringBuffer 사용법 및 차이 (0) | 2021.12.23 |
---|---|
통신 중 실패했을 때 재시도하기 (@Retryable, @Recover) (0) | 2021.12.22 |
Junit에서 assertThat(.isEqualTo) 활용하기 (0) | 2021.10.22 |
springboot로 Rest api 만들기(8) SpringSecurity를 이용한 인증 및 권한부여 (0) | 2021.10.22 |
springboot로 Rest api 만들기(7) MessageSource를 이용한 Exception 처리 (0) | 2021.10.22 |