프로젝트 개발을 진행하면서 공공데이터 API를 사용하며 API 통신으로 받아온 Json 데이터를 변환하는 방법을 정리한 글입니다.
Java Object를 JSON으로 변환하거나 JSON을 Java Object로 변환하는데 사용할 수 있는 라이브러리인 jackson을 사용했습니다.
Jackson-databind
Jackson 라이브러리는 Java 객체와 JSON 간의 변환 및 직렬화/역직렬화 작업을 수행하는데 사용된다.
Jackson은 Java의 JSON 처리를 단순화하고 유연성을 제공하여 다양한 애플리케이션에서 데이터를 효과적으로 다룰 수 있도록 도와준다.
jackson 라이브러리 dependency추가
implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.11.2'
Jackson 특징
- Stream API : 스트림 형식으로 데이터를 분석하고 생성하기 때문에 성능이 좋다.
- Tree Model : XML의 DOM(Document Object Model) 처럼 Node 형태로 데이터를 다룰 수 있기 때문에 유연성이 좋다.
- Data Binding : POJO(Plain Old Java Object) 기반의 자바 객체들을 JSON으로 변환시킬 수 있다.
스프링과 Jackson
Spring 3.0 이후로 Controller의 리턴 방식이 @RequestBody 형식이라면 Spring은 MessageConverter API를 통해, 컨트롤러가 리턴하는 객체를 Hooking 할 수 있다.
Jackson 라이브러리는 스프링 3.1 이후부터는 class path에 Jackson 라이브러리가 존재한다면 MessageConverter가 자동으로 구성된다.
스프링에서 제공하는 interface인 HttpMessageConverter에서 HTTP request에 대한 응답을 response 할 때 json, xml과 같은 다양한 다양한 타입을 자동으로 변환해준다.
@ResponseBody 어노테이션을 사용할 때 HTTP Body 내 문자 내용을 직접 반환하므로 HttpMessageConverter가 동작한다.
HttpMessageConverter 인터페이스를 사용하여 HTTP 요청 및 응답을 변환하는데 http요청 본문을(request body) 객체로 변환하거나 객체를 http응답 본문(response body)으로 변환한다.
response의 경우 Content-type을 참고해서 json converter나 string converter 등을 자동으로 선택해 사용한다
Jackson 라이브러리의 주요 기능과 구성요소
JsonNode
JsonNode는 Jackson에서 제공하는 트리 모델이다. JSON 데이터를 Java에서 사용하기 편리한 형태로 표현하는 데 사용된다. JsonNode를 사용하여 JSON 데이터를 조작하고 분석할 수 있다.
이 클래스의 서브 클래스들이 있는데 JsonNode의 역할을 세분화한 버전이라고 생각하면 된다. com.fasterxml.jackson.databind.node
패키지에서 확인 할 수 있다.
json 문자열을 jsonNode 객체로 변환하기 위해 objectMapper 클래스의 다음 메서드들을 사용할 수 있다.
- readTree()
public JsonNode readTree(String content)
Json 문자열을 받아서 JsonNode 객체를 리턴한다. - readValue()
public <T> T readValue(String content, Class<T> valueType)
readValue() 메서드는 2번째 파라미터로 Json 문자열을 변환할 클래스 타입을 입력받아 변환 후 입력받은 클래스 타입의 객체로 리턴한다.
이 메서드를 이용하면 Json 문자열을 Json Node 뿐 아니라 다른 객체 타입으로 변환하여 리턴할 수 있다.
Serialize & Deserialize
Jackson은 객체를 JSON으로 직렬화하고 JSON 데이터를 객체로 역직렬화하는 데 사용된다. 이러한 기능은 RESTful 웹 서비스와 같은 다양한 환경에서 데이터 통신을 단순화한다.
직렬화(Serialize)
- 자바 시스템 내부에서 사용되는 Object 또는 Data를 외부의 자바 시스템에서도 사용할 수 있도록 byte 형태로 데이터를 변환하는 기술
- JVM의 메모리에 상주(힙 또는 스택)되어 있는 객체 데이터를 바이트 형태로 변환하는 기술
역직렬화(Deserialize)
- byte로 변환된 데이터를 원래대로 Object나 Data로 변환하는 기술을 역직렬화(Deserialize)라고 한다.
- 직렬화된 바이트 형태의 데이터를 객체로 변환해서 JVM으로 상주시키는 형태
Jackson Annotation
참고 블로그 :
https://sjh836.tistory.com/164
https://ckddn9496.tistory.com/70
jackson을 사용하기 위해 알아야할 지식
- Jackson 은 기본적으로 Property로 동작한다.
java에서 Property는 getter와 setter 식의 네이밍으로 정해진다. java에서는 Property를 제공하는 기본 문법이 없기 때문에 lombok라이브러리의 Annotation으로 간편하게 작성할 수 있다. - Jackson의 데이터 상태에 따른 포함 관계 설정
jackson 데이터 매핑 시 NULL 값과 같은 특정 데이터 상태인 경우를 제외하고 싶다면 @JsonInclude 어노테이션을 사용할 수 있다.
@JsonInclude 어노테이션은 클래스와 프로퍼티 위에 선언할 수 있다.
참고 자료
https://docs.spring.io/spring-boot/docs/2.1.5.RELEASE/reference/htmlsingle/#boot-features-spring-mvc-message-converters
https://steady-hello.tistory.com/51
https://hianna.tistory.com/634
'Backend' 카테고리의 다른 글
Git-Flow 브랜치 전략 (0) | 2023.11.29 |
---|---|
Spring에서 기상청 API 사용하기 (0) | 2023.09.08 |