프로그래밍 언어/Java + Kotlin

[Kotlin] 특정 프로퍼티 Json 직렬화/역직렬화 시 제외시키기

2023. 11. 9. 23:43

data class로 레디스에 객체를 역직렬화하는 과정에서 다음과 같은 에러가 발생했다.

에러 내용은 ttl이라는 필드가 non-nullable인데, 실제로는 null이 들어가서객체 생성에 실패했다는 것이다.

Could not read JSON: Instantiation of [simple type, class ...] value failed for JSON property ttl due to missing (therefore NULL) value for creator parameter ttl which is a non-nullable type

 

class는 대략 다음과 같은 형태였다.

분명 @JsonIgnore 애너테이션으로 직렬화/역직렬화에서 해당 프로퍼티를 제외했는데, 왜 직렬화/역직렬화에 포함된 건지 궁금했다.

data class RedisObject(
    val no: Long,
    val name: String,
    ...
    @JsonIgnore
    val ttl: Duration,
)

 

 

답은 스택오버플로우에서 찾을 수 있었다.

https://stackoverflow.com/questions/71034053/why-jsonignore-annotation-doesnt-work-during-deserializing-data

 

우선 @JsonIgnore는 대응되는 JSON 필드를 무시한다. Java에서 Jackson은 역직렬화 시JSON 필드가 존재하지 않는다면 대응되는 객체의 필드에 null을 세팅한다. 이는 Java에서 기본적으로 참조 타입의 변수엔 null이 담길 수 있기 때문이다. 그러나 Kotlin은 Java와 달리 non-nullable 타입이 존재한다. 여기에 null이 담기려고 해서 에러가 발생한 것이다.

 

정리하자면 @JsonIgnore를 프로퍼티에 붙여서 역직렬화 시 해당 프로퍼티 값으로 null이 세팅되려고 했으나, 프로퍼티의 타입이 non-nullable인 관계로 객체 생성이 실패한 것이다.

 

 

해결 방법은 크게 3가지가 있다.

1) default value 셋팅

data class RedisObject(
    val no: Long,
    val name: String,
    ...
    @JsonIgnore
    val ttl: Duration = Duration.ofMinutes(1),
)

 

2) nullable한 타입 사용

data class RedisObject(
    val no: Long,
    val name: String,
    ...
    @JsonIgnore
    val ttl: Duration?,
)

 

3) 지연 초기화 사용

data class RedisObject(
    val no: Long,
    val name: String,
    ...
) {
    @JsonIgnore
    lateinit var ttl: Duration
}

 

나는 default value를 넣어주거나, 타입을 바꿔주는 것은 싫어서 조금 번거롭더라도 지연 초기화(3번)를 사용해 문제를 해결했다.

상황에 따라 적절하게 선택하면 될 것 같다.

 

참고로 lateinit 키워드를 사용하면 최초에 프로퍼티가 null로 초기화된다. 그래서 non-nullable한 타입으로 선언하더라도 null이 들어갈 수 있는 것이다. 실제 사용하는 시점에는 초기화가 되어야 한다.

 

저작자표시 비영리 (새창열림)

'프로그래밍 언어 > Java + Kotlin' 카테고리의 다른 글

[Kotlin] 쿠폰적용가 성능 개선기  (1) 2023.11.18
[Java] 제네릭 타입 소거(Generic Type Erasure)에 대해 알아보자  (0) 2023.08.02
[Java] Collection과 Collections의 차이  (0) 2023.03.16
[Java] 생성자 총정리  (0) 2023.01.06
[Kotlin] 코틀린에서 애너테이션 사용하기 (vs 자바)  (0) 2022.12.19
'프로그래밍 언어/Java + Kotlin' 카테고리의 다른 글
  • [Kotlin] 쿠폰적용가 성능 개선기
  • [Java] 제네릭 타입 소거(Generic Type Erasure)에 대해 알아보자
  • [Java] Collection과 Collections의 차이
  • [Java] 생성자 총정리
코택
코택
코택
TaxFree
코택
전체
오늘
어제
  • 분류 전체보기 (369)
    • Spring (29)
      • Spring (18)
      • 스프링 핵심 원리 - 고급편 (11)
    • Spring Batch (4)
    • JPA (4)
    • CS (89)
      • 자료구조 (2)
      • 네트워크 (5)
      • 운영체제 (1)
      • 데이터베이스 (4)
      • SQL (7)
      • 알고리즘 이론 (4)
      • 알고리즘 문제 풀이 (66)
    • 웹 (28)
      • React.js (4)
      • Next.js (1)
      • Node.js (14)
      • FastAPI (4)
      • Django (5)
    • 프로그래밍 언어 (45)
      • Python (5)
      • Java + Kotlin (29)
      • JavaScript + TypeScript (11)
    • 테스트코드 (26)
      • ATDD, 클린 코드 with Spring (4)
      • 이규원의 현실 세상의 TDD: 안정감을 주는 코드.. (20)
    • 인프라 (6)
      • AWS (2)
      • Kubernetes (4)
    • 트러블슈팅 (25)
    • 책 (89)
      • Effective Java (54)
      • Effective Kotlin (14)
      • 도메인 주도 개발 시작하기: DDD 핵심 개념 정.. (11)
      • 웹 프로그래머를 위한 데이터베이스를 지탱하는 기술 (6)
      • 도메인 주도 설계 첫걸음 (4)
    • Git (10)
    • 회고 (5)
    • etc (8)

블로그 메뉴

  • 홈
  • 방명록
  • 관리
  • GitHub
  • LinkedIn

공지사항

  • 스킨 관련

인기 글

태그

  • 깊이 우선 탐색
  • Shortest Path
  • atdd
  • 장고
  • dp
  • 백준
  • http
  • 브루트포스
  • fastapi
  • Git
  • 그래프 탐색
  • 그래프
  • mysql
  • 파이썬
  • BOJ

최근 댓글

최근 글

hELLO · Designed By 정상우.
코택
[Kotlin] 특정 프로퍼티 Json 직렬화/역직렬화 시 제외시키기
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.