

문제
팀장님의 이야기
나
"그 아침에 캐시문제로 수정이 잘 반영이 안 됬을 때, a상품봤다가 b상품봤을 때 a상품 정보가 나왔었나요?"
// 엄성훈 - 거래완료취소 유저의 isTrade를 true -> false 업데이트
@Transactional
@Caching(evict = {
@CacheEvict(cacheNames = "barterMyInfo", key = "#userDetails.userId", allEntries = true),
@CacheEvict(cacheNames = "itemInfo", allEntries = true),
// @CacheEvict(cacheNames = "itemTradeCheckInfo", key = "#userDetails.userId+ '::' + #itemId", allEntries = true)})
@CacheEvict(cacheNames = "itemTradeCheckInfo", allEntries = true)})
public BarterTradeCheckDto cancelBarter(Long barterId, UserDetailsImpl userDetails) {
코드
거래내역 보기 ( Get요청 )
주어지는 파라미터는 userDtails이고, 안에있는 userId를 key값으로 정했습니다.
// 성훈 - 거래내역서 보기
@Cacheable(cacheNames = "barterMyInfo", key = "#userDetails.userId")
public List<BarterDto> showMyBarter(UserDetailsImpl userDetails) {
User user = userRepository.findById(userDetails.getUserId()).orElseThrow(
() -> new CustomException(NOT_FOUND_USER)
);
Long userId = userDetails.getUserId();
// 유저의 거래내역 리스트를 전부 조회한다
List<Barter> mybarterList = barterRepository.findAllByBuyerIdOrSellerId(userId, userId);
// 거래내역 리스트를 담기
return addTotalList(userId, mybarterList);
}
거래 완료취소 거래내역에 대해서 (Put)
캐시로 존재하는 거래내역에 변화가 발생하였기 때문에, 업데이트를 위해서 해당key값을 지워준다.
// 엄성훈 - 거래완료취소 유저의 isTrade를 true -> false 업데이트
@Transactional
@Caching(evict = {
@CacheEvict(cacheNames = "barterMyInfo", key = "#userDetails.userId", allEntries = true),
@CacheEvict(cacheNames = "itemInfo", allEntries = true),
// @CacheEvict(cacheNames = "itemTradeCheckInfo", key = "#userDetails.userId+ '::' + #itemId", allEntries = true)})
@CacheEvict(cacheNames = "itemTradeCheckInfo", allEntries = true)})
public BarterTradeCheckDto cancelBarter(Long barterId, UserDetailsImpl userDetails) {
User user = userRepository.findById(userDetails.getUserId()).orElseThrow(() -> new CustomException(NOT_FOUND_USER));
Barter mybarter = barterRepository.findById(barterId).orElseThrow(() -> new CustomException(NOT_FOUND_BARTER));
BarterTradeCheckDto oppononetTreadeCheck;
Long userId = user.getId();
// 거래완료 취소 업데이트
if (mybarter.getStatus() == 2) {
oppononetTreadeCheck = getBarterTradeCheckDto(userId, mybarter);
} else {
// 거래중인 상태가 아니면 예외처리
throw new CustomException(NOT_TRADE_BARTER);
}
return oppononetTreadeCheck;
}
새로운 문제
-> 파라미터의 불규칙으로인한 key값 설정이 어려움
예시 1)
거래내역보기
@Cacheable(cacheNames = "barterMyInfo", key = "#userDetails.userId")
public List<BarterDto> showMyBarter(UserDetailsImpl userDetails) {
위에서 userId를 key값으로 설정하였는데,
// 교환신청 확인 페이지 수락 버튼
@Transactional
@Caching(evict = {
@CacheEvict(cacheNames = "barterMyInfo", allEntries = true),
@CacheEvict(cacheNames = "userProfile", allEntries = true),
@CacheEvict(cacheNames = "itemInfo", allEntries = true),
@CacheEvict(cacheNames = "itemDetailInfo", allEntries = true),
@CacheEvict(cacheNames = "itemTradeCheckInfo", allEntries = true)})
public BarterStatusDto acceptTrade(Long barterId) {
다음과 같이 파라미터가 barterId 하나 뿐이라서,
위에서 설정한 키값 userId를 대입할 수 없게 되었습니다.
현재는 간단히 캐시의 정보 동시성을 구현하기 위하여 다음과 같이 교환수락, 교환 신청등
각 캐시에 업데이트가 발상하게 되는 경우
userId별로, 즉 유저별 개별로 캐시가 업데이트가 되지않고,
1. A, B, C, D 유저에 대한 캐시를 가지고 있으면
2. B가 교환수락, 교환 신청 등을 요청할 경우
3. A, B, C, D 유저 전체에 대한 캐시를 일괄 삭제
하는 방법으로 작동 되도록 구현하였습니다.
현재 사용자가 적기 때문에 사용에는 큰 문제가 없을 수 있지만,
실제 비즈니스 서비스를 운영할 경우
다수의 유저의 캐시를 계속 일괄 삭제하기 때문에 불필요한 삭제요청이 발생하게됩니다.
적용한 내역
마이페이지 : userProfile
전체아이템목록(카테고리) : itemInfo
아이템상세정보 : itemDetailInfo
아이템 거래전 정보 : itemTradeCheckInfo
거래내역 목록 : barterMyInfo
itemDetailInfo
itemTradeCheckInfo
itemDetailInfo
barterMyInfo / userProfile / itemInfo / itemDetailInfo / itemTradeCheckInfo
barterMyInfo / itemInfo / itemDetailInfo / itemTradeCheckInfo
정말로 참고 많이한 링크
https://livenow14.tistory.com/56
[SpringBoot] Local-Memory 캐시를 사용해보자
@Service public class PathService { private static final Logger logger = LoggerFactory.getLogger(PathService.class); private final LineService lineService; private final StationService stationServic..
livenow14.tistory.com
각 어노테이션에 대해서 친절하게 설명되어 있습니다.
'공부 > Cache' 카테고리의 다른 글
카페인 캐시를 적용해보자. (0) | 2022.05.28 |
---|---|
캐시를 알아보자 - 2 (0) | 2022.05.27 |
카페인 로컬 캐쉬를 알아보자 -1 (0) | 2022.05.27 |