강의에는 없는 내용이지만.. cache 관련해서 질문이 있습니다.
안녕하세요. 저는 기본편을 듣고 이제 스프링 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차 캐시 보다는 스프링이 지원하는 캐시를 적극 사용하는 것을 권장드립니다.
감사합니다^^
existsByUserIdAndProjectId vs existsByUserAndProject 중 어떤 방식이 적절할까요?
0
67
1
existsByUserIdAndProjectId vs existsByUserAndProject 중 어떤 방식이 적절할까요?
0
104
3
MemberRepository 구현체
0
56
1
pdf 표현 질문드립니다.
0
60
1
로그가 남지 않는 문제.
0
79
1
테스트 라이브러리가 강의는 junit4가 맞나요??
0
70
2
pdf 파일과 차이점이 있는 것같은데 문제 없나요?
0
71
2
@PrePersist, @PreUpdate 호출 시점 질문드립니다.
0
91
2
Sort 인터페이스는 잘 사용 안하나요?
0
52
1
스캔대상 질문드립니다.
0
45
1
하이버네이트6에서의 최적화에 이은 질문
0
82
1
save() vs saveAndFlush DB 통신 횟수
0
52
1
순수 JPA 리포지토리 코드 수정부분
0
86
2
bulk연산 후 flush하는 이유를 모르겠어요
0
150
3
bulk insert 질문입니다.
0
175
2
교만했던 것 같아요.
0
145
1
RESTful 강의는 안하시는 건지 궁금합니다.
0
145
2
동적 테이블에 대한 질문
0
85
1
영속성 전이와 연관관계
0
130
2
강의 10:25 질문
0
73
1
단건 update 질문
0
95
2
엔티티 와 도메인의 경계
0
126
1
UsernameOnlyDto 타입 type mismatch 오류
0
119
1
Projection 개념과 데이터 전달과정에 대해 질문 있습니다.
0
135
1





