DB

SpringBoot redis 활용(.haskey, .set, .get)

pepega 2021. 10. 22. 11:25

토큰 제한시간은 30분

만료시간 10분 이내에 재발급 하면 토큰이 재생성 되는 방식이다.

 

만료시간 이전에 토큰을 발급하면 바뀌지 않은 기존의 토큰이 발급된다.

 

위 내용을 예시로 진행할 예정이다.

 

OS : Windows 10

Redis : docker, P3X Redis UI

Java 14

 

redis 위주의 코드를 적을 계획이다.

@Configuration
public class RedisConfig {
  @Value("${spring.redis.host}")
  private String redisHost;

  @Value("${spring.redis.port}")
  private int redisPort;

  @Bean
  public LettuceConnectionFactory lettuceConnectionFactory() {
    return new LettuceConnectionFactory(redisHost, redisPort);
  }

  @Bean
  public RedisTemplate redisTemplate() {
    RedisTemplate<byte[], byte[]> redisTemplate = new RedisTemplate<>();
    redisTemplate.setKeySerializer(new StringRedisSerializer());
    redisTemplate.setValueSerializer(new StringRedisSerializer());
    redisTemplate.setConnectionFactory(lettuceConnectionFactory());
    return redisTemplate;
  }
 }

.yml 파일에 redis에 대한 접속 정보를 입력해줬다.

 

본 내용에서는 String 저장 방식을 활용하고 있다.

 

1. redis에 토큰이 있나?

    String tokenKey = "원하는 키 이름";
    String tokenExpireDate = "원하는 키 이름";

    if (Boolean.TRUE.equals(redisTemplate.hasKey(tokenKey)) && 
    	Boolean.TRUE.equals(redisTemplate.hasKey(tokenExpireDate)))

토큰 제한시간은 30분

만료시간 10분 이내에 재발급을 해야하기 때문에

2개의 키를 사용하였다. (토큰, 토큰 발급 시간)

 

1.1. 토큰이 없는가?

redisTemplate.opsForValue()
        .set(tokenKey, tokenService().getTokenNumber());
      redisTemplate.opsForValue()
        .set(tokenExpireDate, tokenService().getTokenExpirationDate().toString());

redis에 키 값이 없을 경우

tokenService() 라는 메서드를 실행 후 토큰을 발급하고

redis에 토큰과 날짜를 등록한다.

 

* tokenService() 는 토큰을 발급하는 메서드이다.

 

2. diff = 현재시간 - 토큰시간

tokenExpirationDate
  = redisTemplate.opsForValue().get(tokenExpireDate);

assert tokenExpirationDate != null;

long minutes = ChronoUnit
  .MINUTES.between(LocalDateTime.now(),
    LocalDateTime.parse(tokenExpirationDate,
      DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss")));
      
if (minutes < 10) {
  redisTemplate.opsForValue()
    .set(tokenKey, tokenService().getTokenNumber());
  redisTemplate.opsForValue()
    .set(tokenExpireDate, tokenService().getTokenExpirationDate().toString());
}

현재 시간과 토큰 시간을 between하여

10분 이내면

토큰을 새로 발급하여 redis에 set한다.

 

 

3. API 결과 리턴

각자 원하는 곳에

redisTemplate.opsForValue().get(key)

명령어를 활용하여

키를 입력하고 API 결과를 리턴하면 된다.