[JoyMall] Json을 Response 할때 null 인 데이터를 제외하는 방법

청포도봉봉이·2024년 4월 26일
2

JoyMall

목록 보기
2/13
post-thumbnail

객체를 Json으로 바꿔주는 Jackson

API를 만들면 보통 DTO 클래스를 Json으로 변환하여 반환합니다.

https://velog.io/@pak4184/API-설계-시-Entity-클래스-반환-피하기

데이터의 구조를 표현하는 이유는 데이터 표현도 있지만, 사실상 데이터를 사용하는 대상이 편하게 사용하기 위해서 입니다. 그 중에서 Spring에서는 Jackson이라는 라이브러리를 사용하여 객체를 자동으로 Json으로 변환해줍니다. 이를 직렬화라고 합니다.

반대로 Json을 객체로 만들어주는 개념도 존재하는데 이를 역직렬화라고 합니다. 역직렬화는 직렬화의 반대 과정으로, 직렬화된 데이터를 원래의 객체 상태나 데이터 구조로 복원하는 과정입니다.

Spring Boot에서는 Jackson 라이브러리를 기본적으로 사용하여 JSON 데이터의 직렬화 및 역직렬화를 자동으로 처리합니다.

@JsonInclude

https://fasterxml.github.io/jackson-annotations/javadoc/2.9/com/fasterxml/jackson/annotation/JsonInclude.html

위 링크의 설명을 해석해보면

주석이 달린 속성의 값(필드, 메서드 또는 생성자 매개변수에 사용되는 경우) 또는 주석이 달린 클래스의 모든 속성이 직렬화되는 시기를 나타내는 데 사용되는 주석입니다. 주석이 없으면 속성 값은 항상 포함되지만 이 주석을 사용하면 작성할 속성의 양을 줄이기 위해 간단한 제외 규칙을 지정할 수 있습니다.

종류

여러가지가 있지만 기본적으로 쓰이는 5가지에 대해서 알아보겠습니다.

  • ALWAYS
    • 값에 상관없이 출력
  • NON_NULL
    • NULL 값이 아닌 경우에만 직렬화된 출력
  • NON_EMPTY
    • NULL 값이 아니고 빈 컬렉션, 맵이 아닌 경우 출력
  • NON_DEFAULT
    • 속성의 값이 해당 데이터 형식의 기본값과 다른 경우 출력
  • CUSTOM
    • 속성이 직렬화된 출력에 포함돼야 하는지를 결정 가능

1. 필드 레벨 적용

public class Member {
	@JsonInclude(JsonInclude.Include.NON_NULL)
	private String name;
    
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private int id;
}

필드명 위에 어노테이션을 작성하면 됩니다.

2. 클래스 레벨 적용

@JsonInclude(JsonInclude.Include.NON_NULL)
public class Member {
	private String name;
    private int id;
}

클래스명 위에 어노테이션을 작성하면 됩니다.

3. 전역 설정 application.yml 수정

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

profile
서버 백엔드 개발자

0개의 댓글