[Spring] Jackson 라이브러리, ObjectMapper

White 와잇·2024년 6월 21일

Spring

목록 보기
8/9
post-thumbnail

Jackson

개요

Spring 프레임워크를 사용하면서 항상 사용하게 되는 라이브러리다.
웹 개발이 거의 비슷한 형태로 진행되어서 자세한 것은 모르는 채로 한정된 애너테이션만 사용했었는데, 다양한 설정 애너테이션이 있는 것 같아 좀 더 알아보았다.

Java의 객체가 담는 데이터를 외부에서 표현해야 할 때 JSON 형태로 저장하는 경우가 많다.
Spring에서는 이 형태를 전환하는 것을 직렬화(serialization), 역직렬화(deserialization)라고 표현하더라.

Jackson 라이브러리가 위 방법을 편리하게 제공해준다.

직렬화

  • Java 클래스 표현
public class person() {
	private int id;
    private String name;
}
  • JSON 형식
    json { "id" : 1, "name" : "yang" }

이와 같이 객체로 표현되던 멤버 변수를 Json 포맷에서는 연속적인 데이터로 표현해서 Stream을 통해 데이터를 읽을 수 있다. Java 8의 추가된 기술 스트림이 아니다. I/O 시에 발생하는 Stream of Bytes 이다.

정확히는 멤버 변수를 직렬화하는 것이 아니라 프로퍼티를 직렬화한다고 한다!
무슨 말이냐면, person() 클래스의 Getter 로 접근할 수 있는 멤버 변수에 한해서만 직렬화 된다.
잘 생각해보면, 당연하다. private으로 선언된 멤버 변수를 서드파티 라이브러리 클래스가 접근할 권한은 없긴 하다.

역직렬화

그렇다면 역직렬화는 JSON -> Java 객체를 표현하는 방식이 되겠다.

역직렬화는 반대로 Setter 가 필요한데 주의점이 있다.
객체 생성을 위한 기본생성자가 필요하고 (설정으로 생성자 형태를 변경할 수도 있다고 한다.)
직렬화와 다르게 Getter도 필요하다고 한다.

사용법

ObjectMapper 객체 사용 (애너테이션 x)

Controller로 들어가기 전에는 @RequestBody @ResponseBody 를 활용할 수 없기 때문에 알아두어야 한다.

본인은 현재 Spring boot 3.3 버전 환경이기 때문에 따로 Jackson 라이브러리에 대한 설정은 하지 않았다.

  • ObjectMapper 객체 생성
    ObjectMapper objectMapper = new ObjectMapper();
  • 직렬화
    파일 출력 예시
    objectMapper.writeValue([fileObject], [javaObject]);
    스트링으로 표현 (HttpServlet에게 전달할 String)
    objectMapper.writeValueAsString([javaObject]);
  • 역직렬화
    objectMapper.readValue([jsonString], [javaClass].class);
    HttpServlet 을 통해 클라이언트로부터 받은 json을 처리할 때 예시
    HttpServletRequest req
    objectMapper.readValue(req.getInputStream(), [Class].class);

이 외에 단순한 Object가 아닌 List나 Tree 혹은 Map 같은 컬렉션 형태의 Json 변환은 매개변수와 리턴형태가 달라질 수 있다.

애너테이션 활용

@RequestBody @ResponseBody 를 사용하면 ObjectMapper를 작성하지 않아도 자동으로 직렬화/역직렬화 해준다. Controller 레이어에서 @ResponseBody 메서드는 객체를 리턴하기만 하면 된다.

항상 사용해왔던 기본 애너테이션 말고, 몇 가지 편의성 애너테이션을 찾아보았다.

프로퍼티 관련

  • @JsonValue : 멤버 변수, 메서드에 붙일 수 있는데 1개만 사용할 수 있다. 외부에서 해당 객체를 직렬화할 때 @JsonValue에 해당하는 프로퍼티가 담긴다. 보통 enum의 name을 다른 프로퍼티로 표현하고 싶을 때 사용하는 것 같다.

  • @JsonProperty("name") : 멤버변수에 붙이면, 해당 "name"으로 프로퍼티를 생성해준다. (Getter/Setter 없이)

  • @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY) : 클래스에 붙이면, 멤버변수와 Getter 모두 Json 매핑된다.
    @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY, getterVisibility = JsonAutoDetect.Visibility.NONE) : Getter는 매핑되지 않고, 필드만 매핑된다.

  • @JsonIgnore : 위 @JsonAutoDetect로부터 제외될 멤버에 붙인다.

  • @JsonInclude(JsonInclude.Include.NON_NULL) : 특정 프로퍼티만 포함시키기. 예시는 NOT NULL 필드만 포함. 전체 적용은 클래스에 붙이기, 멤버에만 적용은 멤버에 붙이기.

  • @JsonPropertyOrder({"name", "id"}) : 직렬화 순서 제어

  • @JsonRawValue : json 포맷의 String이 들어있는 프로퍼티에 붙이면, "{\n \"attr\":false\n}" -> {"attr": false} 로 직렬화됨

참고

[Spring] Jackson 이란 (+Json)
ObjectMapper를 이용하여 JSON 파싱하기
Jackson ObjectMapper 정리

profile
웹개발 도전! 데브옵스 도전!

0개의 댓글