[28] 스프링데이터: NoSQL - Redis
REmote DIctionary Server는 속도가 빠른 오픈소스 in-memory key, value 데이터 구조 스토어입니다.
REDIS를 사용하기 위해 spring boot project에 추가해야 할 의존성은 다음과 같습니다.
<dependencies>
...
<dependency>
<groupId>org.springframework.boot</groupId>
<artipactId>spring-boot-starter-data-redis</artipactId>
</depedency>
...
</dependencies>
docker에 redis 이미지를 올립니다. (redis에서 사용하는 기본 port 번호는 6379입니다.) terminal에서 다음과 같은 docker 명령어를 입력하여 redis의 이미지를 docker에 올릴 수 있습니다.
docker run -p 6379:6379 --name redis_boot -d redis
이제 redis를 실행하기 위해 terminal에서 다음 명령어를 실행해주세요.
docker exec -i -t redis_boot redis-cli
redis 콘솔창에 keys * 를 입력하여 현재 key들을 확인해보면 아무 것도 없음을 볼 수 있습니다.
spring data에서는 StringRedisTemplate 또는 RedisTemplate를 통해 redis를 사용할 수 있습니다.
JPA와 마찬가지로 CrudRepository 인터페이스를 extends 하여 사용할 수 있습니다.
사용자 계정에 대한 CRUD 기능을 작성하는 예제를 통해 Spring boot에서 redis를 어떻게 사용하는지 확인해보도록 합시다.
우선 ID, 사용자명, 이메일 정보를 가진 계정 도메인을 먼저 작성 하도록 하겠습니다. account package를 만들고 그 안에 Account class와 AccountRepository interface를 생성합니다.
Account class의 코드는 다음과 같습니다.
package me.dave.account;
import org.springframework.data.annotation.Id;
import org.springframework.data.redis.core.RedisHash;
@RedisHash("accounts") // ①
public class Account {
@Id String id; // ②
private String username;
private String email;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
① redis의 hash를 사용하기 위한 annotaion입니다.
② 자동생성되는 id입니다. long, String 어떤 type으로 해도 관계없습니다.
AccountRepository interface의 코드는 다음과 같습니다.
package me.dave.account;
import org.springframework.data.repository.CrudRepository;
public interface AccountRepository extends CrudRepository<Account, String> { // ①
}
① CrudRepository<T, ID>는 curd를 다루는 최상위급 interface로 이를 상속 받으면 손쉽게 crud 기능을 정의할 수 있습니다.
테스트를 위해 RedisRunner라는 이름으로 application runner class를 하나 만들어 줍니다.
package me.dave;
import me.dave.account.Account;
import me.dave.account.AccountRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Component;
import java.util.Optional;
@Component
public class RedisRunner implements ApplicationRunner {
@Autowired
StringRedisTemplate redisTemplate; // ①
@Autowired
AccountRepository accountRepository; // ②
@Override
public void run(ApplicationArguments args) throws Exception {
ValueOperations<String, String> values = redisTemplate.opsForValue(); // ③
values.set("dave", "daehee"); // ③
values.set("springboot", "2.0"); // ③
values.set("hello", "world"); // ③
Account account = new Account(); // ④
account.setEmail("dave@gmail.com"); // ④
account.setUsername("dave"); // ④
accountRepository.save(account); // ⑤
Optional<Account> byId = accountRepository.findById(account.getId()); // ⑥
System.out.println(byId.get().getUsername()); // ⑥
System.out.println(byId.get().getEmail()); // ⑥
}
}
① StringRedisTemplate 객체를 주입받습니다. 이 객체를 사용하여 redis를 사용할 수 있습니다.
② AccountRepository타입 객체를 주입 받습니다. 이 객체를 통해 CRUD를 진행합니다.
③ opsForValue()를 통해 StringRedisTemplate의 value 관련 연산들을 제공하는 객체를 받아오고 key, value pair를 저장합니다. (redisTemplate 타입도 사용할 수 있습니다.)
④ Account 객체를 생성하여 값을 넣습니다.
⑤ Account 객체의 내용을 redis에 저장합니다.
⑥ Id를 기준으로 Account 객체를 Optional<T>으로 가져오고 그 안의 값을 출력합니다.
이제 정상적으로 데이터가 저장되었는지 redis 콘솔창에서 확인해보도록 합니다.
key * 로 모든 key를 확인하면 다음과 같이 입력된 key들이 조회됩니다.
key에 해당하는 value는 아래와 같이 확인해볼 수 있습니다.
get [Key] : 일반적인 key의 value를 가져옵니다.
hget [Key] [Field] : hash code로 된 key의 value를 가져옵니다. colison을 고려하여 Field도 입력해줘야 합니다.
hgetall [Key] : hash code에 해당하는 모든 value를 조회합니다.
조회 결과는 다음과 같습니다.
redis 커스터마이징
application.properties에서 spring.redis.* 에 해당하는 설정 값들을 지정하는 것으로 커스터마이징 할 수 있습니다.
아무런 설정 없이 redis를 사용할 수 있었던 이유는 기본 설정으로 6379 port를 통해 연결했기 때문인데, 만약 다른 URL에 접속한다거나 port를 변경하는 경우에는 각각에 해당하는 설정 값을 변경해줘야 정상적으로 사용할 수 있습니다.
추가학습을 원하면