개발 공부는 어려워
article thumbnail
반응형

 

Redis를 Spring Boot에서 사용하는 방법은 어렵지 않다.

 

/** Redis **/
    implementation 'org.springframework.boot:spring-boot-starter-data-redis'
    implementation 'redis.clients:jedis:3.7.1'

 

먼저 application에 있는 build.gradle 파일에 해당 내용을 작성한다..

 

그 이후 기본 application.properties 파일에 작성한 포트와 ip를 넣어줘야 하는데 나는 application.yml 파일이기 때문에

  #redis
  data:
    redis:
      host: localhost
      port: 6379

 

위와 같이 설정해주었다.

 

Redis를 사용하는 방법은 여러가지가 존재하는데

 

내가 선택한 방법은 JPA와 Lettuce, 그리고 RedisTemplate를 사용하는 방법이다.

 

먼저 lettuce를 사용하는 방법은 

 

@Configuration
public class RedisConfig {

    @Value("${spring.data.redis.host}") // application.yml에서 설정한 ip
    private String host;

    @Value("${spring.data.redis.port}") // application.yml에서 설정한 port
    private int port;

    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        return new LettuceConnectionFactory(host, port);
    }
}

 

RedisConnectionFactory를 return 해주는 Bean을 생성해주는 configuration class를 생성하고

 

@Getter
@ToString
public class RedisVo {

    @Id
    private String id;
    private String authCode;

    public RedisVo(String id, String authCode) {
        this.id = id;
        this.authCode = authCode;
    }
}

 

Redis 서버와 연동하는 Vo class를 생성한다. 여기에서 @Id를 사용한 변수는 redis에서 Key가 된다.

 

또한 RedisVo class 위에 @RedisHash라는 어노테이션을 사용하여 value와 그 value의 값을 넣어줄 수 있으며 timeToLive라는 설정을 주어 초딘위로 유효기간을 설정 할 수 있다. 이전 포스팅에 있는 setex와 동일한 개념이다.

 

마지막으로 jpa를 사용하는 interface를 생성해준다.

 

public interface RedisRepository extends CrudRepository<RedisVo, String> {
}

 

이렇게 설정을 한 이후에

@SpringBootTest
@Slf4j
class RedisTest {

    @Autowired
    private RedisRepository repo;

    @Test
    @DisplayName("JPA 사용 테스트 코드")
    void redisTest() {
        RandomCode randomCode = new RandomCode();
        log.info("random={}", randomCode.createCode());
        RedisVo vo = new RedisVo("jh950925", randomCode.createCode());
        log.info("=============================================================");
        log.info("vo={}",vo.toString());

        // 저장
        repo.save(vo);
        log.info("repo={}",repo);

        // Id값 가져옴
        repo.findById(vo.getId());
        log.info("repo.findById={}",repo);
        
        // vo안의 @RedisHash에 정의되어 있는 키의 갯수를 구함
        repo.count();
        log.info("=============================================================");

        // 삭제
        //repo.delete(vo);
    }
}

 

이렇게 테스트 코드를 작성 한 이후 결과를 확인하면 

 

로그에서는 결과를 확인할 수 있고

 

redis에서도

 

결과를 확인할 수 있다.

 


만약 JPA를 사용하지 않고 RedisTemplate를 사용한다면 

 

아까 생성했던 configuration class에서

@Configuration
public class RedisConfig {

    @Value("${spring.data.redis.host}")
    private String host;

    @Value("${spring.data.redis.port}")
    private int port;

    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        return new LettuceConnectionFactory(host, port);
    }

    // RedisTemplate 빈을 정의합니다.
    // RedisTemplate은 Redis와의 데이터 작업을 위한 중심 클래스로, 여러 가지 데이터 조작 메서드를 제공합니다.
    @Bean
    public RedisTemplate<byte[], byte[]> redisTemplate() {
        // RedisTemplate 객체를 생성합니다. 이 객체는 Redis와의 상호작용을 수행합니다.
        RedisTemplate<byte[], byte[]> redisTemplate = new RedisTemplate<>();

        // 생성된 RedisTemplate 객체에 RedisConnectionFactory를 설정합니다.
        // 이를 통해 RedisTemplate은 Lettuce 클라이언트를 사용하여 Redis와 연결을 관리합니다.
        redisTemplate.setConnectionFactory(redisConnectionFactory());

        // 키 직렬화를 위한 StringRedisSerializer를 설정합니다.
        // 이를 통해 Redis에 저장되는 모든 키는 문자열로 직렬화됩니다.
        redisTemplate.setKeySerializer(new StringRedisSerializer());

        // RedisTemplate 빈을 반환합니다.
        return redisTemplate;
    }
}

 

RedisTemplate를 사용하는 Bean을 생성해주고

 

해당 빈을 사용하는

@SpringBootTest
@Slf4j
class RedisTest {

    @Autowired
    private RedisRepository repo;
    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    @Test
    @DisplayName("JPA 사용 테스트 코드")
    void redisTest() {
        RandomCode randomCode = new RandomCode();
        log.info("random={}", randomCode.createCode());
        RedisVo vo = new RedisVo("jh950925", randomCode.createCode());
        log.info("=============================================================");
        log.info("vo={}",vo.toString());

        // 저장
        repo.save(vo);
        log.info("repo={}",repo);

        // Id값 가져옴
        repo.findById(vo.getId());
        log.info("repo.findById={}",repo);
        
        // vo안의 @RedisHash에 정의되어 있는 키의 갯수를 구함
        repo.count();
        log.info("=============================================================");

        // 삭제
//        repo.delete(vo);
    }

    @Test
    @DisplayName("redisTemplate 사용 테스트 코드")
    public void testRedisTemplate() {
        // ValueOperations 객체를 통해 Redis와 상호작용
        ValueOperations<String, String> valueOps = redisTemplate.opsForValue();

        // Redis에 데이터 저장
        String key = "testKey";
        String value = "testValue";
        valueOps.set(key, value);

        // 데이터 조회
        String retrievedValue = valueOps.get(key);
        assertThat(retrievedValue).isEqualTo(value);

        log.info("retrievedValue = {}", retrievedValue);

        // 데이터 삭제
        redisTemplate.delete(key);
        String deletedValue = valueOps.get(key);
        assertThat(deletedValue).isNull();
    }

}

 

테스트 코드를 작성한다. 

 

이 테스트 코드를 확인하면 

 

위 코드에서 testKey라는 값을 set해주고 다시 그 값 기준해서 get을 하여 retrievedValue = testValue 이런 값이

로그에 출력되는것을 확인할 수 있다. 

 

Redis에서도 확인해보면

값이 잘 저장된것을 확인할 수 있다.

반응형

'study > etc' 카테고리의 다른 글

Redis 명령어 정리  (0) 2024.06.12
Redis Window에서 설치하기  (0) 2024.06.11
Redis는?  (0) 2024.06.11
profile

개발 공부는 어려워

@신입개발자하랑이

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!