Spring 프레임워크를 사용하면서 항상 사용하게 되는 라이브러리다.
웹 개발이 거의 비슷한 형태로 진행되어서 자세한 것은 모르는 채로 한정된 애너테이션만 사용했었는데, 다양한 설정 애너테이션이 있는 것 같아 좀 더 알아보았다.
Java의 객체가 담는 데이터를 외부에서 표현해야 할 때 JSON 형태로 저장하는 경우가 많다.
Spring에서는 이 형태를 전환하는 것을 직렬화(serialization), 역직렬화(deserialization)라고 표현하더라.
Jackson 라이브러리가 위 방법을 편리하게 제공해준다.
public class person() {
private int id;
private String name;
}
json { "id" : 1, "name" : "yang" }이와 같이 객체로 표현되던 멤버 변수를 Json 포맷에서는 연속적인 데이터로 표현해서 Stream을 통해 데이터를 읽을 수 있다. Java 8의 추가된 기술 스트림이 아니다. I/O 시에 발생하는 Stream of Bytes 이다.
정확히는 멤버 변수를 직렬화하는 것이 아니라 프로퍼티를 직렬화한다고 한다!
무슨 말이냐면, person() 클래스의 Getter 로 접근할 수 있는 멤버 변수에 한해서만 직렬화 된다.
잘 생각해보면, 당연하다. private으로 선언된 멤버 변수를 서드파티 라이브러리 클래스가 접근할 권한은 없긴 하다.
그렇다면 역직렬화는 JSON -> Java 객체를 표현하는 방식이 되겠다.
역직렬화는 반대로 Setter 가 필요한데 주의점이 있다.
객체 생성을 위한 기본생성자가 필요하고 (설정으로 생성자 형태를 변경할 수도 있다고 한다.)
직렬화와 다르게 Getter도 필요하다고 한다.
Controller로 들어가기 전에는 @RequestBody @ResponseBody 를 활용할 수 없기 때문에 알아두어야 한다.
본인은 현재 Spring boot 3.3 버전 환경이기 때문에 따로 Jackson 라이브러리에 대한 설정은 하지 않았다.
ObjectMapper objectMapper = new ObjectMapper();objectMapper.writeValue([fileObject], [javaObject]);objectMapper.writeValueAsString([javaObject]);objectMapper.readValue([jsonString], [javaClass].class);HttpServletRequest reqobjectMapper.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 정리