[DND] 캐시를 적용하며했던 실수!

원지윤·2023년 6월 5일
0

DND 활동

목록 보기
6/6

문제상황

서비스를 테스트를 하다, 바로 직전에 캐시를 적용하였던 사용자 정보를 수정을 테스트하는 과정에서 에러가 발생하였습니다.
사용자 정보는 수정되었지만, 로그인이 되지 않고 서비스가 사용자의 정보를 불러올 수 없는 에러였습니다.

문제가 발생한 이유

캐시를 하는 메서드의 코드는 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);
    }

0개의 댓글