-
[28] 스프링데이터: NoSQL - RedisSpring/Spring boot 2020. 9. 5. 08:29반응형
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를 변경하는 경우에는 각각에 해당하는 설정 값을 변경해줘야 정상적으로 사용할 수 있습니다.
추가학습을 원하면
'Spring > Spring boot' 카테고리의 다른 글
[30] 스프링 데이터: NoSQL - Neo4j (0) 2020.09.08 [29]스프링데이터: NoSQL - MongoDB (0) 2020.09.07 [27] Spring Data : Database Migration Tool (FlyWay) (0) 2020.07.21 [26] Spring Data : Initialization of Database (0) 2020.07.17 [25] Spring Data : Spring Data - JPA 연동 (0) 2020.07.15