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

황상익·2024년 10월 15일
0

Redis

목록 보기
9/12

Redis 설정 추가하기

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

RedisCacheConfig

@Configuration
@EnableCaching //스프링 부투 캐싱 활성화
public class RedisCacheConfig {
    @Bean
    public CacheManager cacheManager(
            RedisConnectionFactory redisConnectionFactory
    ) {
        RedisCacheConfiguration redisCacheConfiguration
                = RedisCacheConfiguration

                //Redis에 key를 저장할때 String으로 직렬화(변환) 해서 저장
                .defaultCacheConfig()
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(
                                new StringRedisSerializer()))

                //Redis에 Value를 저장할때 Json으로 직렬화 해서 저장
                //GenericJackson~~ -> class 이름 까지 나온다.
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(
                        new Jackson2JsonRedisSerializer<Object>(Object.class)
                ))

                //데이터 만료기간 (TTL)
                .entryTtl(Duration.ofMinutes(1L));

        return RedisCacheManager
                .RedisCacheManagerBuilder
                .fromConnectionFactory(redisConnectionFactory)
                .cacheDefaults(redisCacheConfiguration)
                .build();
    }
}

BoardService

@Service
public class BoardService {
    private final BoardRepository boardRepository;
    private Pageable pageable;

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

    //Cacheable 에노테이션을 붙이면, CacheAside 전략으로 캐싱이 적용
    //해당 메서드로 요청이 들어오면 레디스 확인 후 db 있다면 redis data 바로 응답. = cacheHit
    //만약 없다면 메서드 내부 로직을 실행 후 return 값으로 응답
    @Cacheable(cacheNames = "getBoards", key = "'boards:page:' + #page + ':size:' + #size", cacheManager = "cacheManager")
    //boards:page:1:size:10 - 게시글들에 1번 page에 size가 10인 data
    public List<Board> getBoardList(int page, int size) {
        Pageable pageable = PageRequest.of(page -1 , size);
        Page<Board> boards = boardRepository.findAllByOrderByCreatedAtDesc(pageable);
        return boards.getContent();
    }

    /*
    성능 개선을 할때는 실제로 얼마나 느린지 빨라졌는지 측정해야 한다.
    Cacheable X -> Waiting (TTFB) 235.27 ms
    Cacheable 0 -> Waiting (TTFB)  8ms

     */
}

성능 차이
Cacheable X -> Waiting (TTFB) 235.27 ms
Cacheable 0 -> Waiting (TTFB) 8ms

처음에 id 값이 안떠서 확인해보니 getId 안해줌..

profile
개발자를 향해 가는 중입니다~! 항상 겸손

0개의 댓글