Spring Data Redis, RedisRepository 사용법
spring boot에서 메모리 내 데이터 저장소인 redis를 사용하려면 org.springframework.data.redis.core 패키지에 있습니다.
“RedisTemplate 클래스 사용법” CrudRepository 상속 RedisRepository 사용 방법있습니다.
이 게시물에서는 두 번째 방법인 CrudRepository를 상속한 인터페이스를 사용하여 Redis를 사용하는 방법에 대해 설명합니다.
(예에서 사용되는 스프링 부트 버전은 2.6.4 버전을 사용했으며 Jedis, Lettuce 오픈 소스 라이브러리 중 스프링 부트 2.0 이후 기본적으로 설치된 Lettuce를 RedisClient로 사용했습니다.
)
1. 종속성 추가
<!
-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
// https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis
implementation group: 'org.springframework.boot', name: 'spring-boot-starter-data-redis'
(maven 또는 gradle 종속성 추가)
먼저 Redis를 사용하기 위해 “spring-boot-starter-data-redis” 종속성을 추가합니다.
2. RedisConfig Class 만들기
@EnableRedisRepositories
@Configuration
public class RedisConfig {
@Value("${spring.redis.host}")
private String redisHost;
@Value("${spring.redis.port}")
private int redisPort;
@Bean
public RedisConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory(redisHost, redisPort);
}
}
//application.yml file 중 redis 관련 설정 값
spring:
redis:
host: localhost
port: 6379
이어서 생성 “RedisConfig” 클래스는 @Value 어노테이션을 통해 .properties 또는 .yml 파일에 설정된 host 값과 port 값을 가져오고 가져온 host, port 값을 사용하여 LettuceConnectionFactory를 만들고 Bean으로 등록합니다.
이때 해당 config 클래스에 @EnableRedisRepository 주석을 달고 RedisRepository를 활성화합니다.
3. Redis에 저장할 데이터 구조 객체 클래스 만들기
@Builder
@Getter
@AllArgsConstructor
@NoArgsConstructor
@RedisHash(value = "refresh", timeToLive = 1209600)
public class RefreshToken {
@Id
private String id;
private String ip;
private Collection<? extends GrantedAuthority> authorities;
@Indexed
private String refreshToken;
}
spring data redis에서 redis repository 방식을 사용하면 Domain Object를 redis hash 데이터 구조로 쉽게 변환하고 저장할 수 있습니다.
@RedisHash의 value 값(redis keyspace)에 특정 값을 넣으면 나중에 해당 데이터의 키가 생성될 때 prefix를 지정할 수 있습니다.
@Id 주석으로 접두사: 구분 기호 형식(keyspace:@id)로 데이터의 키를 저장하고 각 데이터를 구분할 수 있습니다.
이때, @Id 어노테이션은 org.springframework.data.annotation.Id를 사용하며 null로 저장되면 무작위 값으로 설정됩니다.
추가 기능으로 @Indexes 주석을 사용하여 보조 색인을 적용할 수 있습니다.
@TimeToLive 주석을 사용하여 TTL을 적용할 수 있습니다.
(timeToLive에 적용되는 시간은 “초” 단위입니다.
기본값은 -1L입니다.
이 경우 유효 시간은 설정되지 않습니다.
)
4. RedisRepository
public interface RefreshTokenRedisRepository extends CrudRepository<RefreshToken, Long> {
RefreshToken findByRefreshToken(String refreshToken);
}
(redisRepository)
CurdRepository를 상속하는 CustomInterface를 생성합니다.
redisRepository 메소드는 CrudRepository를 상속하는 인터페이스가 사용되기 때문에 Spring Data JPA에서 JpaRepository를 사용하는 방법과 유사하다는 특징이 있습니다.
refreshTokenRedisRepository.save(RefreshToken.builder()
.id(authentication.getName())
.ip(Helper.getClientIp(request))
.authorities(authentication.getAuthorities())
.refreshToken(tokenInfo.getRefreshToken())
.build());
(save example)
5. Redis Data
해당 데이터는 위에서 작성되었습니다.
“@Id 어노테이션과 @Indexes 어노테이션 적용” RefreshToken 객체가 redis에 저장되었을 때입니다.
그리고 그 데이터는 @Indexes 어노테이션을 사용하지 않고 @Id 어노테이션만 적용해당 객체를 저장한 경우입니다.
두 결과의 차이를 통해 객체 필드에 @Indexes 어노테이션에서 인덱스를 지정하면 위와 같이 ‘keyspace:@Id:idx’라는 키를 가진 데이터와 ‘keyspace: 색인이 적용된 필드: 해당 필드 값’라는 키가 있는 데이터가 추가로 저장되어 있는지 확인할 수 있습니다.
type 명령어로 저장된 데이터의 종류를 확인하면 set 또는 hash 유형의 데이터가 저장되어 있는지 확인할 수 있습니다.
2021.08.12 – (Programming/Web) – Redis란? 여성의 기본 개념(인메모리 데이터 구조 리포지토리)
2023.03.05 – (Programming/Error) – Redis 데이터 형식, (error) WRONGTYPE Operation against a key holding the wrong kind of value
<参考資料>
https://docs.spring.io/spring-data/redis/docs/2.3.3.RELEASE/reference/html/#redis.repositories