1. RefreshToken (Entity)

@Getter
@Setter
public class RefreshToken implements Serializable {

    private static final long serialVersionUID = 6494678977089006639L;
    private String refreshToken;
    private String email;
    
    public RefreshToken(String token, String email) {
        this.refreshToken = token;
        this.email = email;
    }

    public RefreshToken updateToken(String token) {
        this.refreshToken = token;
        return this;
    }
}
  • redis에 저장되는 객체들은 Serialize 가능해야함
  • 이 값을 지정해주지 않으면 컴파일러가 계산한 값이 부여됨(변동성있음) 게다가 컴파일러는 Serializable class 혹은 Outer Class를 참고하여 만들기 때문에 이 클래스가 변동이 되면
  • serialVersionUID도 변경이 있을 수 있음 (역시 변동성이 있음)
  • 이 UID가 달라지면 기존에 저장된 객체를 읽을 수가 없게 됨. (저장하는 쪽, 불러오는 쪽 컴파일러가 다를 경우, 저장하는 시기의 클래스 내용과 불러오는 시기의 클래스의 내용이 다를 경우 등)
  • 데이터를 저장하는데 있어 이런 변동성은 위험하기에 serialVersionUID을 지정.

출처 : 소영님 

  • 아래는 3조 분들이 노션에 작성한 부분 ! ( 출처 : 눈치코치캐치 노션)
  • ChatRoom 에 Serializable 를 구체화한 이유
    Redis의 저장방식은 byte array 형식이기 때문에 직렬화를 하여 캐싱을 할 때 넘겨줘야 합니다.
    Java에서의 객체 직렬화는 Serializable 인터페이스를 구현한 것에서만 가능하다고 이해를 하고 있습니다.
    그래서 Redis를 이용하는 ChatRoom 에서 Serializable 를 구체화 했습니다.

 

2. TokenDto

@Getter
@NoArgsConstructor
public class TokenDto {
    private String accessToken;
    private String refreshToken;

    public TokenDto(String accessToken, String refreshToken) {
        this.accessToken = accessToken;
        this.refreshToken = refreshToken;
    }
}

 

 

3. RefreshTokenRepository

// 기능 : Redis에 Refresh Token 저장
@Repository
@RequiredArgsConstructor
public class RefreshTokenRepository {
    private final RedisTemplate<String, String> redisTemplate;
    private long expiredTime = 3 * 60L; // 리프레시토큰 유효시간 : 3분

    // 특정 RefreshToken 조회
    public RefreshToken findByEmail(String email){
        RefreshToken refreshToken = new RefreshToken(redisTemplate.opsForValue().get(email), email);
        return refreshToken;
    }

    // RefreshToken 저장
    public RefreshToken saveRefreshToken(RefreshToken refreshToken){
        redisTemplate.opsForValue().set(refreshToken.getEmail(), refreshToken.getRefreshToken(),expiredTime,TimeUnit.SECONDS); // 리프레시 토큰 유효시간 설정 : 3분 이부분 추후에 수정 필요 !
        return refreshToken;
    }

    // RefreshToken 삭제
    public void deleteRefreshToken(String email){
        redisTemplate.delete(email);
    }

}

 

1. findByEmail()

  • redisTemplate.opsForValue() 를 이용해 Redis에 String 형태의 리프레시토큰을 저장하고, 사용자를 식별해 줄 이메일을 저장해준다.

2. saveRefreshToken()

  • 리프레시 토큰을 레디스와 저장함과 동시에 유효시간을 저장해준다. 유효시간이 끝나면 자동 삭제 된다.
  • 테스트용이기 때문에 일단 exprited time을 3분으로 설정해둠. 실제 서비스에는 1주 - 2주 정도로 할 예정.

3. deleteRefreshToken

  • 로그아웃 하는 경우 리프레시 토큰을 삭제해줌

 

opsForValue() 참고자료

더보기
  • RedisTemplate은 Redis 서버에 Redis 커맨드를 수행하기 위한 high-level-abstractions을 제공하고 Object 직렬화, Connection management를 수행한다.
  • 또한 Redis 서버에 데이터 CRUD를 위해, Redis의 다섯가지 데이터 유형에 대한 Operation Interface를 제공하는데 아래와 같다.
< 메소드명반환 오퍼레이션Redis 자료구조 >
opsForValue() ValueOperations String
opsForList() ListOperations List
opsForSet() SetOperations Set
opsForZSet() ZSetOperations Sorted Set
opsForHash() HashOperations Hash
  • RedisTemplate: RedisTemplate은 Thread-Safe 하며 재사용 가능
  • JacksonJsonSerializer: JSON 포맷으로 데이터를 저장하는 경우

 

 

※ Redis 내장 함수를 통해 저장되어있는 데이터를 유효시간이 지나면 자동 삭제할 수 있는데, 두 가지 방법이 있다. 지금 작성되어있는 방법이 아니라 다른 방법으로 수정할 예정이라 수정이 끝나는 대로 비교해서 다시 포스팅 하는 걸로 ! 투비컨티뉴 ....! 수정이 끝나는 대로 깃헙 링크를 올리겠습니다 : ) 

 


[ 참고 자료 ]

https://devlog-wjdrbs96.tistory.com/375

 

[Spring] Spring Data Redis로 자료구조 사용해보기

Spring Data Redis로 자료구조 다루어 보기 Redis 는 간단하게 말하면 Key-Value 형태의 영속성을 지원하는 인메모리 데이터 저장소입니다. 이번 글에서는 Spring Data Redis를 활용해서 List, Set, Sorted Set, Map을

devlog-wjdrbs96.tistory.com

 

+ Recent posts