[Redis] Spring Boot에 Redis 세팅

정석·2024년 9월 15일

Redis

목록 보기
2/5
post-thumbnail

1. Redis 의존성 추가

dependencies {
  
  .
  .
  .
  
  implementation 'org.springframework.boot:spring-boot-starter-data-redis'
}

2. application.yml 수정

# local 환경
spring:
  profiles:
    default: local
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: root
    password: password
    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 사용에 대한 로그가 조회되도록 설정
  • 로컬 환경 설정 아래 data 항목을 추가하여 설정한다.

3. 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라는 라이브러리

        return new LettuceConnectionFactory(new RedisStandaloneConfiguration(host, port));
    }
}
  • Lettuce 라는 Redis 연결 관련 라이브러리를 활용한다.
    이를 통해 Redis 서버에 대한 host, port 를 설정할 수 있다.

4. RedisCacheConfig 클래스 생성

캐싱 데이터들을 어떻게 가져올건지 또는 TTL 설정을 어떻게 할 건지 작성하기 위함이다.

@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();
    }
}

5. 캐싱 로직 추가

@Service
public class BoardService {
    private BoardRepository boardRepository;

    public BoardService(BoardRepository boardRepository) {
        this.boardRepository = boardRepository;
    }

    @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();
    }
}
  • 페이지네이션을 위해 page 와 size 값을 키로 설정하였다.

실제 테스트

값을 조회하는 테스트를 진행해 보았다.

아래 사진처럼 처음 조회할 땐 Redis 내에 캐시가 아무것도 없기 때문에 No cache 라는 문구가 뜬다.

이 후 다시 같은 값을 요청한다면,

다음과 같이 캐시에서 키 값을 이용해 밸류를 가져온다.

0개의 댓글