2019. 3. 1. 14:02ㆍMiddleware/Redis
Springboot,redis - Redis repository 간단한사용법!
우선 처음에 조금 헤메긴 했지만, Redis Repository를 사용하려면 기존에 어떠한 Datasource라도 존재를 해야하는 것 같다. 그래서 임의로 인메모리디비인 H2를 dependency하였고, 모든 Datasource는 기본설정으로 두었다. 이렇게 인메모리 디비 데이터소스를 이용함에도 불구하고, 실제로는 Redis에 데이터가 삽입되는 것을 볼수 있다. 이유는 잘모르지만....아시는 분 있으시면 알려주세요...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75  | <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">     <modelVersion>4.0.0</modelVersion>     <parent>         <groupId>org.springframework.boot</groupId>         <artifactId>spring-boot-starter-parent</artifactId>         <version>2.1.3.RELEASE</version>         <relativePath/> <!-- lookup parent from repository -->     </parent>     <groupId>com.brownfield.pss</groupId>     <artifactId>redis-cluster</artifactId>     <version>0.0.1-SNAPSHOT</version>     <name>redis-cluster</name>     <description>Demo project for Spring Boot</description>     <properties>         <java.version>1.8</java.version>     </properties>     <dependencies>         <!-- Lombok -->         <dependency>             <groupId>org.projectlombok</groupId>             <artifactId>lombok</artifactId>             <version>1.18.4</version>             <scope>provided</scope>         </dependency>         <!-- H2 -->         <dependency>             <groupId>com.h2database</groupId>             <artifactId>h2</artifactId>             <scope>runtime</scope>         </dependency>         <dependency>             <groupId>org.springframework.boot</groupId>             <artifactId>spring-boot-starter-data-jpa</artifactId>         </dependency>         <dependency>             <groupId>org.springframework.boot</groupId>             <artifactId>spring-boot-starter-web</artifactId>         </dependency>         <!-- https://mvnrepository.com/artifact/org.json/json -->         <dependency>             <groupId>org.json</groupId>             <artifactId>json</artifactId>             <version>20160810</version>         </dependency>         <dependency>             <groupId>redis.clients</groupId>             <artifactId>jedis</artifactId>         </dependency>         <dependency>             <groupId>org.springframework.boot</groupId>             <artifactId>spring-boot-starter-data-redis</artifactId>         </dependency>         <dependency>             <groupId>org.springframework.boot</groupId>             <artifactId>spring-boot-starter-test</artifactId>             <scope>test</scope>         </dependency>     </dependencies>     <build>         <plugins>             <plugin>                 <groupId>org.springframework.boot</groupId>                 <artifactId>spring-boot-maven-plugin</artifactId>             </plugin>         </plugins>     </build> </project>  | cs | 
pom.xml이다. 일단 Datasource가 필요하다라는 예외메시지에 H2 인메모리 디비를 dependency했다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64  | /**  * Redis Configuration  * @author yun-yeoseong  *  */ @Configuration @EnableRedisRepositories public class RedisConfig {     /**      * Redis Cluster 구성 설정      */     @Autowired     private RedisClusterConfigurationProperties clusterProperties;     /**      * JedisPool관련 설정      * @return      */     @Bean     public JedisPoolConfig jedisPoolConfig() {         return new JedisPoolConfig();     }     /**      * Redis Cluster 구성 설정      */     @Bean     public RedisConnectionFactory jedisConnectionFactory(JedisPoolConfig jedisPoolConfig) {         return new JedisConnectionFactory(new RedisClusterConfiguration(clusterProperties.getNodes()),jedisPoolConfig);     }     /**      * RedisTemplate관련 설정      *       * -Thread-safety Bean      * @param jedisConnectionConfig - RedisTemplate에 설정할 JedisConnectionConfig      * @return      */     @Bean(name="redisTemplate")     public RedisTemplate redisTemplateConfig(JedisConnectionFactory jedisConnectionConfig) {         RedisTemplate redisTemplate = new RedisTemplate<>();         redisTemplate.setKeySerializer(new StringRedisSerializer());         redisTemplate.setValueSerializer(new StringRedisSerializer());         redisTemplate.setConnectionFactory(jedisConnectionConfig);         return redisTemplate;     } //    @Bean //    RedisTemplate<?, ?> redisTemplate(RedisConnectionFactory connectionFactory) { //     //      RedisTemplate<byte[], byte[]> template = new RedisTemplate<>(); //      template.setConnectionFactory(connectionFactory); //      return template; //    } }  | cs | 
Redis Config이다. @EnableRedisRepositories 어노테이션을 이용하여 레디스 레포지토리를 이용한다고 명시하였다. 나머지 설정은
이전 포스팅에서 구성했던 Redis Cluster 환경과 동일하게 진행하였다.
1 2 3 4 5 6 7 8  | package com.spring.redis; import org.springframework.data.repository.CrudRepository; public interface RedisRepository extends CrudRepository<RedisEntity, Long> {     public RedisEntity findByFirstname(String firstname); }  | cs | 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33  | package com.spring.redis; import java.io.Serializable; import org.springframework.data.annotation.Id; import org.springframework.data.redis.core.RedisHash; import org.springframework.data.redis.core.index.Indexed; import lombok.Getter; import lombok.Setter; import lombok.ToString; @RedisHash("person") @Getter @Setter @ToString public class RedisEntity implements Serializable{     private static final long serialVersionUID = 1370692830319429806L;     @Id     private Long id; //    @Indexed     private String firstname; //    @Indexed     private String lastname;     private int age; }  | cs | 
Redis 엔티티 설정이다. @RedisHash("person")으로 해당 엔티티가 레디스엔티티임을 명시하였다. 여러글을 읽다가 딱 설명하기 좋은 글이있었다.
RedisEntity라는 엔티티 데이터들을 이후에 무수히 많이 저장이 될것이다. 그래서 이 엔티티들만을 보관하는 하나의 해쉬키 값이 @RedisHash("person")이
되는 것이다. 그리고 이 해쉬 공간에서 각 엔티티들이 person:hash_id 라는 아이디 값을 가지게 된다.(실제로 @Id에 매핑되는 것은 Hash_id)
이것을 간단히 cli로 보여드리면
사실 key list를 불러오기 위해 " keys * "라는 명령어를 사용할 수 있지만, 이 명령어를 실행시키면 그동안 Redis의 모든 행동은 all stop 됨에 주의하자.
데이터 구조가 이해가 되는가?
이것을 자바의 해쉬 타입으로 지정한다면
HashMap<String,HashMap<String,Person>>의 구조가 되는 것이다. 해쉬의해쉬타입이 된다는 것이 그림에서도 표현이 되있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58  | package com.spring.redis; import java.util.Arrays; import java.util.List; import javax.annotation.Resource; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.dao.DataAccessException; import org.springframework.data.redis.core.HashOperations; import org.springframework.data.redis.core.ListOperations; import org.springframework.data.redis.core.RedisOperations; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.SessionCallback; import org.springframework.data.redis.core.SetOperations; import org.springframework.data.redis.core.ValueOperations; import org.springframework.data.redis.core.ZSetOperations; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest public class RedisTest {     @Autowired     private RedisTemplate redisTemplate;     @Autowired     private RedisRepository repository; //    @Test //    public void testDataHandling() { //         //        redisTemplate.getConnectionFactory().getConnection().info().toString(); //         //        String key = "yeoseong"; //        String value = "yoon"; //        redisTemplate.opsForValue().set(key, value); //        String returnValue = (String) redisTemplate.opsForValue().get(key); //         //        System.out.println(value); //    }     @Test     public void redisRepository() {         RedisEntity entity = new RedisEntity();         entity.setFirstname("yeoseong");         entity.setLastname("yoon");         entity.setAge(28);         repository.save(entity);         RedisEntity findEntity = repository.findByFirstname(entity.getFirstname());         System.out.println(findEntity.toString());     } }  | cs | 
'Middleware > Redis' 카테고리의 다른 글
| Springboot,Redis - Springboot Redis Nodes Cluster !(레디스 클러스터) (0) | 2019.03.01 | 
|---|---|
| Redis - Cluster & Sentinel 차이점 및 Redis에 대해 (0) | 2019.02.28 | 
| Redis - Sentinel 이란? 설정방법! Redis 고가용성을 위한 방법 (2) | 2019.02.27 | 
| Redis - Redis 설치 및 설정, 간단한 사용방법 (1) | 2019.02.27 |