밤빵's 개발일지
[TIL]20241121 Jackson @JsonInclude 본문
.
@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의 장점과 단점
장점
- 데이터 최적화: null 값이나 빈 필드를 제외하고 직렬화해서, 데이터 크기를 줄이고 전송 속도를 높일 수 있다. 특히 대용량 데이터를 다루는 상황에서 이점이 크다.
- 가독성 향상: 불필요한 필드를 제외함으로써 JSON 구조가 더 간결해지고, 클라이언트와 서버 간의 데이터 통신이 명확해진다. 클라이언트에서 사용하지 않는 데이터는 보내지 않음으로써 혼란을 줄일 수 있다.
단점
- 누락된 데이터의 위험성: 특정 필드를 직렬화하지 않도록 설정하면서, 예상치 못한 데이터 누락이 발생할 수 있다. 예를 들어, 필드가 null일 경우에 직렬화를 하지 않도록 설정했는데, 클라이언트가 해당 필드의 존재 여부를 중요하게 여긴다면 문제가 될 수 있다.
- 디버깅의 어려움: 직렬화 과정에서 필드가 제외되는 경우, 디버깅 시 해당 필드가 누락된 이유를 추적하기 어려울 수 있다. 이러한 경우에는 JSON 직렬화 결과를 자세히 살펴보아야 한다.
▶프로젝트에서의 적용
이번 프로젝트에서는 API 응답 데이터를 직렬화할 때, @JsonInclude(JsonInclude.Include.NON_NULL) 옵션을 사용해 null 값을 제외하도록 설정하였다. 게임 매치 정보의 relationships 필드는 상황에 따라 존재하지 않을 수 있었는데, 이전에는 relationships 필드가 null로 표시되었지만, @JsonInclude를 적용한 후에는 아예 제외되어 더 깔끔한 JSON 구조를 가지게 되었다. 이를 통해 데이터의 의미를 더 명확하게 전달할 수 있었고, 불필요한 데이터 전송을 줄였다.(pubg의 데이터와도 일치한다.)
프로젝트를 진행하면서 @JsonInclude 어노테이션의 개념과 사용 방법, 그리고 이를 실제로 적용했을 때의 장점과 단점을 학습할 수 있었다. 특히, API 응답 데이터의 최적화와 클라이언트와의 명확한 데이터 통신을 위해 매우 유용한 도구라는 것을 알게 되었다. 개발 과정에서 클라이언트와 서버 간의 데이터 전송 효율성을 항상 고려해야 한다는 점에서, @JsonInclude는 매우 실용적인 도구이다.데이터 직렬화를 좀 더 깊이 이해할 수 있었다는 점에서 만족스럽다.
'개발Article' 카테고리의 다른 글
[TIL]20241123 PUBG 프로젝트 roster 응답 구조 재작업 (1) | 2024.11.23 |
---|---|
[TIL]20241122 synchronized (1) | 2024.11.22 |
[TIL]20241120 FACADE 패턴 (14) | 2024.11.20 |
[TIL]20241118 Spring Security에서 권한별 URL 접근 제어에 대한 고민 (1) | 2024.11.19 |
[TIL]20241117 TDD (1) | 2024.11.17 |