Redis와 Spring의 @Cacheable 활용 (실습)

KUN·2025년 7월 9일

Redis

목록 보기
5/6

계기

이전 AOF 에 대해서 배울 떄 Redis를 하나의 저장소 개념으로 접했었다.
하지만 실제로는 Redis를 캐시 개념으로 활용하는 경우가 훨씬 많다.

그리고 프로젝트에서 Redis를 직접 명령어로 일일이 다루는 코드를 작성하지는 않을 것이다.
예를 들어 이렇게 하나하나 직접 조작하는 방식은 번거롭고 비효율적이다.

그러던 중에 Spring에서 제공하는 @Cacheable이라는 어노테이션을 알게 되었고,
이걸 Redis와 함께 사용하면 손쉽게 캐시를 적용할 수 있다는 사실을 발견했다.

목표

  • Spring의 @Cacheable 어노테이션이 무엇인지 이해하기

  • @Cacheable을 Redis 캐시와 함께 효과적으로 사용하는 방법


@Cacheable 어노테이션

캐시 간단 요약

자주 사용하는 데이터를 임시 저장해 빠르게 불러올 수 있게 하는 메모리 저장소이다.

사람으로 치면 DB는 장기기억
캐시는 단기기억이다.

만약, 너 일주일전에 뭐 먹었어? - "음... 아! 스파게티 먹었어!" 를 답변하고 단기기억에 저장한다. 
( 30분 동안 기억한다고 가정 )

15분 뒤 "야 너 일주일 전에 뭐 먹었다고 했더라?" - "아니 아까 스파게티라고 했잖아." 
일말의 고민없이 대답이 가능해진다.

무엇인가

Spring @Cacheable 공식문서

요약 : 메서드 실행 결과를 자동으로 저장해 다음 호출 시 캐시된 값을 반환하는 스프링 어노테이션이다.

@Cacheable은 왜 쓰는가

요약 : 코드에 캐싱 로직을 직접 구현하지 않고, 선언적으로 캐싱 기능을 적용할 수 있다.

( 위에 나처럼 미련하게 직접 작성하지 않도록 하기 위해서 )

작동원리

( 출처 : https://oliviarla.tistory.com/148 )

자세한 설명은 위 블로그에 적혀있으니, 우린 큰 틀로 보겠다.

1. 메서드 호출 감지
2. 캐시 키 생성
3. 캐시 조회
4-1. 적중 Hit ( 실제 메서드 실행하지 않고 캐시된 값을 반환 )
4-2. 미스 Miss ( 원래 메서드를 실행하여 결과 가져오기 )
5. 캐시 저장 ( Miss 가 될 경우 캐시에 저장 )

@Cacheable을 Redis 캐시로 사용하기 (실습)

사전 설정 방법

준비 끝

실제 실행


오류 발생

InvalidDefinitionException

Jackson이 LocalDate를 JSON으로 직렬화하려면 
JavaTimeModule을 등록해야 하는데, 안 해서 에러가 났다는 소리이다.

해결 과정은 여기서 다루지 않고 다음 글에서 트러블 슈팅으로 자세하게 다뤄보도록 하겠다.
이 글은 Cacheable 사용하는 글이기 때문에....


현재 데이터에는 아무것도 없다. ( 이제 호출해보면? )

레디스가 비어있을 경우 Repository 에서 가져온다.

실제 Redis 에 캐시로 등록 되었다.

결과 까지 잘 나왔다.


속도 측정

첫 호출은 707 ms
두번째 같은 메서드로 호출한다면 1.6 ms

매우 효율적이다.


개인기록

  • Concert 공연 정보를 계속해서 조회하는 경우가 많다.
  • 그렇다면 그럴 때 마다 공연의 정보를 repository 에 가져온다면 속도와 부담이 클 것 이다.
  • 자주 조회되는 정보는 이전에 배웟던 Redis(Cache) 를 사용하면 속도가 매우 향상될 것 이다.
profile
배우노라, 실험하노라, 기록하노라

0개의 댓글