Spring에서 Redis 사용 기초

haruceki·2024년 8월 8일
0

0. Redis란?

  • Redis는 REmote DIctionary Server를 줄인말로, Java의 Map과 같은 방식으로 데이터를 저장하는 데이터베이스이다.
  • 대표적인 NoSQL 데이터베이스.
  • In-memory 방식. 즉, RAM에 데이터를 저장하므로 빠르지만 휘발성이 있는 데이터를 다룬다.
  • 즉 비정형 데이터를 효율적으로 다루는 상황에 활용된다.
    - 세션 클러스터링, 캐싱 등

1. 레디스 디펜던시 추가, 레디스 서버 연결 설정 추가

  • Spring Data Redis (Access+Driver) 디펜던시 추가
  • application.yml로 레디스와 연결
spring:
  data:
    redis:
      host: localhost
      port: 6379
      username: default
      password: <설정한 비밀번호>

2. Spring data repository로 레디스와 연동

  • @Entity 어노테이션 대신 @RedisHash를 사용하여 item이라는 객체 클래스를 만든다.
  • 그리고 CrudRepository를 상속한 ItemRepository 인터페이스를 만든다.
  • 아래는 insert를 하는 예시이다. redis와 연동해서 사용하는 방법이 Spring Data JPA와 유사하다.
@Test
public void createTest() {
    Item item = Item.builder()
            .name("keyboard")
            .description("Mechanical Keyboard Expensive 😢")
            .build();
    itemRepository.save(item);
}
  • insert 결과 키들을 모두 검색하면 (KEYS * ) item, item:<랜텀한 uuid> 라는 키가 2개 나온것을 확인 가능하다.
  • 해시테이블의 키의 모든 값을 검사하면 (HGETALL item:1) 결과값이 field와 value에 담긴 것을 확인할 수 있다.

3. RestTemplate로 레디스와 연동

StringRedisTemplate

StringRedisTemplate는 redisTemplate을 상속받는, redis와 소통하기 위한 템플릿의 모음

복잡한 작업없이 자바의 문자열만 다루는 경우 사용 가능. Key와 value가 전부 자바의 문자열이라고 가정, 문자열 데이터를 주고받기 위한 작업들을 준비하며, 기본 설정을 가지고 자동으로 만들어져 주입되는 Spring bean이다.

이 StringRedisTemplate은 각 자료형에 대응하는 *Operations 인터페이스 구현체를 반환할 수 있는 메서드들을 가지고 있다. 예를들어, opsForValue() 메서드를 호출하게 될 경우 ValueOperations<String, String>이 반환된다.

여기서 String은 레디스의 문자열을 의미하지 않는다. 레디스와 소통 위한 자바의 자료형을 의미. 즉, 레디스의 여러가지 타입을 자바의 문자열과 연결된다는 의미이다.

@Autowired
    private StringRedisTemplate stringRedisTemplate; 

    @Test
    public void stringOpsTest() {
        ValueOperations<String,String> ops = stringRedisTemplate.opsForValue();
        //레디스 명령어 SET, GET을 메서드 형태로 보관하고 있는 것
        
        ops.set("simplekey", "simplevalue");
        System.out.println(ops.get("simplekey"));

        //집합을 조작하기 위한 클래스 - SADD 명령어와 같다.
        SetOperations<String, String> setOps = stringRedisTemplate.opsForSet();
        setOps.add("hobbies", "games"); 
        setOps.add("hobbies", "coding", "drink", "games");
        System.out.println(setOps.size("hobbies"));

        stringRedisTemplate.expire("hobbies", 10, TimeUnit.SECONDS); //10초뒤 삭제
        stringRedisTemplate.delete("simplekey");
    }

RedisTemplate

모든 데이터를 자바의 문자열로 주고받을시 간단히 StringRedisTemplate를 쓰면 되고, 다른 상세한 redis의 작업을 하려면 redisConfig에서 redisTemplate을 빈으로 등록 후 사용한다.

  • RedisConfig.java
@Configuration
public class RedisConfig {
    @Bean
    //RedisConnectionFactory는 yml에 넣은 정보를 바탕으로 만들어지게 된다.
    public RedisTemplate<String, ItemDto> itemRedisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate<String, ItemDto> template = new RedisTemplate<>();
        template.setConnectionFactory(connectionFactory);                 
        template.setKeySerializer(RedisSerializer.string());              
        template.setValueSerializer(RedisSerializer.json());              
        return template;                                                 
    }
}
  • 사용 예시
@Autowired
    private RedisTemplate<String, ItemDto> itemRedisTemplate;

    @Test
    public void itemRedisTemplateTest() {
        ValueOperations<String, ItemDto> ops = itemRedisTemplate.opsForValue();
        ops.set("my:keyboard", ItemDto.builder()
                .name("Mechanical Keyboard")
                .price(300000)
                .description("Expensive 😢")
                .build());
        System.out.println(ops.get("my:keyboard"));

        ops.set("my:mouse", ItemDto.builder()
                .name("mouse mice")
                .price(100000)
                .description("Expensive 😢")
                .build());
        System.out.println(ops.get("my:mouse"));
    }
profile
희망도 절망도 없이 매일 코딩을 한다.

0개의 댓글