#고민리스트 - 정리한 날짜 : #2025-05-19 ### 참고자료 - [사내 PR](https://github.com/est-enterprise/est-api-auth/pull/9) ### AI 질문 답변 jackson의 defaultTyping 질문 ``` Jackson의 defaultTyping은 Java 객체를 JSON으로 직렬화(serialization)하고 역직렬화(deserialization)할 때 타입 정보를 처리하는 방법을 설정하는 기능입니다. 기본적으로 Jackson은 JSON에 타입 정보를 포함시키지 않습니다. 하지만 다형성(polymorphic) 타입이나 객체 컬렉션을 다룰 때 이로 인해 문제가 발생할 수 있습니다. defaultTyping을 활성화하면 JSON에 자동으로 타입 정보를 포함시켜 역직렬화 시 올바른 Java 타입으로 복원할 수 있습니다. Jackson의 defaultTyping 설정 옵션: - ObjectMapper.DefaultTyping.NONE: 기본값으로, 타입 정보를 포함하지 않음 - ObjectMapper.DefaultTyping.OBJECT_AND_NON_CONCRETE: Object 값과 추상 클래스, 인터페이스 같은 비구체적 타입에 타입 정보 포함 - ObjectMapper.DefaultTyping.NON_CONCRETE_AND_ARRAYS: 비구체적 타입과 배열에 타입 정보 포함 - ObjectMapper.DefaultTyping.NON_FINAL: final이 아닌 모든 타입에 타입 정보 포함 최근 버전의 Jackson에서는 enableDefaultTyping() 메소드가 deprecated되고 activateDefaultTyping() 메소드가 권장됩니다. ``` 옵션별 예시 정리 ```java abstract class Animal { private String name; // getter/setter 생략 } class Dog extends Animal { private String breed; // getter/setter 생략 } class Cat extends Animal { private boolean indoor; // getter/setter 생략 } ``` `ObjectMapper.DefaultTyping.NONE` (기본값) : 타입 정보가 포함되지 않는다. 역직렬화 시 구체적인 타입 지정이 필요하다. ```json {"name":"Rex","breed":"German Shepherd"} ``` `ObjectMapper.DefaultTyping.OBJECT_AND_NON_CONCRETE` : Object 타입이나 추상 클래스(Animal)처럼 구체적이지 않은 타입에 타입 정보를 포함한다. ```json ["com.example.Dog",{"name":"Rex","breed":"German Shepherd"}] ``` `ObjectMapper.DefaultTyping.NON_CONCRETE_AND_ARRAYS` : 비구체적 타입과 배열/컬렉션에 타입 정보를 포함한다. 배열과 컬렉션의 타입도 명시된다. ```json ["java.util.Arrays$ArrayList",[ ["com.example.Dog",{"name":"Rex","breed":"German Shepherd"}], ["com.example.Cat",{"name":"Whiskers","indoor":true}] ]] ``` `ObjectMapper.DefaultTyping.NON_FINAL` : final이 아닌 모든 클래스에 타입 정보를 포함한다. final 클래스인 Fish에는 타입 정보가 포함되지 않는다. ```java final class Fish extends Animal { private String waterType; // getter/setter 생략 } ``` ```json // Dog (non-final) ["com.example.Dog",{"name":"Rex","breed":"German Shepherd"}] // Fish (final) {"name":"Nemo","waterType":"Salt Water"} ``` ### 정리 이러한 defaultTyping 설정은 **다형성 객체를 올바른 정보로 매핑**하기 위해서 사용된다. `Jackson`의 `defaultTyping` 설정 옵션은 다음과 같다. - `ObjectMapper.DefaultTyping.NONE`: 기본값으로, 타입 정보를 포함하지 않음 - `ObjectMapper.DefaultTyping.OBJECT_AND_NON_CONCRETE`: Object 값과 추상 클래스, 인터페이스 같은 비구체적 타입에 타입 정보 포함 - `ObjectMapper.DefaultTyping.NON_CONCRETE_AND_ARRAYS`: 비구체적 타입과 배열에 타입 정보 포함 - `ObjectMapper.DefaultTyping.NON_FINAL`: final이 아닌 모든 타입에 타입 정보 포함