서비스를 테스트를 하다, 바로 직전에 캐시를 적용하였던 사용자 정보를 수정을 테스트하는 과정에서 에러가 발생하였습니다.
사용자 정보는 수정되었지만, 로그인이 되지 않고 서비스가 사용자의 정보를 불러올 수 없는 에러였습니다.
캐시를 하는 메서드의 코드는 key값을 email로 받고 value는 user정보가 됩니다.
@Cacheable(cacheNames="userCacheStore", key="#email")
public User findByEmail(final String email) {
return userRepository.findByKakaoEmail(email);
}
하지만 사용자의 정보가 수정되어 캐시의 내용을 수정해주는 메서드의 경우는 key값은 email로 동일하지만, value의 값이 User가 아닌 UserResponseDto 로 되어있어 오류가 발생했던 것입니다.
@CachePut(value = "userCacheStore", key="#user.kakaoEmail")
public UserResponseDto updateUser(UserSaveRequestDto requestDto, User user){
//...(생략)
return UserResponseDto.of(user,store);
}
@CachePut의 경우는 @Cacheble과 비슷하지만 내부 메서드를 항상 실행하게 된다는 점에서 차이를 보입니다. 그리고 그 과정에서 반환되는 결과를 똑같이 캐싱하게 됩니다. 이때 객체가 User로 저장되었던 정보가 UserResponseDto로 저장이 되었고, @Cacheble이 요구하는 결과와 객체 타입이 달라져서 에러가 발생하였습니다.
기존 코드의 업데이트 된 사용자의 정보를 저장하는 userRepository.save()를 UserCacheRepository에서 호출하는 것으로 변경하였습니다.
@CachePut(value = "userCacheStore", key="#user.kakaoEmail")
public User updateUser(User user){
return userRepository.save(user);
}