본문 바로가기

개발 지식/SpringBoot

[SpringBoot] Jackson 라이브러리 관련

반응형

Jackson 라이브러리란

JSON, XML, YAML, CSV 등 다양한 확장자를 가지고 있는 데이터의 처리를 지원하는 라이브러리

스트림 방식으로써 속도가 빠르며 유연하고 다양한 third party 데이터 타입을 지원하며 annotation 방식으로 메타 데이터를 기술할 수 있으므로 JSON의 약점중 하나인 문서화와 데이터 validation 문제를 해결할 수 있다.

 

Jackson 동작방식

Spring 3.0 이후로 Controller의 리턴 방식이 @RequestBody 형식이다. 또한, MessageConverter API를 통해, 컨트롤러가 리턴하는 객체를 Hooking 할 수 있다.

Jackson은 JSON 데이터를 출력하기 위한 MappingJacksonHttpMessageConverter를 제공한다. 만약 스프링 MessageConverter를 MappingJacksonHttpMessageConverter로 등록한다면, 컨트롤러가 리턴하는 객체를 다시 뜯어(자바 리플렉션 사용), Jackson의 ObjectMapper API로 JSON 객체를 만들고 난 후, 출력하여 JSON 데이터를 완성한다.

Spring 3.1 이후로는 만약 classpath에 Jackson 라이브러리가 존재한다면, 자동적으로 MessageConverter가 등록된다.

사용예시

1

2

3

4

5

6

@RequestMapping("/json")

@ResponseBody()

public Object printJSON() {

    PersonVO person = new PersonVO("sssukho""developer");

    return person;

}

Colored by Color Scripter

cs

Jackson 사용 전 숙지사항

Jackson은 기본적으로 Property(멤버변수랑 다름)로 동작한다. 그런데 자바에서는 Property를 제공하는 기본 문법이 없다. (lombok 라이브러리는 Annotation으로 이를 편리하게 해주긴 함) 그래서 자바에서 Property는 Getter와 Setter 식의 네이밍으로 정해진다. Jackson 뿐만 아니라 자바에서의 많은 라이브러리가 위와 같은 Property 개념으로 작동한다.

 

Dependency 추가

1

2

3

4

5

6

7

8

9

<!-- Properties -->

<jackson.version>2.9.6</jackson.version>

 

<!-- jackson-->

<dependency>

    <groupId>com.fasterxml.jackson.core</groupId>

    <artifactId>jackson-databind</artifactId>

    <version>2.9.6</version>

</dependency>

Colored by Color Scripter

cs

 

Annotation 정리

  • @JsonIgnoreProperties : json으로 변환(Serialize, Deserialize)시 제외시킬 속성을 지정. VO class 위에서 선언
  • @JsonIgnore : VO의 멤버변수 위에 선언해서 제외처리 (비밀번호 등의 변수들)
  • @JsonProperty : json으로 변환 시에 사용할 이름 (DB 컬럼과 이름이 다르거나 api 응답과 이름이 다르지만 mapping 시켜야 할 때)
  • @JsonInclude : 값 존재 유무에 따라 Serialize 시 동작을 지정 (default는 always)
    • ALWAYS : 속성의 값에 의존하지 말고 항상 포함
    • NOT_EMPTY : null 또는 값이 빈 경우가 아니면 포함
    • NOT_NULL : null이 아니면 포함
    • NOT_DEFAULT : bean의 기본 생성자로 정의된 필드값과 다르게 변경된 필드만 포함
  • @JsonAnyGetter : Map 타입의 멤버변수의 getter 위에 선언한다. json 변환 시 "key" : "value" 형식으로 나온다.
  • @JsonAnySetter : Deserialize 용
  • @JsonGetter : 어떤 필드값을 가져올 때 이 메소드로 접근해서만 가져오라고 jackson에게 명시적으로 알린다.
  • @JsonSetter : JsonGetter와 동일, Deserialize 용
  • @JsonUnwrapped : serialize 혹은 deserialize 때 랩핑 해제/단조롭게 하는(?) 값을 정의한다. 즉, 어떤 필드에 대해 중첩 구조로 넣는다면 그렇게 하지 못하게 명시적으로 알린다.
  • @JsonRootName : VO class 위에 선언해서 wrapping 해서 json 변환
  • @JsonFormat : 날짜, 시간값을 직렬화할 때 형식을 지정 ex) @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-mm-yyyy hh:mm:ss")

 

Serialize? Deserialize?

  • 직렬화(Serialize)
    • 자바 시스템 내부에서 사용되는 Object 또는 Data를 외부의 자바 시스템에서도 사용할 수 있도록 byte 형태로 데이터를 변환하는 기술
    • JVM의 메모리에 상주(힙 또는 스택)되어 있는 객체 데이터를 바이트 형태로 변환하는 기술
  • 역직렬화(Deserialize)
    • byte로 변환된 데이터를 원래대로 Object나 Data로 변환하는 기술을 역직렬화(Deserialize)라고 한다.
    • 직렬화된 바이트 형태의 데이터를 객체로 변환해서 JVM으로 상주시키는 형태

 


Reference1 : https://sjh836.tistory.com/164
Reference2 : https://www.baeldung.com/jackson-annotations
Reference3 : https://mommoo.tistory.com/83
Reference4 : https://nesoy.github.io/articles/2018-04/Java-Serialize

반응형