Jackson @JsonInclude 어노테이션이란?
Jackson 라이브러리의 @JsonInclude 어노테이션은 Java 객체를 JSON으로 직렬화할 때 특정 조건에 따라 클래스의 속성(property)이나 필드(field)를 출력에서 제외하기 위해 사용됩니다. 예를 들어, 값이 null인 필드나 빈 컬렉션을 JSON 결과에서 생략하고 싶을 때 매우 유용합니다.
이 어노테이션은 JsonInclude.Include 열거형(enum)을 통해 정의되며, 이 enum에는 속성(필드)을 제외할지 여부를 결정하는 다음과 같은 상수들이 포함되어 있습니다.
JsonInclude.Include의 주요 상수
- ALWAYS: 속성 값을 항상 JSON에 포함합니다.
- NON_DEFAULT: 필드 값이 기본값(default)과 동일한 경우 제외합니다.
- NON_EMPTY: 값이 null이거나 비어 있는 경우(빈 문자열, 빈 컬렉션 등) 제외합니다.
- NON_NULL: 값이 null인 경우에만 제외합니다.
문법(Syntax)
public static enum JsonInclude.Include extends Enum<JsonInclude.Include>
예제 코드
아래 예제에서는 Employee 클래스에 @JsonInclude(JsonInclude.Include.NON_EMPTY)를 적용하여, 값이 비어 있는 필드가 JSON 출력에서 어떻게 제외되는지 확인할 수 있습니다.
import com.fasterxml.jackson.annotation.*;
import com.fasterxml.jackson.databind.*;
import java.io.*;
public class JsonIncludeTest {
public static void main(String args[]) throws IOException {
ObjectMapper objectMapper = new ObjectMapper();
Employee emp = new Employee();
String jsonString = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(emp);
System.out.println(jsonString);
}
}
// Employee 클래스
@JsonInclude(JsonInclude.Include.NON_EMPTY)
class Employee {
public int empId = 115;
public String empName = null;
@Override
public String toString() {
return "Employee{" +
"empId=" + empId +
", empName='" + empName + '\'' +
'}';
}
}실행 결과(Output)
{
"empId" : 115
}결과 분석
위 실행 결과를 보면 empId는 값이 115로 존재하므로 JSON에 정상적으로 포함되었지만, empName은 null이므로 NON_EMPTY 조건에 의해 JSON 출력에서 자동으로 제외된 것을 확인할 수 있습니다.
이처럼 @JsonInclude 어노테이션을 활용하면 불필요하거나 의미 없는 필드까지 클라이언트에 전송하지 않아도 되므로, 더 깔끔하고 간결한 JSON 응답을 만들 수 있으며 API 응답 크기 절감과 데이터 보안 측면에서도 도움이 됩니다.