Springboot Redis 연동

박정호·2025년 2월 4일

기존에 만들어둔 springboot 프로젝트에 redis를 적용해보자. 우선 DB에 데이터가 잘 저장됐는지 확인해보자.

Boards 데이터 조회

BoardController와 BoardService에 있는 로직을 통해 DB에 저장된 데이터를 확인해보자

Spring Boot 프로젝트에 Redis 셋팅 추가하기

  1. Redis 의존성 추가하기

    build.gradle

    ... 
    
    dependencies {
      ...
      implementation 'org.springframework.boot:spring-boot-starter-data-redis'
    }
  1. application.yml 수정하기

    application.yml

    # local 환경
    spring:
      profiles:
        default: local
      datasource:
        url: jdbc:mysql://localhost:3307/redis_test
        username: root
        password: root
        driver-class-name: com.mysql.cj.jdbc.Driver
      jpa:
        hibernate:
          ddl-auto: update
        show-sql: true
      data:
        redis:
          host: localhost
          port: 6379
    
    logging:
      level:
        org.springframework.cache: trace # Redis 사용에 대한 로그가 조회되도록 설정
  1. Redis 설정 추가하기

    config/RedisConfig

    @Configuration
    public class RedisConfig {
        @Value("${spring.data.redis.host}")
        private String host;
    
        @Value("${spring.data.redis.port}")
        private int port;
    
        @Bean
        public LettuceConnectionFactory redisConnectionFactory() {
            // Lettuce라는 라이브러리를 활용해 Redis 연결을 관리하는 객체를 생성하고
            // Redis 서버에 대한 정보(host, port)를 설정한다.
            return new LettuceConnectionFactory(new RedisStandaloneConfiguration(host, port));
        }
    }
    

config/RedisCacheConfig

@Configuration
@EnableCaching // Spring Boot의 캐싱 설정을 활성화
public class RedisCacheConfig {
    @Bean
    public CacheManager boardCacheManager(RedisConnectionFactory redisConnectionFactory) {
        RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration
                .defaultCacheConfig()
                // Redis에 Key를 저장할 때 String으로 직렬화(변환)해서 저장
                .serializeKeysWith(
                        RedisSerializationContext.SerializationPair.fromSerializer(
                                new StringRedisSerializer()))
                // Redis에 Value를 저장할 때 Json으로 직렬화(변환)해서 저장
                .serializeValuesWith(
                        RedisSerializationContext.SerializationPair.fromSerializer(
                                new Jackson2JsonRedisSerializer<Object>(Object.class)
                        )
                )
                // 데이터의 만료기간(TTL) 설정
                .entryTtl(Duration.ofMinutes(1L));

        return RedisCacheManager
                .RedisCacheManagerBuilder
                .fromConnectionFactory(redisConnectionFactory)
                .cacheDefaults(redisCacheConfiguration)
                .build();
    }
}
  1. BoardService에 캐싱 로직 추가하기

    BoardService

    @RequiredArgsConstructor
    @Service
    public class BoardService {
    
        private final BoardRepository boardRepository;
        private Pageable pageable;
    
        @Cacheable(cacheNames = "getBoards", key = "'boards:page:' + #page + ':size:' + #size", cacheManager = "boardCacheManager")
        public List<Board> getBoards(int page, int size) {
            Pageable pageable = PageRequest.of(page - 1, size);
            Page<Board> pageOfBoards = boardRepository.findAllByOrderByCreatedAtDesc(pageable);
            return pageOfBoards.getContent();
        }
    }
    

    @Cacheable 어노테이션을 붙이면 Cache Aside 전략으로 캐싱이 적용된다. 즉, 해당 메서드로 요청이 들어오면 레디스를 확인한 후에 데이터가 있다면 레디스의 데이터를 조회해서 바로 응답한다. 만약 데이터가 없다면 메서드 내부의 로직을 실행시킨 뒤에 return 값으로 응답한다. 그리고 그 return 값을 레디스에 저장한다.

[속성 값 설명]

  • cacheNames : 캐시 이름을 설정
  • key : Redis에 저장할 Key의 이름을 설정
  • cacheManager : 사용할 cacheManager의 Bean 이름을 지정

redis와 연동하고 처음 실행 시켰을 때

밑줄 친 로그를 보면 No cache entry가 떠있는 것을 볼 수 있다.

cache 저장소를 확인해보니 cache miss가 뜬 것이고 원래 로직을 실행시켜 데이터베이스로부터 데이터를 가져오고 cache에 저장했다는 로그도 확인할 수 있다.

이후 여러번 페이지를 새로고침 시켰을 때

화면에서 볼 수 있다시피 cache entry 로그를 확인해 볼 수 있다.

redis cli 접속해서 확인

redis cli에 접속하여 확인해보면 cache에 잘들어간 것을 확인해볼 수 있고 value 값도 확인 가능하다.

만료시간확인하기

ttl 명령어를 통해 키의 만료시간이 잘 설정됐는지 확인할 수 있다.

0개의 댓글