JSON/Jackson

Jackson > Basic

Krevis 2023. 11. 10. 10:53

준비

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 메서드를 통해 모듈을 등록해도 적용되지 않음
  • Serialization features
  • Deserialization features

 

학습 테스트 코드: https://github.com/venzersiz/learn-jackson/commit/e8071eccf8f05e5651db3b27470f390464f661c7

 

아래는 실무에서 꼭 설정해야 하는 기능이라고 생각한다

  • 비활성
    • DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES
      • 이유: 외부 시스템의 API를 사용할 때 사전에 약속하지 않은 필드를 공지 없이 추가하는 경우는 흔하다.

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

 

학습 테스트 코드

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

읽을거리

참고

'JSON > Jackson' 카테고리의 다른 글

Jackson > Intermediate > TypeIdResolver  (0) 2023.11.13
Jackson > 학습 동기  (0) 2023.11.10