준비
https://github.com/FasterXML/jackson
다양한 기능을 제공하지만 핵심은 JSON을 위한 Data binding이다. Gradle 기준으로 아래 Dependency를 추가하면 핵심 객체인 ObjectMapper를 사용할 수 있다.
implementation platform("com.fasterxml.jackson:jackson-bom:2.15.3")
implementation "com.fasterxml.jackson.core:jackson-databind"
공식 문서 중 가장 쉬운 튜토리얼은 아래에 있다.
https://github.com/FasterXML/jackson-databind#use-it
잭슨은 별도의 공식 레퍼런스 웹사이트가 존재하지 않는 것 같고 깃헙 위키에 설명이 되어 있는데, 내 기준으로는 문서화가 잘 되어 있어 보이지는 않는다. 최신화 안 된 것들도 있고. 외부 블로그 링크를 걸어두는 경우도 많다. 이게 내가 글을 작성하게 되는 계기가 되었다. (내가 욕심이 너무 과한가?)
Serialization, Deserialzation
학습 테스트 코드: https://github.com/venzersiz/learn-jackson/commit/ef24382d8351e52d9a492247726c2d754a9f4144
Generic collections
학습 테스트 코드: https://github.com/venzersiz/learn-jackson/commit/adf889ef3702594177054301681ef2274bf4509d
TreeModel
JSON 역직렬화 시 바인딩할 클래스 정의가 필요 없다는 장점이 있다. 그런데 나는 데이터를 Map에다 담아 쓰는 것보다 별도 클래스를 만들어 담아 쓰는 게 좋다고 생각하기에, 이 모델은 어마도 잘 안 쓸 것 같다.
학습 테스트 코드: https://github.com/venzersiz/learn-jackson/commit/8abc8b45e85f7f693bf73e03de62288c06a06c98
Features
활/비활성화할 수 있는 다양한 기능을 제공하고 있다.
https://github.com/FasterXML/jackson-databind/wiki/JacksonFeatures
Databind features
- Mapper featrues
- ObjectMapper를 사용하기 전에만 수정할 수 있다.
- objectMapper를 사용한 후 registerModule 메서드를 통해 모듈을 등록해도 적용되지 않음
- ObjectMapper를 사용하기 전에만 수정할 수 있다.
- Serialization features
- Deserialization features
학습 테스트 코드: https://github.com/venzersiz/learn-jackson/commit/e8071eccf8f05e5651db3b27470f390464f661c7
아래는 실무에서 꼭 설정해야 하는 기능이라고 생각한다
- 비활성
- DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES
- 이유: 외부 시스템의 API를 사용할 때 사전에 약속하지 않은 필드를 공지 없이 추가하는 경우는 흔하다.
- DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES
Datatype modules
https://github.com/FasterXML/jackson#third-party-datatype-modules
JavaTimeModule
학습 테스트 코드: https://github.com/venzersiz/learn-jackson/commit/5ab363ad052eecc63efe98ce766f15ffab9ed3d2
Annotations
학습 테스트 코드: https://github.com/venzersiz/learn-jackson/commit/877eaf1b3368e082b64caeab8293b623bfaa9364
Mix-in
https://github.com/FasterXML/jackson-docs/wiki/JacksonMixInAnnotations
학습 테스트 코드
- https://github.com/venzersiz/learn-jackson/commit/56a106953c4c07960a891155fec7604fd403808a
- List: https://github.com/venzersiz/learn-jackson/commit/4ebf81f5475b123dfe5457597a034fe0a137c0c2
Polymorphism
https://github.com/FasterXML/jackson-annotations#handling-polymorphic-types
https://www.baeldung.com/jackson-inheritance
다형성을 이야기해 보자. 상위 타입을 구체화한 두 가지 하위 타입이 있다고 하자. 하위 타입의 객체를 직렬화 후, 역직렬화할 때 해당 데이터가 어떤 하위 타입인지 어떻게 알 수 있을까?
잭슨은 직렬화 시 타입 정보를 포함할 수 있게 한다. 역직렬화 시 해당 타입 정보를 기반으로 인스턴스를 생성할 수 있다. 이를 Default typing이라 하며 2가지 방법으로 적용 가능하다.
애너테이션 방식: @JsonTypeInfo
학습 테스트 코드: https://github.com/venzersiz/learn-jackson/commit/5db924c96a1d2d432ee7748402edf208d20995ed
자바코드 방식
학습 테스트 코드: https://github.com/venzersiz/learn-jackson/commit/3ac2217c5fe1cdeb51b198181f337ab1f2dbe4a0
@JsonTypeId, @JsonTypeIdResolver
학습 테스트 코드: https://github.com/venzersiz/learn-jackson/commit/dd052c47196159243991424cce719b0a53aaa75b
읽을거리
- 자바 역직렬화 취약점의 이해와 방어 방법 (https://www.itworld.co.kr/news/206354)
참고
- https://github.com/FasterXML/jackson
- https://github.com/FasterXML/jackson-databind
- https://github.com/FasterXML/jackson-annotations
- https://github.com/FasterXML/jackson-docs
- https://github.com/FasterXML/jackson-annotations/wiki/Jackson-Annotations
- https://github.com/FasterXML/jackson-docs/wiki/JacksonMixInAnnotations
'JSON > Jackson' 카테고리의 다른 글
| Jackson > Intermediate > TypeIdResolver (0) | 2023.11.13 |
|---|---|
| Jackson > 학습 동기 (0) | 2023.11.10 |