https://zzzzseong.tistory.com/5
해당 글은 위 포스트와 이어지는 글입니다. Redis개념과 Docker를 이용한 Redis 사용방법을 보려면 위 포스트를 참고해주세요.
목표
- 이전 포스트에서 Redis의 기본적인 개념과 작동방식을 알아보았다. 이번 포스트에서는 Redis를 Spring에서 사용하는 방법에 대해 알아보자.
Redis 사용을 위한 Spring Setting
- Spring에서 Redis를 사용하기 위해서는 build.gradle과 application 파일에 Redis 관련 코드를 추가해야한다. 우선 build.gradle dependencies에 아래 코드를 추가한다.
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
- 다음으로는 application 파일에 redis host와 post, password 정보를 저장한다. Redis password를 설정하지 않았다면 host와 port 정보만 작성해도 정상적으로 돌아간다.
spring.data.redis.host = localhost
spring.data.redis.port = 6380
spring.data.redis.password = 1234
RedisTemplate 사용하기
- Spring에서 Redis를 사용하는 방식은 RedisTemplate와 RedisRepository 방식이 있다. 먼저, RedisTemplate을 사용하는 방법을 알아보자.
- 먼저, config 파일을 추가해 Spring에 Redis를 추가한다. Lettuce를 이용해 Redis를 연결하고 RedisTemplate를 Bean에 등록하여 사용한다.
- config 파일을 추가했다면 Redis를 정상적으로 사용할 수 있다. 먼저, 아래와 같이 원하는 Key, Value 타입에 맞춰 이전 config에서 설정한 redisTemplate를 주입받는다.
@Autowired private RedisTemplate<String, String> redisTemplate;
- redisTemplate를 선언했다면 아래와 같이 사용할 수 있다. 아래는 Redis의 String, Set, Hash 자료구조를 이용하여 Redis를 사용하는 예제 코드이다.
@SpringBootTest
public class RedisConnectionTest {
@Autowired private RedisTemplate<String, String> redisTemplate;
@Test
public void stringOperation() {
//given
ValueOperations<String, String> valueOperations = redisTemplate.opsForValue();
String key = "key";
//when
valueOperations.set(key, "value");
redisTemplate.expire(key, 60, TimeUnit.MINUTES); //key 만료시간 설정
//then
String value = valueOperations.get("key");
assertThat(value).isEqualTo("value");
}
@Test
public void SetOperation() {
//given
SetOperations<String, String> setOperations = redisTemplate.opsForSet();
String key = "key";
//when
setOperations.add(key, "value1", "value2", "value3");
//then
Set<String> members = setOperations.members(key);
assertThat(members).contains("value1", "value2", "value3");
}
@Test
public void HashOperations() {
//given
HashOperations<String, Object, Object> hashOperations = redisTemplate.opsForHash();
String key = "key";
//when
hashOperations.put(key, "hashKey", "value1");
//then
Object value = hashOperations.get(key, "hashKey");
assertThat(value).isEqualTo("value1");
}
}
RedisRepository 사용하기
- RedisRepository를 이용하기 위해서는 Entity를 선언해야한다. 기존 RDB에 Entity를 매핑할때는 @Entity 를 사용했지만 Redis는 @RedisHash 어노테이션을 사용한다.
- value 값은 Redis에서의 keyspace 값이 되며, timeToLive 값을 통해 초단위로 만료시간을 설정할 수 있다. @Id 가 붙어있는 필드는 Entity의 고유번호로 Redis에서는 이 둘을 합쳐{keyspace : id}와 같은 형식으로 key를 생성한다.
@Getter
@NoArgsConstructor
@RedisHash(value = "member", timeToLive = 60 * 60 * 24)
public class Member {
@Id
private String id;
private String username;
public Member(String id, String username) {
this.id = id;
this.username = username;
}
}
- Redis와 상호작용을 위해 RedisRepository interface를 생성한다. 위 Entity와 Repository부분만 봐도 다양한 케이스에서 정형화된 형식으로 Spring을 이용해 여러 DB를 사용하기 매우 편리하다고 느꼈다.
public interface MemberRedisRepository extends CrudRepository<Memeber, String> {}
- 이제 기존 RDB에서 spring data jpa를 이용했던 것처럼 아래와 같이 RedisRepository를 이용하면 된다.
@SpringBootTest
public class RedisConnectionTest {
@Autowired private MemberRedisRepository redisRepository;
@Test
public void redisRepositoryTest() {
Member member = new Member("1", "thinkingpotato");
redisRepository.save(member);
Memeber findMember = redisRepository.findById("1");
redisRepository.delete(findMember);
}
}
[ 참고자료 ]
https://bcp0109.tistory.com/328