코드 내부에서 java의 다형성 특징을 이용해서 abstract, interface를 이용해 기능을 작성하는 경우가 있다.
이러한 경우에 하나의 application 내에서만 호출되는 관계가 아니고, 다른 application에 메시지로 전달되거나 redis와 같은 storage에 저장되는 경우 object를 string이나 byte로 변환하는 과정이 필요하게 된다.
해당 과정에서 abstract, interface를 사용하게 되면 실제로 deserialize 되는 시점에 해당 정보가 어떠한 concrete class에 매핑되는지에 대한 정보가 필요하게 된다.
이러한 구체적인 정보가 없이는 serialize 된 정보가 다시 객체로 변환되기는 불가능하다.
@JsonTypeInfo를 사용하면 이러한 문제를 해결할 수 있다.
@JsonTypeInfo
해당 애너테이션의 어떠한 정보를 사용해서 serialize, deserialize 할 것인지 다양한 옵션을 제공한다.
이번에 알아볼 옵션은 아래의 3가지이다.
use
Id.CLASS
Id.NAME
Id.DEDUCTION
각각의 옵션을 알아보기 전에 테스트를 위한 다형성 코드
class Test {
static abstract class Shape {
public String type;
}
@Data
@NoArgsConstructor
static class Circle extends Shape {
String a;
public Circle(String type) {
this.type = type;
this.a = "aa";
}
}
}
@JsonTypeInfo(use = Id.CLASS)
가장 간단하다.
class명으로 구체 클래스를 구분하겠다고 명시해 주면 된다.
class Test {
@JsonTypeInfo(use = Id.CLASS)
static abstract class Shape {
public String type;
}
// ...
}