[Spring Redis] incompatible types for field 해결

작성: 2022.08.17

수정: 2022.08.17

읽는시간: 00 분

Development/Daily Error

반응형

문제

Redis 를 스프링 세션 저장소로 사용하며 사용자의 로그인 정보를 저장 하고 있었습니다.

그런데 저장되는 DTO 객체를 조금 수정했더니 SerializationException: Cannot deserialize 라며 에러가 발생하기 시작했습니다.

1

정확히 방금 변경한 필드가 에러메시지에 정확히 표기되었기 때문에 에러의 원인은 명확 했습니다.

image-20220817110333345

원인

원인은 기존에 Redis에 저장되어 있던 세션 데이터와의 충돌 때문이었습니다.

세션에 이미 저장되어 있는 데이터를 어플리케이션에 불러 오며 다시 역직렬화를 시키는 과정에서, 클래스의 구조가 일치하지 않았기 때문에 에러가 발생 한 것 입니다.

해결

해결 과정이 생각보다 간단하지가 않았는데요. 아래에서 언급될 몇가지 이유가 있었습니다.

차근차근 해결을 해 보겠습니다.

어플리케이션 재시작

일단 변경이 되었으니 어플리케이션을 재 시작 해 주어야 합니다. 다만 같은 객체를 인증담당, 표현 담당, 데이터 담당 등 여러개의 어플리케이션이 공유하고 있는 상황이기 때문에 모두 다 재시작 해 주어야합니다.

하지만 어플리케이션을 모두 재시작 해도 문제는 여전히 해결 되지 않았습니다.

세션정보를 담은 쿠키를 삭제 해서 이미 저장된 세션 정보를 불러오지 않도록 유도 해 보았는데도 마찬가지였습니다.

Redis 재시작

docker-compose restart redis
# or
docker-compose down
docker-compose up -d

Redis는 인메모리 저장소기때문에 재시작을 하면 데이터가 다 날라갈거라고 생각했었는데요.

반은 맞고 반은 틀립니다. 그래서 재시작 만으로 저는 해결이 되지 않았습니다.

volume 데이터 제거

image-20220817111336016

그 이유는 docker 에서 volume 설정을 해두었기 때문이었는데요. 볼륨 설정으로 인해 Redis의 데이터를 디스크에 저장해두기 때문에 재시작이나 심지어는 컨테이너를 삭제해도 계속 남아 있었습니다.

이때는 volume 으로 저장되어 있는 데이터를 삭제하면 해결이 가능 합니다.

rm -rf ./data/session-db

이후 컨테이너를 다시 띄워 Redis를 실행 하니 모든 문제가 해결 되었습니다.


이상입니다.

반응형