😭redis에 값을 저장할 때에는 어떤 직렬화 방식을 선택하냐에 따라 구현 방법이 달라집니다.
지난 시간에 보았던 것처럼 redis에 직접 객체를 저장을 할 수 있는데 이 경우 문제가 될 수 있는 부분이 있습니다.
@PostMapping("/company")
public void save(@RequestBody Company company) {
redisTemplate.opsForValue().set("company",company);
}
먼저 company 객체를 redis에 저장을 합니다.
🤔그런데 만약 company의 컬럼이 변경이 된다면 어떻게 될 까요?
아래와 같은 오류가 납니다.
at [Source: (byte[])"{"@class":"com.example.redistest.entity.Company","name":"company company","age":60}"; line: 1, column: 58] (through reference chain: com.example.redistest.entity.Company["name"])] with root cause
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "name" (class com.example.redistest.entity.Company), not marked as ignorable (2 known properties: "username", "age"])
at [Source: (byte[])"{"@class":"com.example.redistest.entity.Company","name":"yohan company","age":60}"; line: 1, column: 58] (through reference chain: com.example.redistest.entity.Company["name"])
at
🧐그래서 위와 같은 상황을 방지하기 위한 방법으로 map을 저장하는 방법이 있습니다.
@PostMapping("/company")
public void save(@RequestBody Company company) {
ObjectMapper objectMapper = new ObjectMapper();
redisTemplate.opsForValue().set("company",objectMapper.convertValue(company,Map.class));
}
🫡위의 경우 map으로 변경 후 저장을 한 후에 다시 class를 변경하여 값을 가져와 보면 위와는 다르게 에러가 나지 않습니다.
🫠Redis에 직접 객체를 저장하는 경우, 해당 객체의 클래스 정보를 함께 저장합니다. 클래스의 구조(필드 이름, 타입 등)가 변경되면, 저장된 객체를 역직렬화하는 과정에서 해당 클래스 정보와 불일치하여 에러가 발생하는데 Map을 사용하여 저장하는 경우, 각 필드는 Key-Value 형태로 저장됩니다. 객체를 Map으로 변환하여 저장하면, 이후 필드가 추가되거나 삭제되어도 각 필드는 독립적으로 취급되어 역직렬화 과정에서 에러가 발생하지 않습니다.
2가지 방법중 편의성과 안전성을 고려해서 저장을 하시면 될 것 같습니다.