API를 만들면 보통 DTO 클래스를 Json으로 변환하여 반환합니다.
데이터의 구조를 표현하는 이유는 데이터 표현도 있지만, 사실상 데이터를 사용하는 대상이 편하게 사용하기 위해서 입니다. 그 중에서 Spring에서는 Jackson이라는 라이브러리를 사용하여 객체를 자동으로 Json으로 변환해줍니다. 이를 직렬화
라고 합니다.
반대로 Json을 객체로 만들어주는 개념도 존재하는데 이를 역직렬화
라고 합니다. 역직렬화는 직렬화의 반대 과정으로, 직렬화된 데이터를 원래의 객체 상태나 데이터 구조로 복원하는 과정입니다.
Spring Boot에서는 Jackson 라이브러리를 기본적으로 사용하여 JSON 데이터의 직렬화 및 역직렬화를 자동으로 처리합니다.
위 링크의 설명을 해석해보면
주석이 달린 속성의 값(필드, 메서드 또는 생성자 매개변수에 사용되는 경우) 또는 주석이 달린 클래스의 모든 속성이 직렬화되는 시기를 나타내는 데 사용되는 주석입니다. 주석이 없으면 속성 값은 항상 포함되지만 이 주석을 사용하면 작성할 속성의 양을 줄이기 위해 간단한 제외 규칙을 지정할 수 있습니다.
여러가지가 있지만 기본적으로 쓰이는 5가지에 대해서 알아보겠습니다.
ALWAYS
NON_NULL
NON_EMPTY
NON_DEFAULT
CUSTOM
public class Member {
@JsonInclude(JsonInclude.Include.NON_NULL)
private String name;
@JsonInclude(JsonInclude.Include.NON_NULL)
private int id;
}
필드명 위에 어노테이션을 작성하면 됩니다.
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Member {
private String name;
private int id;
}
클래스명 위에 어노테이션을 작성하면 됩니다.
spring:
jackson:
default-property-inclusion: non_null
위와 같이 설정하면 전역으로 설정할 수 있습니다.
mapper.setSerializationInclusion(Include.NON_NULL);
이걸 사용하면 이제 이 매퍼를 통해 직렬화된 모든 클래스의 모든 null 필드는 무시됩니다.
@Test
public void givenNullsIgnoredGlobally_whenWritingObjectWithNullField_thenIgnored()
throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(Include.NON_NULL);
MyDto dtoObject = new MyDto();
String dtoAsString = mapper.writeValueAsString(dtoObject);
assertThat(dtoAsString, containsString("intValue"));
assertThat(dtoAsString, containsString("booleanValue"));
assertThat(dtoAsString, not(containsString("stringValue")));
}
참고
https://mkyong.com/java/jackson-how-to-ignore-null-fields/#ignore-all-null-fields-globally
https://www.baeldung.com/jackson-ignore-null-fields
https://yuma1029.tistory.com/9