Notice
Recent Posts
Recent Comments
Link
«   2025/03   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
Archives
Today
Total
관리 메뉴

밤빵's 개발일지

[TIL]20241121 Jackson @JsonInclude 본문

개발Article

[TIL]20241121 Jackson @JsonInclude

최밤빵 2024. 11. 21. 05:37

.

@JsonInclude는 JSON 직렬화 과정에서 필드의 포함 여부를 결정하는 역할을 한다. 프로젝트에서 처음 이 어노테이션을 접하게 된 계기로 @JsonInclude의 개념, 옵션, 적용 방법, 장단점 등을 학습하며 개발일지에 정리하기로 했다. 

 

▶@JsonInclude란?

@JsonInclude는 Jackson 라이브러리에서 제공하는 어노테이션으로, JSON 직렬화 과정에서 특정 필드를 직렬화할지 말지를 결정하는 역할을 한다. 예를 들어, 객체의 특정 필드가 null이거나 기본값일 때 그 필드를 JSON에 포함할지 여부를 설정할 수 있다. 이 기능은 직렬화된 JSON 데이터를 보다 간결하고 효율적으로 만들 수 있으며, API 통신 시 불필요한 데이터를 줄이는 데 큰 도움이 된다.

기본적으로 @JsonInclude는 여러 옵션을 제공한다.

  • Include.ALWAYS: 모든 필드를 직렬화한다. 기본값이고, null 값도 포함된다.
  • Include.NON_NULL: null인 필드는 직렬화하지 않는다.
  • Include.NON_EMPTY: 빈 값(null, 빈 문자열, 빈 컬렉션 등)을 가진 필드는 직렬화하지 않는다.
  • Include.NON_DEFAULT: 필드가 기본값이 아닌 경우에만 직렬화한다.

이런 옵션들을 통해 직렬화 결과를 더 세밀하게 제어할 수 있다. 예를 들어, 클라이언트에게 필요 없는 null 값을 제거하여 데이터 크기를 줄이고, 전송 속도를 높이는 효과를 기대할 수 있다.


▶예시 코드 분석

내가 작성한 MatchesDto 클래스에서 @JsonInclude 어노테이션을 적용한 예시 코드로, 이 클래스는 게임 매치 정보를 담고 있는 DTO로, Jackson을 사용해 JSON 직렬화를 수행한다.

@JsonInclude(JsonInclude.Include.NON_NULL)
public class Included {
    @JsonProperty("type")
    private String type;
    @JsonProperty("id")
    private String id;
    @JsonProperty("attributes")
    private Object attributes;
    @JsonProperty("relationships")
    private Object relationships; // null일 경우 직렬화하지 않음
}

→  @JsonInclude(JsonInclude.Include.NON_NULL) 어노테이션을 사용하여 relationships 필드를 null일 때 직렬화하지 않도록 설정하였다. 이렇게 하면 클라이언트에게 불필요한 null 값을 보내지 않게 되어 API 응답의 효율성이 높아진다. 이 코드를 적용한 후 직렬화된 JSON 결과에서 relationships 필드가 존재하지 않는 것을 확인할 수 있었고, 데이터의 간결함과 효율성을 개선할 수 있었다.


▶@JsonInclude 옵션의 차이점과 활용

  • Include.NON_NULL: null인 필드를 직렬화하지 않아서 JSON 데이터가 더 간결해진다. API 응답에서 null 값은 의미가 없는 경우가 많기 때문에 제외함으로써 데이터 전송 효율을 높일 수 있다.
  • Include.NON_EMPTY: 빈 문자열이나 빈 컬렉션까지 직렬화에서 제외하고 싶은 경우 유용하다. 예를 들어, 클라이언트에게 제공할 때 비어 있는 리스트나 문자열을 굳이 보낼 필요가 없다면 이 옵션을 사용할 수 있다.
  • Include.NON_DEFAULT: 필드가 기본값인 경우 직렬화하지 않는다. 이 옵션은 데이터가 많아지는 상황에서 특히 유용하다. 단지 기본값이 무엇인지 정확히 알고 있어야 하기때문에, 예상치 못한 누락이 발생하지 않도록 주의해야 한다.

▶@JsonInclude의 장점과 단점

장점

  1. 데이터 최적화: null 값이나 빈 필드를 제외하고 직렬화해서, 데이터 크기를 줄이고 전송 속도를 높일 수 있다. 특히 대용량 데이터를 다루는 상황에서 이점이 크다.
  2. 가독성 향상: 불필요한 필드를 제외함으로써 JSON 구조가 더 간결해지고, 클라이언트와 서버 간의 데이터 통신이 명확해진다. 클라이언트에서 사용하지 않는 데이터는 보내지 않음으로써 혼란을 줄일 수 있다.

단점

  1. 누락된 데이터의 위험성: 특정 필드를 직렬화하지 않도록 설정하면서, 예상치 못한 데이터 누락이 발생할 수 있다. 예를 들어, 필드가 null일 경우에 직렬화를 하지 않도록 설정했는데, 클라이언트가 해당 필드의 존재 여부를 중요하게 여긴다면 문제가 될 수 있다.
  2. 디버깅의 어려움: 직렬화 과정에서 필드가 제외되는 경우, 디버깅 시 해당 필드가 누락된 이유를 추적하기 어려울 수 있다. 이러한 경우에는 JSON 직렬화 결과를 자세히 살펴보아야 한다.

▶프로젝트에서의 적용 

이번 프로젝트에서는 API 응답 데이터를 직렬화할 때, @JsonInclude(JsonInclude.Include.NON_NULL) 옵션을 사용해 null 값을 제외하도록 설정하였다. 게임 매치 정보의 relationships 필드는 상황에 따라 존재하지 않을 수 있었는데, 이전에는 relationships 필드가 null로 표시되었지만, @JsonInclude를 적용한 후에는 아예 제외되어 더 깔끔한 JSON 구조를 가지게 되었다. 이를 통해 데이터의 의미를 더 명확하게 전달할 수 있었고, 불필요한 데이터 전송을 줄였다.(pubg의 데이터와도 일치한다.)


프로젝트를 진행하면서  @JsonInclude 어노테이션의 개념과 사용 방법, 그리고 이를 실제로 적용했을 때의 장점과 단점을 학습할 수 있었다. 특히, API 응답 데이터의 최적화와 클라이언트와의 명확한 데이터 통신을 위해 매우 유용한 도구라는 것을 알게 되었다. 개발 과정에서 클라이언트와 서버 간의 데이터 전송 효율성을 항상 고려해야 한다는 점에서, @JsonInclude는 매우 실용적인 도구이다.데이터 직렬화를 좀 더 깊이 이해할 수 있었다는 점에서 만족스럽다.