#고민리스트
- 정리한 날짜 : #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이 아닌 모든 타입에 타입 정보 포함