인프런 커뮤니티 질문&답변

익명님의 프로필 이미지

작성한 질문수

실전! 스프링 데이터 JPA

강의에는 없는 내용이지만.. cache 관련해서 질문이 있습니다.

해결된 질문

작성

·

3.3K

6

안녕하세요. 저는 기본편을 듣고 이제 스프링 data jpa 를 막 완강한 직장인입니다.

저는 사실 현업에서 jpa에서 사용하고 있는데 제대로 이해하지 못한채 사용하고 있다는 생각이 들어서 이번 연휴때 강의 두개를 완독하게 되었습니다. 

궁금한점은.. jpa 의 2차 캐쉬 부분입니다. 아쉽게도 강의에서는 다뤄지지는 않은듯한데 책에 있는 cache 부분을 읽고도 아직 남아있는 의문이 있어서 질문 드립니다.

cache 가 springframework 의 Cacheable 와 javax 의 Cacheable 이 있는데요. 책에서는 javax 것을 사용하면 영속성 컨텍스트 관리 로직들(hit 시에 1차 캐쉬를 복사해서 주는 등..)을 해준다고 하고 그것이 스탠다드 인 것은 이해했는데요.

1. 혹시 springframework 의 Cacheable 을 사용하면 아예 안되는 것인가요? 사실..제가 mybatis 와 redis 캐쉬로 되어있는 레거시 코드를 jpa 로 옮겨서 현업에서 사용하고 있는데요. 캐쉬를 javax 것이 있는지도 모르고 관습적으로 springframework 것을 사용했습니다..ㅠㅠ 현재 동작에는 큰 문제는 없는데 가끔씩 동시성문제가 발생하는데 혹시 그게 이 영향일까 싶기도 하고 그래서요. jpa와 springframework 의 cache와의 조합에 대한 견해가 궁금합니다.

2. 책에도 그렇고 jpa 2차 캐쉬 구현체에는 ehcache 예제만 나와있고 구글링한 다른 자료들에도 주로 ehcache 만 소개되던데요. 저는 서버 인스턴스를 여러대를 띄우는 상황이라 이왕이면 글로벌 캐쉬를 사용하고 싶었는데 redis 캐쉬도 사용이 가능한지요? 혹시 이것도 jpa 에서는 글로벌캐쉬보다는 ehcache 가 스탠다드한 방식인건지..그렇다면 그 이유가 무엇인지 궁금합니다.

강의 내용과 상관 없는 질문이라 죄송합니다.

답변 3

14

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요 익명님^^ 좋은 질문입니다.

먼저 1번은 어떤 것을 사용해도 동일합니다. (스프링에서 javax의 캐시이든 스프링의 캐시이든 동일하게 지원합니다.) 다만 여기서 동시성 문제도 말씀을 하셨는데, 주의해야할 점은 엔티티를 스프링이나 외부 캐시에 저장하면 절대! 안됩니다. 엔티티는 영속성 컨텍스트에서 상태를 관리하기 때문에, 항상 DTO로 변환해서 변환한 DTO를 캐시에 저장해서 관리해야 합니다! (물론 하이버네이트가 지원하는 2차 캐시는 예외입니다)

2번은 ehcache, Infinispan 등이 공식 지원됩니다. redis 등은 공식 지원되지 않습니다. 앞서 두 가지도 글로벌 캐시로 사용이 가능합니다. (자세한 내용은 각 캐시 메뉴얼을 보셔야 합니다.)

캐시와 관련해서 제가 실무 조언을 드리고 싶은 부분은 하이버네이트 2차 캐시보다는 스프링이 지원하는 캐시를 서비스 계층에서 사용하는게 더 효과적이라는 점 입니다. 2차 캐시는 설정도 복잡하고, 지원하는 캐시 라이브러리도 작습니다. 무엇보다 실무에서는 서비스 계층에서 복잡하게 외부 API도 호출하고, 여러 엔티티도 조회해서 그 결과로 DTO를 생성합니다. 스프링을 사용하면 이 DTO를 효과적으로 캐시할 수 있고, 지원하는 캐시 라이브러리도 풍부합니다. 그런데 2차 캐시는 단순히 엔티티 조회(쿼리포함)와 관련된 부분만 캐시가 지원됩니다.

이런 점 때문에 하이버네이트 2차 캐시 보다는 스프링이 지원하는 캐시를 적극 사용하는 것을 권장드립니다.

감사합니다^^

증말 감사합니다!

6

궁금했던내용 구글링하니 나오는 갓영한님... 좋은 답변 감사합니다 배워갑니다 

2

질문한 사람은 아니지만 항상 궁금했었는데 답변 감사합니다.

익명님의 프로필 이미지

작성한 질문수

질문하기