문제
아래와 같은 객체를 리스트로 redis에 저장하면서
키를 직렬화할 때는 StringRedisSerializer를 사용하고
값을 직렬화할 때는 GenericJackson2JsonRedisSerializer를 사용했다.
@Getter
@AllArgsConstructor
@NoArgsConstructor
public class GetMemoDto {
private Long id;
private String profileImg;
private String memoItem;
private String memoColor;
private LocalDateTime createdTime;
private Double xPosition;
private Double yPosition;
private Long userId;
}
redis에서 get 명령어를 통해 조회하면 아래와 같다
GenericJackson2JsonRedisSerializer를 사용했기 때문에
class의 패키지명까지 함께 JSON 형태로 직렬화되어 저장된 것을 확인할 수 있다.

하지만 애플리케이션 상에서 역직렬화해서 조회하면 아래와 같은 오류가 발생한다.
오류 메시지를 보면 xposition 필드를 인식할 수 없다고 나와있다.
GetMemoDto 클래스의 필드명은 xPosition인데 redis에 저장되어있는 필드명은 xposition으로 다르다.

원인
디버깅을 통해서 필드명을 어떻게 추출하는지 살펴봤다.
직렬화를 할때 getter 메서드를 사용해서 필드명을 추출하는데
getter 메서드명에서 4번째 문자부터 시작해서 첫 소문자가 나올 때까지 대문자를 소문자를 바꾼다.

lombok의 @Getter를 사용해서 getter 메서드명을 만들면 getXPosition이 되는데
위의 알고리즘을 통해 필드명이 xposition이 된다.
역직렬화를 할 때 setter 메서드가 없으면 native 메서드를 사용해서 필드에 값을 넣어주는데
클래스의 필드명과 redis에 저장된 필드명이 달라서 오류가 발생한다.
해결
Setter 메서드 사용
역직렬화를 할 때 setter 메서드가 있다면 setter 메서드를 사용해서 필드에 값을 넣어준다.
setter 메서드를 사용하면 필드명이 달라도 값을 넣어 줄 수 있다.
다만 클래스의 필드명과 레디스에 저장된 필드명이 다른 건 감수해야 한다.
Getter 메서드명 변경
lombok의 @Getter를 사용하지 않고
getter 메서드명을 getxPosition로 오버라이딩해서 해결할 수도 있다.
이때 클래스의 필드명과 레디스에 저장된 필드명이 같지만
일일이 getter 메서드를 만들어야한다.
'에러 해결' 카테고리의 다른 글
| [문제 해결] spring cloud starter aws 라이브러리 의존할 때 발생하는 에러를 알아보자 (1) | 2024.10.20 |
|---|---|
| [문제 해결] static 메서드를 mocking 해보자 (0) | 2023.12.21 |