gone

[Spring] RedisTemplate 본문

개발일지(TIL)/Spring

[Spring] RedisTemplate

예쁨받는 돌맹이 2025. 2. 2. 15:27
@Configuration
@EnableRedisRepositories
public class RedisConfig {

  @Bean
  public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
    StringRedisSerializer serializer = new StringRedisSerializer();

    RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
    redisTemplate.setConnectionFactory(redisConnectionFactory);
    redisTemplate.setKeySerializer(serializer);
    redisTemplate.setValueSerializer(serializer);
    redisTemplate.setHashKeySerializer(serializer);
    redisTemplate.setHashValueSerializer(serializer);
    return redisTemplate;
  }
}

 이 클래스는 직접 RedisTemplate 객체를 생성하고 Redis와의 연결을 직접 설정하고 있다.


- @Configuration

: Spring Boot에서 이 클래스를 설정파일로 인식하여  Bean 등록을 자동으로 수행

 

- @EnableRedisRepository

 : Srping Data Redis Repository 를 활성화하여, Redis를 JPA처럼 사용할 수 있도록 함.

 

- StringRedisSerializer

 : Redis는 기본적으로 Binary(직렬화) 데이터로 저장하기 때문에, Redis data를 String으로 저장 및 변환하기위해 사용.

 : 이 설정이 없으면 Redis에서 데이터를 저장할때 기본적으로 Java Binary로 저장되어 사람이 읽기 어렵다.

 


@Configuration
class MyConfig {

  @Bean
  LettuceConnectionFactory connectionFactory() {
    return new LettuceConnectionFactory();
  }

  @Bean
  RedisTemplate<String, String> redisTemplate(RedisConnectionFactory connectionFactory) {

    RedisTemplate<String, String> template = new RedisTemplate<>();
    template.setConnectionFactory(connectionFactory);
    return template;
  }
}

public class Example {

  // inject the actual operations
  @Autowired
  private RedisOperations<String, String> operations;

  // inject the template as ListOperations
  @Resource(name="redisTemplate")
  private ListOperations<String, String> listOps;

  public void addLink(String userId, URL url) {
    listOps.leftPush(userId, url.toExternalForm());
  }
}

 

이 클래스는 Spring Boot에서 Redis를 활용하여 URL을 저장하는 예제 코드이다.

주요 기능은 사용자의 ID(userId)를 키로 사용하여, 해당 사용자가 저장한 URL을 리스트 형태로 Redis에 저장하는 것이다.

 

이전 RedisConfig클래스와 다르게 Spring Boot가 미리 등록한 RedisTemplate Bean을 가져와서 사용하는 방법이다.

따라서  redisConnectionFactory 를 직접 설정할 필요 없이, Spring Boot의 자동 설정을 그대로 활용가능하다.

(RedisOperations 객체를 자동 주입하고 있기 때문에 직접 연결을 설정할 필요 X)


- @Resource(name = "rediisTemplate") 

 : Spring 컨테이너에서 redisTemplate 이름의 Bean을 찾아서 listOps에 주입

 

- ListOperations

 : Redis의 List 타입을 다룰 때 사용하는 인터페이스

 


 

Example 클래스와 같이 단순히 key,value가 String 으로 관리된다면 StringRedisTemplate을 사용하면된다.

아래는 위 코드를 StringRedisTemplate로 변환하여 작성한 코드이다.

@Configuration
class RedisConfiguration {

  @Bean
  LettuceConnectionFactory redisConnectionFactory() {
    return new LettuceConnectionFactory();
  }

  @Bean
  StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {

    StringRedisTemplate template = new StringRedisTemplate();
    template.setConnectionFactory(redisConnectionFactory);
    return template;
  }
}

public class Example {

  @Autowired
  private StringRedisTemplate redisTemplate;

  public void addLink(String userId, URL url) {
    redisTemplate.opsForList().leftPush(userId, url.toExternalForm());
  }
}

 

public void useCallback() {

  redisOperations.execute(new RedisCallback<Object>() {
    public Object doInRedis(RedisConnection connection) throws DataAccessException {
      Long size = connection.dbSize();
      // Can cast to StringRedisConnection if using a StringRedisTemplate
      ((StringRedisConnection)connection).set("key", "value");
    }
   });
}

 

RedisOperations .execute() 를 통해 Redis와 직접 연결된 RedisConnection을 직접 조작할 수 있다.

저수준 Redis 명령을 실행해야 할 경우 execute()를 활용한다.

 

 

  • execute()를 사용하여 Redis 콜백을 실행.
  • doInRedis()에서 RedisConnection을 가져옴.
  • dbSize()를 호출하여 현재 저장된 Key 개수를 확인.
  • Redis에 "key" -> "value" 값을 저장.

- execute() 특징

1. 트랜잭션 사용 가능 ( 여러 Redis 명령을 하나의 트랜잭션으로 실행가능 MULTI/EXEC 사용)

2. Jedis 또는 Lettuce 기반의 모든 기능을 활용가능 (RedisTemplate 에 제공되지 않는 고급 기능도 사용가능)

3. 일반적인 CRUD작업에는 필요 없음.


RedisTemplate<K, V>

- Spring Boot에서 Redis와의 데이터 입출력을 담당하는 기본 클래스

- Redis 데이터 저장/조회/삭제 등 CRUD 작업 수행

 

RedisOperations<K, V>

- RedisTemplate의 상위 인터페이스

- RedisTemplate과 동일한 기능을 제공하지만 인터페이스 기반