inflearn logo
강의

講義

知識共有

非専門家でも理解できるRedis入門・実践(照会性能最適化編)

redis 적용을 위한 service 반환값

63

brian1103269537

投稿した質問数 11

0

안녕하세요. redis 강의를 통해 간단한 프로젝트로 적용을 하려고 합니다.

@Cacheable(
    value = "reviewList",
    key = "'review:store:' + #storeId + ':page:' + #pageable.pageNumber",
    cacheManager = "reviewCacheManager",
    condition = "#pageable.pageNumber == 0")
@Transactional(readOnly = true)
public Page<ResViewReviewDto> getReviews(UUID storeId, ReviewRepositorySearchConditionDto condition,
    Pageable pageable) {
    Page<ResViewReviewDto> reviews = reviewRepository.findReviews(storeId, condition, pageable);

    return new PageImpl<>(reviews.getContent(), pageable, reviews.getTotalElements());
}


원래는 return reviews를 했더니 계속 조회를 누르면 ClassCastException: LinkedHashMap cannot be cast to Page 이 오류가 나오게 됩니다. 강의에서는 그냥 getContent를 List로 반환값을 보냈는데 혹시 위 코드처럼 new PageImpl 형식으로 return 해도 괜찮을까요?

 

redis nosql query-tuning performance-tuning

回答 2

0

jscode

안녕하세요 수현님 ! 질문 잘해주셨어요 ~

질문해 주신 내용에 대해 답변드려볼게요 !

우선 'ClassCastException: LinkedHashMap cannot be cast to Page' 에러가 발생하는 이유는

Redis가 Page 객체를 직렬화/역직렬화하는 과정에서 문제가 생기기 때문이에요 !

Redis에 저장될 때 Page 객체가 JSON으로 변환되면서 LinkedHashMap 형태로 저장되는데,

이걸 다시 꺼낼 때 Page 객체로 변환하지 못해서 발생하는 에러죠 :)

 

"강의에서는 그냥 getContent를 List로 반환값을 보냈는데 혹시 위 코드처럼 new PageImpl 형식으로 return 해도 괜찮을까요?"

-> 우선 결론적으로 'new PageImpl 형식으로 return '보다 List로 반환하는걸 권장드려요 !

new PageImpl<>() 방식도 동작할 수는 있지만, 권장하지 않아요 !

PageImpl도 결국 Page 인터페이스를 구현한 객체라서 직렬화 문제가 발생할 수 있어요 !

그래서 실제로 동작하더라도 불안정할 수 있고,

Spring이나 Redis 버전이 바뀌면 또 다른 문제가 생길 수 있어요 !

 

혹시나 페이지네이션의 메타 데이터를 포함해서 응답하는 방법에 대해

궁금하신 거라면 댓글 한 번만 남겨주세요~!!

추가로 더 궁금하신 점 있으시면 언제든 추가 질문 남겨주시구요!

늘 파이팅입니다 😋

 

0

communityai8509

안녕하세요, 인프런 AI 인턴입니다. 이수현님,

Redis 캐싱 구현 도중 발생한 ClassCastException 에 대해 질문 주셨습니다. LinkedHashMap cannot be cast to Page 오류는 객체의 직렬화/역직렬화 문제에서 발생할 수 있습니다. 특히, 캐시된 객체를 다시 가져올 때 일치하지 않는 타입이 원인이 됩니다.

문제 요약

@Cacheable 어노테이션을 사용할 때, 캐시된 데이터가 Page 객체로 바로 직렬화되지 않은 경우 발생할 수 있으며, 캐시에서 복원할 때 타입이 일치하지 않아 예외가 발생합니다.

해결 방법

  1. DTO로 변환해 이용:
    강의처럼 getContent()를 통한 List 형태로 사용하면, 복잡한 객체 직렬화 문제를 피할 수 있습니다.

  2. Page 대신 List로 캐싱:
    new PageImpl<>(...)을 통해 생성된 객체가 Page로 인식되기 위해서는 프레임워크가 이를 직렬화할 수 있어야 합니다. 그러나 복잡한 구조의 Page 객체는 직렬화 과정에서 문제가 생길 수 있습니다. 따라서, 복잡성을 줄이기 위해 Page 객체 대신 List 객체를 캐싱하는 것이 좋습니다.

  3. Page 캐싱 시 직렬화 방식 설정:
    Page 객체를 캐싱해야 한다면, 직렬화 시 GenericJackson2JsonRedisSerializer 같은 JSON 변환기를 통해 해결할 수 있습니다. 하지만 이는 JSON 설정의 세부 조율이 필요하며 여전히 문제를 완전히 해결하지 못할 수 있습니다.

추가 참고 자료

아래 링크들은 유사한 문제를 겪은 질문과 그에 대한 답변이며 도움이 되실 겁니다:

이해에 도움이 되었길 바랍니다. 질문자님의 이해를 돕고자 기존 답변을 참고하여 유사한 답변 링크를 추천해드렸습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

redis VS valkey

0

200

2

스프링 부트에 Redis 적용하기 질문

0

97

2

redis 사용으로 인한 비용

0

241

2

Redis를 적용했음에도 불구하고 조회 성능의 큰 차이가 없고 오히려 더 안좋은 조회속도를 보이는 것 같습니다.

0

144

3

Elastic Cache 에러

0

85

2

Elastic

0

74

2

AWS 리소스 삭제에 관하여

0

74

2

ec2안에서 pull 받는 이유가 뭔가요 ?

0

83

2

Nest.js + Redis 구현 문제

0

677

3

데이터를 안가져와요

0

72

2

Spring Boot 프로젝트에 Redis 셋팅 추가하기에서 13분 질문있습니다.

0

188

2

레디스 환경 셋팅 질문있습니다.

0

99

2

엘라스틱 서치와 레디스의 차이점을 알고 싶습니다.

0

262

2

-parameters

0

128

2

Redis vs Memcached

0

230

2

redis 를 compose 로 묶어준 이유가 궁금합니다.

0

155

2

k6의 결과 해석

0

257

2

Jackson2JsonRedisSerializer에 대한 궁금증

0

233

1

사용된 어노테이션에 관한 질문

0

147

1

Redis 사용 방식에 대해서 질문 있습니다

0

154

1

aws elasticcache redis 툴 접속.

0

220

1

Redis를 사용하는 이유

0

709

2

로컬에서 docker compose 명령어 실행 시

0

275

2

EC2 서버 실행시키기 관련하여

0

428

2