본문 바로가기

에러 해결

[문제 해결] 역직렬화 과정에서 발생하는 문제를 해결해보자

문제

아래와 같은 객체를 리스트로 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번째 문자부터 시작해서 첫 소문자가 나올 때까지 대문자를 소문자를 바꾼다.  

BeanUtil.java

 

lombok의 @Getter를 사용해서 getter 메서드명을 만들면 getXPosition이 되는데

위의 알고리즘을 통해 필드명이 xposition이 된다.

 

역직렬화를 할 때 setter 메서드가 없으면 native 메서드를 사용해서 필드에 값을 넣어주는데

클래스의 필드명과 redis에 저장된 필드명이 달라서 오류가 발생한다.

 

해결

Setter 메서드 사용

역직렬화를 할 때 setter 메서드가 있다면 setter 메서드를 사용해서 필드에 값을 넣어준다.

setter 메서드를 사용하면 필드명이 달라도 값을 넣어 줄 수 있다.

다만 클래스의 필드명과 레디스에 저장된 필드명이 다른 건 감수해야 한다.

Getter 메서드명 변경

lombok의 @Getter를 사용하지 않고

getter 메서드명을 getxPosition로 오버라이딩해서 해결할 수도 있다.

이때 클래스의 필드명과 레디스에 저장된 필드명이 같지만

일일이 getter 메서드를 만들어야한다.