Redis - Spring Boot 와 연동
Redis 를 Spring Boot와 연동 해보자
build.gradle에 redis를 추가한다.
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
Redis를 사용하기위해 설정 파일 만든다.
application.properties
spring.redis.host=localhost
spring.redis.port=6379
RedisConfig.java
public class RedisConfig {
@Value("${spring.redis.host}")
public String host;
@Value("${srping.redis.port}")
public int port;
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.setConnectionFactory(connectionFactory);
return redisTemplate;
}
@Bean
public RedisConnectionFactory redisConnectionFactory() {
RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
redisStandaloneConfiguration.setPort(port);
redisStandaloneConfiguration.setHostName(host);
LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory(redisStandaloneConfiguration);
return connectionFactory;
}
}
RedisConnection, RedisConnectionFactory
RedisConnection은 redis 백엔드와의 통신을 다룬다.
RedisConnection은 RedisConnectionFactory를 통해 생성되고 이 RedisConnectionFactory가 PersistenceExceptionTranslator 역할을 수행한다.
IOC 컨테이너를 통해 RedisConnectionFactory에 적절한 connector를 설정하고 이를 주입받아서 사용하면 된다.
Redis Connector에는 대표적으로 Lettuce와 Jedis가 있는데 이 중 Lettuce를 사용해보려고 한다.
RedisTemplate
RedisTemplate은 다양한 타입에 대해 다양한 연산을 제공해준다.
setKeySerializer, setValueSerializer 설정해주는 이유는 RedisTemplate를 사용할 때 Spring - Redis 간 데이터 직렬화, 역직렬화 시 사용하는 방식이 Jdk 직렬화 방식이기 때문이다. 동작에는 문제가 없지만 redis-cli을 통해 직접 데이터를 보려고 할 때 알아볼 수 없는 형태로 출력되기 때문에 적용한 설정이다.
GenericJackson2JsonRedisSerializer
이 Serializer는 별도의 Class Type을 지정할 필요 없이 자동으로 Object를 Json으로 직렬화해주는 장점이 있다. 하지만 Object의 Class Type을 포함한 데이터를 저장하게 된다는 단점이 있다.
StringRedisSerializer
이 Serializer는 이름처럼 String 값을 그대로 저장하는 Serializer이다. 따라서 객체를 Json형태로 변환하여 Redis에 저장하기 위해서는 직접 Encoding, Decoding을 해주어야 한다는 단점이 존재한다. 하지만, 위에서 설명한 Serializer의 단점들을 보완할 수 있는 방법이기도 하다.
RedisSamle.java
@Controller
public class RedisSample {
@Autowired
StringRedisTemplate redisTemplate;
@GetMapping("/redis/list")
public String testRedisSample1() {
System.out.println("@@@@@@@@@@@@@@@@@ redis start @@@@@@@@@@@@");
List<JSONObject> redisList = new ArrayList<JSONObject>();
JSONObject json = new JSONObject();
json.put("userId","user1");
json.put("userName","userName1");
json.put("userTel","01012345678");
json.put("userEmail","user1@abc.com");
redisList.add(json);
String key = "TEST_REDIS_USER";
ListOperations<String, String> listOperations = redisTemplate.opsForList();
listOperations.rightPush(key, redisList.toString());
System.out.println("@@@@@@@@@@@@@@ redis end @@@@@@@@@@@@@@@");
return "redis/test";
}
}
결과
TEST_REDIS_USER 키 값으로 JSON 데이터가 들어가있는것을 볼수 있다.
Reference
https://growth-coder.tistory.com/228