Home 스프링에서 Redis 사용하기
Post
Cancel

스프링에서 Redis 사용하기

스프링에서 Redis 사용하기

개요

스프링에서 Redis를 사용하는 방법에 대한 글

Redis 관련 의존성 추가

1
2
3
dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-data-redis'
}

Redis 관련 설정 추가

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Configuration
@EnableRedisRepositories
public class RedisConfig {
    @Value("${spring.data.redis.host}")
    private String host;

    @Value("${spring.data.redis.port}")
    private int port;

    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        return new LettuceConnectionFactory(host, port);
    }

    @Bean
    public RedisTemplate<String, Object> redisTemplate() {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory());
        return redisTemplate;
    }
}

공식 문서에 따르면 redis 저장소와 Spring의 consistent DAO간 통신을 위한 인터페이스의 역할을 RedisConnection 객체가 담당하고 이 객체는 RedisConnectionFactory 통해서 생성된다.

해당 예시 코드의 설정에서 사용되는 RedisConnection 구현체 라이브러리는 spring-boot-starter-data-redis에 내장되어 있는 Lettuce이다.

RedisConnection은 low level 단에서 redis 저장소와 통신하면서 binary 값을 주고 받는다면, RedisTemplate은 high level에서 동작한다. Java 객체를 직렬화해서 RedisConnection에 넘겨준다던가와 같은 역할을 한다.

Entity

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@RedisHash(value = "refreshToken", timeToLive = 1209600)
@Getter
public class RefreshToken {
    @Id
    private Long id;

    private String token;

    @Indexed
    private String email;

    @Builder
    private RefreshToken(String token, String email) {
        this.token = token;
        this.email = email;
    }

    public static RefreshToken of(Member member, String refreshToken) {
        return RefreshToken.builder()
                .token(refreshToken)
                .email(member.getEmail())
                .build();
    }
}
  • @RedisHash(value = “refreshToken”, timeToLive = 1209600)
    • value : redis에 저장될 때 key 값이 refreshToken으로 시작된다.
    • timeToLive : redis에 데이터 유지 시간
  • @Id
    • jakarta.persistence.Id가 아닌 org.springframework.data.annotation.Id 어노테이션이다.
    • @RedisHash 어노테이션과 함께 redis에 저장될 때 key 값을 만드는데 사용된다. (e.g.refreshToken:1678059561678466893)
  • @Indexed
    • secondary indexes 지정
    • secondary index로 조회시 primary index인 id가 조회된다.

Repository

1
2
3
public interface RefreshTokenRepository extends CrudRepository<RefreshToken, Long>{
    Optional<RefreshToken> findRefreshTokenByEmail(String email);
}

JPARepository(RDB)가 아닌 CrudRepository를 상속받도록한다. JPARepository와 마찬가지로 CRUD 메소드를 생성해주고 커스텀한 메소드도 추가할 수 있다.

CrudRepository가 아닌 직접 redis template을 사용해서 redis에 원하는 데이터를 저장하고 조회 할 수 있다. 공식문서를 참고하자

저장 결과 확인

1
2
3
...
    refreshTokenRepository.save(RefreshToken.of(member, refreshToken));
...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
127.0.0.1:6379> scan 0
1) "0"
2) 1) "refreshToken:1683537605679172161:idx"
   2) "refreshToken:email:test@test.com"
   3) "refreshToken:1683537605679172161"
   4) "refreshToken"
127.0.0.1:6379> hgetall refreshToken:1683537605679172161
1) "email"
2) "test@test.com"
3) "id"
4) "1683537605679172161"
5) "_class"
6) "com.example.blog.domain.auth.domain.RefreshToken"
7) "token"
8) "eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6InRlc3RAdGVzdC5jb20iLCJpYXQiOjE2ODU1MjM4ODQsImV4cCI6MTY4NTUyNTY4NH0.6MVlqlssJPcHkxqdfTLsjPCGVwkyV1m2bm_XXXXXXXX"

Refercence

This post is licensed under CC BY 4.0 by the author.

Spring Rest Docs 적용하기

스프링에서 embedded redis 테스트 환경 구축하기