https://growth-coder.tistory.com/228
위 링크의 RedisTemplate에 대한 설명을 보고 오는 것을 추천드립니다.
이전 포스팅에서 RedisTemplate을 사용하여 redis에 값을 저장해보았다.
단순 value를 저장한다고 하면 RedisTemplate을 통해 쉽게 저장할 수 있다.
그런데 단순 value가 아닌 복잡한 도메인 객체를 저장할 때는 RedisTemplate 보다는 RedisRepository를 사용하여 쉽게 구현할 수 있다.
먼저 엔티티를 만들어보자. 나는 다음과 같은 엔티티를 만들었다.
@RedisHash("token")
@AllArgsConstructor
public class Token {
@Id
private Long id;
private String accessToken;
private String refreshToken;
}
@RedisHash 어노테이션의 경우 key 중복을 방지하기 위함이다.
만약 Long 타입의 아이디를 key로 사용하는 두 개의 엔티티가 있을 때 key가 중복될 수 있기 때문에 @RedisHash를 통해 구분해주는 것이다.
만약 token의 id를 1로 지정해두고 저장한다면 실제 redis에는 "token:1"과 같은 형태로 key 값이 저장 된다.
다음은 설정 파일이다. spring.redis.host와 spring.redis.port는 application.properties에 등록되어 있다.
RedisRepository를 사용하기 위해 @EnabledRedisRepositories 어노테이션을 붙여준다.
@Configuration
@EnableRedisRepositories
public class RedisConfiguration {
@Value("${spring.redis.host}")
private String redisHost;
@Value("${spring.redis.port}")
private int redisPort;
@Bean
public RedisConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory(redisHost, redisPort);
}
@Bean
public RedisTemplate<?, ?> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, String> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
}
이제 CRUDRepository를 상속받은 인터페이스를 생성한다. 기본 CRUD 기능이 이미 구현되어있고 기본 생성 및 조회만 테스트 해 볼 예정이므로 따로 메소드를 작성하지는 않는다.
@Repository
public interface TokenRepository extends CrudRepository<Token, Long> {
}
사용할 때는 TokenRepository를 주입받아서 사용하면 된다.
저장은 save(entity), 아이디로 조회는 findById(id)를 사용하면 된다.
@Component
@RequiredArgsConstructor
public class JwtUtil {
private final TokenRepository tokenRepository;
public String createRefreshToken(Long id) {
.
.
.
Token token1 = new Token(id, "access", token);
tokenRepository.save(token1);
.
.
.
}
public boolean validateRefreshToken(String refreshToken) {
.
.
.
String storedRefreshToken = tokenRepository.findById(pk).get().toString();
System.out.println("storedRefreshToken = " + storedRefreshToken);
.
.
.
}
}
댓글