지난주 프로젝트 모임 중 지현님께서 양방향 연관관계가 있는 Entity가 Json으로 변환될 때 순환 참조가 일어나는 에러가 발생하여 @JsonIgnore 어노테이션으로 문제를 해결하셨다는 얘기를 전해들었다.
당시 "저희 프로젝트에도 @JsonIgnore 사용한 코드 있어요!" 하고 찾아보니 @JsonInclude였다.
response 반환 시 null 필드를 생략하기 위해 @JsonInclude를 사용했었는데, @JsonIgnore와 헷갈렸다.
헷갈리지 않도록 Jackson 어노테이션들을 살펴보고 정리해보고자 한다.
Jackson Property Inclusion Annotations
Jackson 라이브러리에서 사용되는 속성 포함에 관련된 어노테이션들로, JSON 직렬화 및 역직렬화 과정에서 특정 필드들의 포함 여부를 제어하는데 사용된다. 주로 클래스나 필드에 추가되며, 다양한 옵션을 설정하여 포함 규칙을 지정할 수 있다.
@JsonIgnoreProperties
클래스 수준에서 무시할 속성 또는 속성 목록을 표시한다. 즉, 특정 속성들을 JSON에 포함시키지 않도록 지정할 수 있다.
@JsonIgnoreProperties({ "id", "name" })
public class BeanWithIgnore {
public int id;
public String name;
public String email;
}
@JsonIgnore
필드 수준에서 무시할 속성을 표시한다.
public class BeanWithIgnore {
@JsonIgnore
public int id;
public String name;
public String email;
}
@JsonIgnore로 양방향 순환 참조 문제 해결한 케이스👇
https://communication-with-it.tistory.com/76
@JsonInclude
include라는 단어로 인해 무언가를 포함시킬 것 같지만, 주로 exclude 하기 위해 사용되니 헷갈리지 말자❗ 주로 null 값, 빈 값, 기본 값으로 설정된 값이 있는 속성을 제외한다.
1. JsonInclude.include.ALWALYS
- 모든 데이터가 포함된다.
1. JsonInclude.include.NON_NULL
- 값이 null인 데이터는 제외된다.
@JsonInclude(JsonInclude.Include.NON_NULL)
public class LoginResponse {
}
3. JsonInclude.include.NON_ABSENT
- 값이 null이거나
- 참조 타입(예: Java 8의 Optional 또는 java.util.concurrent.atomic.AtomicReference)의 "absent" 값은 제외된다.
❓ absent는 무슨 뜻일까? empty랑은 다른 개념인가?
- 궁금해서 알아보니 absent는 Optional 객체에 값이 없는 상태와 같이 속성 자체가 없는 상태로, 값을 가져오기 전에 속성이 비어있거나 초기화되지 않은 경우이다. empty는 속성이 존재하지만 값이 없는 상태라는 점에서 차이가 있다.
4. JsonInclude.include.NON_EMPTY
- 값이 null 이거나
- absent,
- Collections, Map의 isEmpty()가 true,
- 배열의 length가 0,
- String의 length가 0인 데이터는 제외된다.
5. JsonInclude.include.NON_DEFAULT
- 값이 empty 이거나
- primitive/wrapper의 값이 default 값인 데이터, (ex.int/Integer = 0, boolean = true)
- Date/Time의 timestamp가 0L인 데이터는 제외된다.
Reference
'Coding' 카테고리의 다른 글
[Spring Security] Filter에서 JWT 예외 처리 (1) | 2024.01.28 |
---|---|
[JPA] @OneToOne, 일대일(1:1) 연관관계 매핑 시 주의할 점 (지연 로딩 이슈) (0) | 2023.08.11 |
[AWS S3] 여러 객체 삭제 (0) | 2023.07.10 |
[20230628] 오늘의 삽질 (0) | 2023.06.28 |
[JAVA] var 사용 시 주의할 점과 장단점 - 지역 변수 추론 타입 (0) | 2023.06.27 |