Redis-Springboot 연동

공부는 혼자하는 거·2021년 9월 8일
0

Spring Tip

목록 보기
14/52

spring boot 에서 redis 에 데이터 set, get 하는 방법은 크게 아래 2가지가 있습니다.

1) RedisTemplate 를 이용하는 방법 ( low level API )

2) CrudRepository 를 이용하는 방법 ( high level API, JPA 처럼 사용 ) https://www.baeldung.com/spring-data-redis-tutorial

그리고 Redis 구동모드로 아래 3가지가 있으며 각 모드에 따라 connection 설정하는 방법이 약간씩 다릅니다.

standalone

sentinel

cluster

Java의 Redis Client는 크게 2가지가 있습니다.

Spring Boot의 버전이 업그레이드되면서 자연스럽게 Jedis가 deprecated 되는 증상이 발생하였습니다. 잘은 모르겠지만 Lettuce를 쓰자.

두개 다 살펴보자. 일단 공통으로 설정은

<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis</artifactId>
		</dependency>  

or(gradle)

implementation 'org.springframework.boot:spring-boot-starter-data-redis'

메인 어플리케이션 클래스에 @EnableCaching 을 선언해주세요.

해당 어노테이션을 선언하면 스프링 부트에서는 @Cacheable과 같은 캐싱 어노테이션의 사용을 인식하게 됩니다.

@EnableCaching
@SpringBootApplication
public class TestApplication {
    public static void main(String[] args) {
        SpringApplication.run(TestApplication.class, args);
    }
}
spring:
  cache:
    type: redis
  redis:
    host: 127.0.0.1
    port: 6397

    lettuce:
      pool:
        max-active: 10
        max-idle: 10
        min-idle: 5

1. RedisTemplate 방식

RedisTemplate, StringRedisTemplate

RedisTemplate의 Serialize, Deserialize로 String을 사용하는 StringRedisTemplate을 사용

Redis는 여러 자료 구조를 가지고 있습니다. 이런 여러 종류의 자료구조를 대응하기 위해 Spring Data Redis는 opsFor[X](ex. opsForValue, opsForSet, opsForZSet 등)라는 메서드를 제공합니다. 해당 메서드를 사용하면 각 자료구조에 대해서 쉽게 Serialize 및 Deserialize 할 수 있습니다. 각 메서드에 대한 설명은 아래와 같습니다.

제목 없음

RedisConfig 설정

@Configuration
public class RedisConfig {  //bean 등록

    @Bean
    public LettuceConnectionFactory redisConnectionFactory() {
        return new LettuceConnectionFactory("localhost",6397);
    }
    //yml 설정에서 이미 해줬고, 자동 Bean 등록이 안 되는 듯?

    @Bean
    public RedisTemplate<?, ?> redisTemplate() {
        RedisTemplate<byte[], byte[]> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory());
        return redisTemplate;
    }

    @Bean
    public StringRedisTemplate stringRedisTemplate() {
        StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
        stringRedisTemplate.setConnectionFactory(redisConnectionFactory());

        return stringRedisTemplate;
    }

}

2. RedisRepository 사용법

https://github.com/stella6767/SpringBootRedis/tree/dev1 깃 주소 dev1 branch

Config 설정

@Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(connectionFactory);

        // string type 저장시 아래 설정 적용됨.
        template.setKeySerializer(new StringRedisSerializer());
        template.setValueSerializer(new StringRedisSerializer());

        // repository 에서 저장시 hash type으로 저장되므로, 아래 설정 적용됨.
        template.setHashKeySerializer(new StringRedisSerializer());
        template.setHashValueSerializer(new StringRedisSerializer());
        return template;
    }

오브젝트도 저장할 수 있도록 설정해주었다.

@Data
public class User implements Serializable {
    private String id;
    private String pw;
}

위처럼 하는 대신에 설정에서 수정한 거임. 나머지는 1번 방법과 동일

Model과 Repository 설정

쓰는 거 거의 JPA 랑 똑같다.

public interface PersonRepository extends CrudRepository<Person, Integer> {
    //RedisRepository
}
@AllArgsConstructor
@Data
@RedisHash("person")		// 이 값이 redis key의 prefix 로 사용됨. ex) key = person:<id> 조합
public class Person {

    public enum Gender {
        MALE, FEMALE
    }

    @Id
    private Integer id;

    private String name;
    private Integer age;
    private Gender gender;

    private Address address;

}
@AllArgsConstructor
@Data
public class Address {
    private String name;
}

TEST

@Test
    public void personSaveTest() {
        // given
        Address address = new Address("서울특별시 서울시청");
        Person person = new Person(null, "kangmingyu", 28, Person.Gender.MALE, address);

        // when
        Person personEntity = personRepository.save(person);

        // then
        Optional<Person> findPerson = personRepository.findById(personEntity.getId());

        assertThat(findPerson.isPresent()).isEqualTo(Boolean.TRUE);
        assertThat(findPerson.get().getAge()).isEqualTo(person.getAge());
    }

value까지 같이 확인하는 redis-cli 명령어는 없는 거 같다..

이후 추가로 서비스와 controller 만들어서 실 테스트 결과.

참고

https://deveric.tistory.com/98

https://blog.naver.com/semtul79/222235108317

https://sabarada.tistory.com/104?category=856943

https://happyer16.tistory.com/entry/Redis-Spring-Boot에-설정하기-및-개요

https://fenderist.tistory.com/412

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

profile
시간대비효율

0개의 댓글