@JsonInclude 사용하기

신지훈·2025년 3월 12일
0

JAVA/Spring

목록 보기
2/6

문제 인식

웹 서비스에 팔로우 기능을 개발하던 중 프로트 측에 요청을 받았다.

요청은 팔로워 리스트에서 내가 팔로워를 팔루우하고 있는지에 대한 데이터를 추가 해달라는 요청이였다.

현재 나는 팔로우, 팔로워 리스트를 반환할 때 같은 DTO를 사용하여 정보를 보내주고 있었다. 하지만 팔로워리스트에는 해당 정보가 추가로 필요하지만, 팔로우 리스트에는 내가 상대를 팔로우하고 있는 것이 당연한 것이다.

고민

그래서 팔로우와 팔로워 DTO를 분리하여 만들어야 하는지 아니면 불필요하더라도 팔로잉 리스트에도 팔로우 여부를 추가하여 통합해서 사용할지 고민이 되었다.

DTO를 분리한다면 정확한 정보만 DTO가 가질 수 있지만 규모가 좀 있는 서비스이기 때문에 DTO가 복잡해질 것 같았다.

반면에 DTO를 통합한다면 불필요한 데이터로 클라이언트나 다른 개발자가 불필요한 필드를 보고 혼란을 느낄 수 있을 것 같았다.

해결책

그러던 중 이 해결책으로 @JsonInclude를 알게 되었다.

@JsonInclude(JsonInclude.Include.NON_NULL) Boolean isFollowedByMe
이처럼 필드 위에 어노테이션을 추가한다면 해당 값이 null인 경우 해당 정보를 빼고 반환할 수 있다.

이를 적용하여 isFollowedByMe를 추가하였고, 다음과 같이 수정하여 다른 곳에서 사용하던 DTO를 그대로 사용할 수 있도록 수정했다.

public record StudentResponse(
    String userId,
    String name,
    PhotoDto photoDto,
    @JsonInclude(JsonInclude.Include.NON_NULL)
    Boolean isFollowedByMe,
    int grade,
    int myClass
) {
	public static StudentResponse from(Student student, Boolean isFollowedByMe) {
    	return new StudentResponse(
        	student.getUserId(),
            student.getName(),
            PhotoDto.from(student.getPhoto()),
            isFollowedByMe,
            student.getGrade(),
            student.getMyClass()
		);
	}

    public static StudentResponse from(Student student) {
            return from(student, null);
    }
}

JsonInclude 옵션들

ALWAYS

모든 값을 출력

NON_NULL

null은 제외

NON_ABSENT

null은 제외하고,
변수 중에 AtomicReference<> 타입이면서 선언만 되어있다면 제외

NON_EMPTY

  1. null도 제외하고,
  2. absent도 제외하고 (아마 NON_ABSENT를 포함하는 듯)
  3. Collection, Map일 때 isEmpty()가 true여도 제외하고,
  4. Array는 length가 0이면 제외하고,
  5. String도 length가 0이면 제외

출처 : https://velog.io/@seulpace/JsonInclude-%EC%96%B4%EB%85%B8%ED%85%8C%EC%9D%B4%EC%85%98

profile
주주주주니어 개발자

0개의 댓글