Programming/Spring Boot

Spring Boot Redis 두 가지 사용 방법 RedisTemplate, RedisRepository

Jan92 2021. 8. 22. 19:33

Redis 사용 방법

 

https://wildeveloperetrain.tistory.com/21

 

Redis란? 레디스의 기본적인 개념 (인메모리 데이터 구조 저장소)

Redis란? Key, Value 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈 소스 기반의 비관계형 데이터 베이스 관리 시스템 (DBMS)입니다. 데이터베이스, 캐시, 메세지 브로커로 사용되며 인메모리

wildeveloperetrain.tistory.com

인메모리 데이터 저장소 Redis 기본 개념에 대한 포스팅입니다.

 

 


 

 

Spring Boot Redis 사용 방법 (RedisTemplate, RedisRepository)

 

* Redis 설치 이후 진행과정입니다.

 

 

Spring Boot에서는 Spring Date Redis를 통해 Lettuce, Jedis라는 두 가지 오픈소스 Java 라이브러리를 사용할 수 있습니다.

Lettuce는 별도의 설정 없이 사용할 수 있으며 Jedis를 사용하고자 하시면 별도의 의존성을 필요로 합니다.

 

* 해당 포스팅은 Lettuce를 통해 Redis를 사용하는 과정을 담고 있습니다.

 

// https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis
implementation group: 'org.springframework.boot', name: 'spring-boot-starter-data-redis', version: '2.4.10'

Gradle 의존성 추가

 

<!-- 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>
    <version>2.4.10</version>
</dependency>

Maven 의존성 추가

 

 

 

Spring Data Redis는 Redis에 두 가지 접근 방식을 제공합니다.

하나는 RedisTemplate을 이용한 방식이며, 다른 하나는 RedisRepository를 이용한 방식입니다.

 

두 방식 모두 Redis에 접근하기 위해서는 Redis 저장소와 연결하는 과정이 필요합니다.

 

이 과정을 위해 'package org.springframework.data.redis.connection;' 패키지의 RedisConnectionFactory 인터페이스를 사용합니다.

 

@RequiredArgsConstructor
@Configuration
@EnableRedisRepositories
public class RedisRepositoryConfig {

    private final RedisProperties redisProperties;

    // lettuce
    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        return new LettuceConnectionFactory(redisProperties.getHost(), redisProperties.getPort());
    }

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

 

RedisConnectionFactory 인터페이스를 통해 LettuceConnectionFactory를 생성하여 반환합니다.

 

setKeySerializer, setValueSerializer 설정해주는 이유는 RedisTemplate를 사용할 때 Spring - Redis 간 데이터 직렬화, 역직렬화 시 사용하는 방식이 Jdk 직렬화 방식이기 때문입니다. 동작에는 문제가 없지만 redis-cli을 통해 직접 데이터를 보려고 할 때 알아볼 수 없는 형태로 출력되기 때문에 적용한 설정입니다.

 

 

# Redis
spring.redis.host=localhost
spring.redis.port=6379

 

그리고 RedisProperties를 통해서 properties에 저장한 host, port를 가지고 와서 연결합니다.

 

 

host, port외에 옵션들

변수 기본값 설명
spring.redis.database 0 커넥션 팩토리에 사용되는 데이터베이스 인덱스
spring.redis.host localhost 레디스 서버 호스트
spring.redis.password   레디스 서버 로그인 패스워드
spring.redis.pool.max-active 8 pool에 할당될 수 있는 커넥션 최대수 (음수로 하면 무제한)
spring.redis.pool.max-idle 8 pool의 "idle" 커넥션 최대수 (음수로 하면 무제한)
spring.redis.pool.max-wait -1 pool이 바닥났을 때 예외 발생 전, 커넥션 할당 차단 최대 시간
(단위 밀리세컨드, 음수는 무제한 차단)
spring.redis.pool.min-idle 0 풀에서 관리하는 idle 커넥션의 쵀소수 대상 (양수일 때만 유효)
spring.redis.port 6379 레디스 서버 포트
spring.redis.sentinel.master   레디스 서버 이름
spring.redis.sentinel.nodes   호스트: 포트 쌍 목록 (콤마로 구분)
spring.redis.timeout 0 커넥션 타임아웃 (단위 밀리세컨드)

- 참고 사이트

https://zetawiki.com/wiki/%EC%8A%A4%ED%94%84%EB%A7%81_REDIS_%ED%94%84%EB%A1%9C%ED%8D%BC%ED%8B%B0

 

 


 

직접적인 Redis 사용법 중, 첫 번째 RedisTemplate을 이용한 사용법입니다.

 

String refreshToken = jwtTokenProvider.createRefreshToken();

ValueOperations<String, String> valueOperations = redisTemplate.opsForValue();
valueOperations.set(rRTKey + user.getIdx(), refreshToken);
log.info("redis RT : {}", valueOperations.get(rRTKey + user.getIdx()));

 

Service 단에서 사용하였고, RedisTemplate을 생성자 주입 방식으로 추가하여 사용하였습니다.

 

* 프로젝트에서 로그인 시 RefreshToken을 cache 서버인 Redis에 저장할 용도로 사용하였고, 'rRTKey'라는 값은 따로 정의하여 가져온 String 값입니다.

 

 

Redis는 여러 자료 구조를 가지고 있고, 사용하는 자료 구조에 따라 적절한 메서드를 사용할 수 있습니다.

메서드 설명
opsForValue Strings를 쉽게 Serialize / Deserialize 해주는 interface
opsForList List를 쉽게 Serialize / Deserialize 해주는 interface
opsForSet Set을 쉽게 Serialize / Deserialize 해주는 interface
opsForZSet ZSet을 쉽게 Serialize / Deserialize 해주는 interface
opsForHash Hash를 쉽게 Serialize / Deserialize 해주는 interface

 

예시에서는 String 자료 구조를 사용하였기 때문에 opsForValue() 메서드를 사용하였습니다.

set을 통해 key, value 값을 저장하고, get(key)를 통해 저장한 value 값을 가지고 올 수 있습니다.

 

 


 

다음으로 RedisRepository를 사용한 객체 저장방법입니다.

 

@Getter
@Setter
@RedisHash("member")
public class Member {

    @Id
    private String id;
    private String name;
    private int age;

    public Member(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

 

Redis를 통해 저장할 Member Class입니다.

 

@RedisHash 어노테이션을 통해 설정한 값을 Redis의 key 값 prefix로 사용합니다.

@Id 어노테이션은 JPA와 동일한 역할을 수행합니다. "member:{id}"의 위치에 자동으로 generate 값이 들어갑니다.

 

 

public interface MemberRedisRepository extends CrudRepository<Member, String> {
}

 

다음으로 CrudRepository를 extends 한 Repository를 생성합니다.

 

 

@RequiredArgsConstructor
@Service
public class MemberService {

    private final MemberRedisRepository memberRedisRepository;

    public void addMember() {
        Member member = new Member("jan", 99);
        memberRedisRepository.save(member);
    }
}

repository의 save 메서드를 사용하면 hmset, hset이 호출되어 해당 객체가 저장됩니다.

 

 

redis 서버에 저장된 값 확인

 

hgetall key 명령어를 통해 service 단에서 저장한 member 객체가 레디스 서버에 저장된 것을 확인할 수 있습니다.

 

 

 

참고 사이트

https://do-study.tistory.com/111

https://sabarada.tistory.com/105

https://docs.spring.io/spring-data/data-redis/docs/current/reference/html/#reference