질문
Spring Boot LocalCache는 in-memory를 사용하는데, 누군가 get한 후에 데이터를 변경한다면?!
기존 개발
- 조회만 할 데이터를 cache적용. 따라서, 위 질문에 대해 고려해본적이 없었음…….
- Caffeine Cache를 사용중이었고, 내부적으로 ConcurrentHashMap을 사용. 따라서, Heap에 저장될 것으로 판단
- get한 후에 application에서 데이터를 변경하면 LocalCache 값이 변경됨(Reference Type의 경우)
Java의 경우, 항상 call by value. Reference Type은 주소값을 call by value처리
위의 질문은 어떻게 처리?
- 정확한 처리 방법인지 모르겠지만, 생각난 2가지 방법
String 사용
- cache의 value type을 String으로 사용(call by value)
- get한 후에 원하는 class로 convert and return
깊은 복사
- 원하는 데이터 타입으로 cache 사용
- get한 후에 깊은 복사 with final
- 그럼, 새로운 객체로 기존의 캐시와는 무방 & 불변객체로 값 변경 불가
Reference