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
'Spring Framework' 카테고리의 다른 글
[Spring Framework] web.xml 기초 (0) | 2019.10.12 |
---|---|
[Spring Framework] 이클립스 commit 후 한글 깨짐 현상 해결 (1) | 2019.09.03 |
[Spring Framework] JSON 데이터 깨짐 현상 (0) | 2019.08.31 |
[SpringFramework] 이클립스 스프링 Hello World (0) | 2019.06.30 |
[Spring Framework] 스프링 시작하기 (0) | 2019.05.12 |