1. Jackson 라이브러리란?

Jackson 라이브러리는 json 데이터 구조를 처리해주는 라이브러리입니다. json으로 표현된 데이터 구조를 살펴보겠습니다. 또한 Json 뿐만 아니라 XML/YAML/CSV 등 다양한 형식의 데이터를 지원합니다. 또한 스트림 방식이므로 속도가 빠르며 유연하고, annotation 방식으로 메타 데이터를 기술할 수 있으며 JSON의 약점중 하나인 문서화와 데이터 validation 문제를 해결할 수 있습니다.

{
 "name":"HOON",
 "age": 28,
 "job": "programmer",
}

자바로 JSON 객체를 만들어 보겠습니다. 

JSONObject jsonObj = new JSONObject();
jsonObj.put("name", person.getName());
jsonObj.put("job", person.getJob());
String JSON = jsonObject.toString();

2. Jackson module

○ jackson-core: low-level 스트리밍 API 정의 및 JSON 별 구현 

 jackson-annotations: 표준 Jackson annotation 포함

○ jackson-databind: 스트리밍 패키지에 대한 데이터 바인딩 지원 구현. 스트리밍 및 annotation 패키지에 의존

3. 메이븐 설정

<properties>
    <jackson.version>2.9.2</jackson.version>
</properties>
  
<dependencies>       
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>${jackson.version}</version>
        </dependency>
</dependencies>

4. Jackson 동작 방식

Spring 3.0 이후로 컨트롤러의 리턴 방식이 @RequestBody 형식이라면, Spring은 MessageConverter API를 통해, 컨트롤러가 리턴하는 객체를 후킹 할 수 있습니다. Jackson은 JSON 데이터를 출력하기 위한 MappingJacksonHttpMessageConverter를 제공합니다. 만약 Spring MessageConverter를 위의 MappingJacksonHttpMessageConverter으로 등록한다면, 컨트롤러가 리턴하는 객체를 다시 Jackson의 ObjectMapper API로 JSON 객체를 만들고 난 후, 출력하여 JSON 데이터를 완성합니다. 또한 Spring 3.1 이후로는 만약 클래스 패스에 Jackson 라이브러리가 존재한다면, 자동적으로 MessageConverter가 등록된다는 점입니다. 따라서 다음과같이 편하게 사용할 수 있습니다.

@RequestMapping("/json")
@ResponseBody()
public Object printJSON() {
    Person person = new Person("hoon", "Developer");
    return person;
}

 

File, URL, String 방식으로 데이터를 읽어 올 수 있습니다.

MyValue value = mapper.readValue(new File("data.json"), MyValue.class);
//  URL 에서 읽기
value = mapper.readValue(new URL("http://some.com/api/entry.json"), MyValue.class);
// String 으로 읽기
value = mapper.readValue("{\"name\":\"Bob\", \"age\":13}", MyValue.class);

 

5. Annotation

5.1 @JsonIgnoreProperties

크게 2가지 용도가 있습니다. 하나는 Serializer/Deserialize 시 제외할 property를 지정합니다. 

@JsonIgnoreProperties({ "foo", "bar" })
public class MyBean
{
   //아래 두 개는 제외됨.
   public String foo;
   public String bar;
 
   // will not be written as JSON; nor assigned from JSON:
   @JsonIgnore
   public String internal;
 
   // no annotation, public field is read/written normally
   public String external;
    
   @JsonIgnore
   public void setCode(int c) { _code = c; }
 
   // note: will also be ignored because setter has annotation!
   public int getCode() { return _code; }
}

5.2 @JsonProperty

getter/setter의 이름을 property와 다른 이름을 사용할 수 있도록 설정합니다. Database를 자바 클래스로 매핑하는데 DB의 컬럼명이 알기 어려울 경우등에 유용하게 사용할 수 있습니다. 다음과 같은 테이블이 있습니다.

CREATE TABLE Users (
  u INT NOT NULL,
  a INT NOT NULL,
  e VARCHAR(80) NOT NULL
);

이럴 경우 JsonProperty를 사용하면 DB의 컬럼명을 변경하지 않아도 가독성을 높일 수 있습니다.

public class User
{
    @JsonProperty("userId");
    public Integer u;
  
    @JsonProperty("age");
    public Integer a;
  
    @JsonProperty("email");
    public String e;
}

JSON으로 변환된 결과

{
    "userId": 1,
    "age": 13,
    "email": "user@host.com"
}

5.3 JsonInclude

Serialize 동작을 지정합니다. 기본적으로 잭슨은 값의 유무와 상관없이 무조건 serialize하게 되지만 다음과 같이 설정할 경우 not null이거나 none empty일 경우에만 serialize됩니다.

public class User
{
    public Integer u;
     
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public Integer age;
 
 
    @JsonInclude(JsonInclude.Include.NON_EMPTY
    public String email;
}

 

참고 자료

1. https://www.lesstif.com/pages/viewpage.action?pageId=24445183 

 

Java Json library jackson 사용법

Jackson 은 자바용 json 라이브러리로 잘 알려져 있지만 Json 뿐만 아니라 XML/YAML/CSV 등 다양한 형식의 데이타를 지원하는 data-processing 툴이다.

www.lesstif.com

2. https://mommoo.tistory.com/83

 

[Spring] Jackson 라이브러리 이해하기.

안녕하세요. 오늘은 Spring 프레임워크에 빼놓을 수 없는 라이브러리중 하나인 Jackson 에 대해 간단하게 포스팅 합니다. 주의!! 해당 포스팅은 Jackson 의 라이브러리 2.9.7 버전을 다룹니다. 또한, 프로젝트에..

mommoo.tistory.com

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기