-
JsonTypeInfo, JsonSubTypes 어노테이션Spring Framework 2024. 2. 27. 00:01728x90
개요
이전 글에서 Spring에서 하나의 endpoint에 여러 개의 Request를 받기 위해 @JsonTypeInfo, @JsonSubTypes를 활용해 보았습니다.
@JsonTypeInfo, @JsonSubTypes 어노테이션에 대해 조금 더 자세하게 알아보고자 합니다.
@JsonTypeInfo, @JsonSubTypes 왜 사용해야 할까?
interface SingleEndPointRequest { val type: String } data class DtoA( val col1: String, val col2: String, override val type: String = "DtoA", ): SingleEndPointRequest data class DtoB( val col3: String, val col4: String, val col5: String, override val type: String = "DtoB", ): SingleEndPointRequest
추상클래스 혹은 인터페이스의 경우에는 객체 직렬화 역직렬화를 수행할 때 Spring은 어떻게 직렬화를 수행해야 하는지 알 수 없습니다.
즉, SingleEndPointRequest 인터페이스를 DtoA 또는 DtoB로 직렬화하는 것을 Spring이 선택할 수 없습니다.
이 경우에는 @JsonTypeInfo와 @JsonSubTypes를 활용하여 Spring에게 정보를 제공하여 직렬화를 수행할 수 있습니다.
@JsonTypeInfo, @JsonSubTypes는 무엇인가?
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type") @JsonSubTypes( JsonSubTypes.Type(value = DtoA::class, name = "DtoA"), JsonSubTypes.Type(value = DtoB::class, name = "DtoB") ) interface SingleEndPointRequest { val type: String } data class DtoA( val col1: String, val col2: String, override val type: String = "DtoA", ): SingleEndPointRequest data class DtoB( val col3: String, val col4: String, val col5: String, override val type: String = "DtoB", ): SingleEndPointRequest
@JsonTypeInfo을 활용하여 직접 클래스의 type 프로퍼티를 보고 결정할 수 있도록 정보를 명시합니다.
@JsonSubTypes를 활용하여 어떤 하위 타입들이 존재하고 type의 값이 name과 일치하는 경우에 value의 클래스로 직렬화를 수행할 수 있도록 명시합니다.
SingleEndPointRequest의 type이 DtoA라면 DtoA 클래스로 직렬화가 수행되고, type이 DtoB라면 DtoB 클래스로 직렬화가 수행됩니다.
@JsonTypeInfo 어노테이션은 이름에서 알 수 있듯이 Type Info 객체의 클래스 정보를 선언하여 직렬화 및 역직렬화 방법에 대한 세부 사항을 구성하는 데 사용되는 어노테이션입니다.
use 필드에 하위 타입의 인스턴스에 대한 추가 정보의 종류와 예상되는 내용을 지정할 수 있습니다.
JsonTypeInfo.As.PROPERTY를 사용할 때 객체의 필드 중 속성값과 동일한 필드가 존재하는 경우에 해당 값을 통해 Type을 구분할 수 있습니다.
'Spring Framework' 카테고리의 다른 글
Spring Batch 대신 @Scheduled 활용해보기 (1) 2024.05.08 Adaptor 패턴으로 호출가능한 Local 환경 만들기 (0) 2024.03.08 Spring 단일 Endpoint에 여러 요청 처리하기 (0) 2024.02.13 Spring Boot 2.x 프로젝트 만들기 (0) 2024.02.07 @ConditionalOnMissingBean 알아보기 (0) 2023.12.29