Redis

Redis - Spring Boot 와 연동

illho 2024. 4. 23. 22:01

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