(spring boot) RedisRepository 사용법, @RedisHash

  • by

Spring Data Redis, RedisRepository 사용법


redis repository 사용법

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


redis data example1

해당 데이터는 위에서 작성되었습니다.

“@Id 어노테이션과 @Indexes 어노테이션 적용” RefreshToken 객체가 redis에 저장되었을 때입니다.


redis data example2

그리고 그 데이터는 @Indexes 어노테이션을 사용하지 않고 @Id 어노테이션만 적용해당 객체를 저장한 경우입니다.

두 결과의 차이를 통해 객체 필드에 @Indexes 어노테이션에서 인덱스를 지정하면 위와 같이 ‘keyspace:@Id:idx’라는 키를 가진 데이터와 ‘keyspace: 색인이 적용된 필드: 해당 필드 값’라는 키가 있는 데이터가 추가로 저장되어 있는지 확인할 수 있습니다.


redis data type

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