Spring 프로젝트에서 Redis
와 관련된 기능들을 쉽게 다루기 위한 Spring 모듈이다. 다른 모듈과 마찬가지로 의존성을 추가해야 기능을 사용할 수 있다.
build.gradle
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
}
Spring 에서 Redis 를 사용하기 위한 방법은 두 가지가 있는데, RedisTemplate
을 이용한 방법과 Repository
를 이용하는 방법이다. Repository 는 JPA 와 유사한 방법으로 사용할 수 있다.
Redis Repository 를 사용하기 위한 객체의 기본 구조는 다음과 같다.
controller - service - repository - entity
controller 와 service 는 다른 프로젝트와 동일하고, Repository 는 Redis 에 접근하는 DB 계층이다. Entity 는 Repository 에서 사용할 자바 객체이다. Entity 에서 Redis 에 저장할 값과 형식을 지정할 수 있다.
XXXRepository.java
import java.util.Optional;
import org.springframework.data.repository.CrudRepository;
import com.dobugs.yologaauthenticationapi.domain.OAuthToken;
public interface OAuthRepository extends CrudRepository<OAuthToken, Long> {
Optional<OAuthToken> findByRefreshToken(String refreshToken);
}
CrudRepository 를 상속받아 사용할 수 있다. JPA 와 유사하게 메서드명으로 원하는 쿼리를 커스텀할 수 있다.
XXX.java
import org.springframework.data.annotation.Id;
import org.springframework.data.redis.core.RedisHash;
import org.springframework.data.redis.core.index.Indexed;
import lombok.AllArgsConstructor;
@AllArgsConstructor
@RedisHash
public class OAuthToken {
@Id
private Long memberId;
private Provider provider;
private String accessToken;
@Indexed
private String refreshToken;
@TimeToLive
private Long expiration;
public static OAuthToken login(final Long memberId, final Provider provider, final String refreshToken, final Long expiration) {
return new OAuthToken(memberId, provider, null, refreshToken, expiration);
}
}
@RedisHash
: Hash 형태로 저장한다.@Id
: 데이터를 구분하는 ID 와 같은 역할을 한다. Redis 내부에서 Set 으로 별도 관리한다.@Indexed
: Redis 데이터에 인덱스를 설정한다. Repository 에서 find 등의 커스텀을 추가하였다면 값을 찾기 위해서 인덱스를 추가해야 한다.@TimeToLive
: Redis Repository 방식에서 해당 key 에 만료 시간을 설정하고 싶을 때 사용한다.JPA 에서 테스트하기 위해 @DataJpaTest 어노테이션을 사용했던 것처럼 Redis 를 테스트하기 위해서는 @DataRedisTest
어노테이션을 사용한다. 이 어노테이션을 사용하면 Redis 와 관련된 빈들만을 가져와 테스트할 수 있다.
Annotation for a Data Redis test that focuses only on Redis components.