Spring에서는 Spring Data Redis 라이브러리를 이용하여 Redis에 접근할 수 있다.
이때 Redis를 접근할 수 있는 프레임워크로 Lettuce, Jedis가 있다.
Lettuce는 별도의 설정 없이 이용할 수 있고, Jedis는 별도의 의존성 추가가 필요하다.
또한 Spring Data Redis로 Redis에 접근하는 방식으로는
1. RedisTemplate
2. RedisRepository
방식이 존재한다.
이번 포스팅에서는 Lettuce와 RedisTemplate을 이용하여 Redis를 Spring boot local 환경에서 사용하는 것이 목표이다.
- Spring Data Redis 의존성 추가
- RedisTemplate 설정
- 설정된 Redis test (테스트 코드 사용 x, 간단한 테스트o)
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
Redis 연결을 위한 class를 생성한다.
@Configuration
public class RedisConfig {
@Value("${spring.redis.host}")
private String redisHost;
@Value("${spring.redis.port}")
private int redisPort;
@Bean
public RedisConnectionFactory redisConnectionFactory(){
return new LettuceConnectionFactory(redisHost,redisPort);
}
@Bean
public RedisTemplate<?,?> redisTemplate(){
RedisTemplate<byte[], byte[]> redisTemplate=new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory());
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
return redisTemplate;
}
@Bean
public StringRedisTemplate stringRedisTemplate(){
StringRedisTemplate stringRedisTemplate=new StringRedisTemplate();
stringRedisTemplate.setKeySerializer(new StringRedisSerializer());
stringRedisTemplate.setValueSerializer(new StringRedisSerializer());
stringRedisTemplate.setConnectionFactory(redisConnectionFactory());
return stringRedisTemplate;
}
}
📍 위의 코드 설명
1. Redis에 접근하기 위해서 Redis 저장소와 연결
이 과정을 위하여 RedisConnectionFactory 인터페이스를 사용한다.
RedisConnectionFactory 인터페이스를 통하여 LettuceConnectionFactory를 생성하여 반환한다.
-> 새로운 Connection이나 이미 존재하는 Connection 리턴
-> Jedis, Lettuce 등 Redis-client를 선택하여 연결 생성
📌 @Value 사용하기 때문에 미리 설정 파일에서 spring.redis.@@ 구조로 설정 필요2. RedisTemplate, StringRedisTemplate bean 생성
- RedisTemplate: java Object를 redis에 저장하는 경우 사용
- StringRedisTemplate: 일반적인 String 값을 key, value로 사용하는 경우 사용
🖇 setKeySerializer, setValueSerializer 설정 이유는, RedisTemplate 사용 시에 Spring-Redis 간 데이터 직렬화, 역직렬화에 사용하는 방식이 Jdk 직렬화 방식이기 때문이다.
현재 구현할 서비스에서는 Redis에 객체를 저장하진 않지만 혹시 쓰일까봐 RedisTemplate도 정의하였다. 사용은 StringRedisTemplate만 할 듯!
@Autowired
private StringRedisTemplate redisTemplate;
private final String KEY="keyword";
@org.junit.Test
public void 검색어_저장(){
//given
String keyword="한남동 맛집";
String keyword2="서촌 맛집";
//when
redisTemplate.opsForZSet().add(KEY,keyword,1);
redisTemplate.opsForZSet().incrementScore(KEY,keyword,1);
redisTemplate.opsForZSet().incrementScore(KEY,keyword,1);
redisTemplate.opsForZSet().add(KEY,keyword2,1);
//then
System.out.println(redisTemplate.opsForZSet().popMax(KEY));
System.out.println(redisTemplate.opsForZSet().popMin(KEY));
}
간단하게 검색어를 저장하고 이를 count하는 test를 만들어보았다.
"한남동 맛집"은 count가 3회 되어야 하고
"서촌 맛집"은 count가 1회 수행되어야 한다.
opsForZSet 이외에도 많은 자료형이 있으니
이는 추후에 정리하도록 하고 급히 구현할 것부터 먼저 구현해야겠다.(ㅠㅠ)
[참고한 포스팅]
1. https://wildeveloperetrain.tistory.com/32
2. https://blossom6729.tistory.com/16
+) implementation 'org.springframework.boot:spring-boot-starter-data-redis'
group data 아니고 boot임.