[jackson] json serialize 만 ignore 하고 싶다면? :: 소림사의 홍반장!

필드에 @JsonIgnore 어노테이션을 사용하여 코딩하다보면 항상 마주하게 되는 문제점이 있다.


바로 deserialize시 데이터 저장이 안된다는 점...


이게 다 '필드'에 @JsonIgnore를 설정하면 getter, setter에 모두 적용되어 발생하는 문제인데.. 


그럼 왜 필드에 사용하느냐? 아마 대부분 lombok을 사용하니까 그렇게 쓰지 않을까 싶다..



여튼 원론적으로.. 직렬화(getter)/ 역직렬화(setter) 시 원하는 범위에만 @JsonIgnore를 적용하고 싶으면 그 부분에만 사용해주면 된다는 점!


한마디로.. @JsonIgnore/ @JsonProperty를 getter/setter에 사용하거나 @JsonProperty access 범위를 필드에 지정하면 된다.



물론 이런 커스터마이징이 많이 필요하다는 얘기는 설계를 다시 한 번 생각해봐야 한다는 것이겠지만.. 불가피한 경우가 있으므로..ㅎ


이런 경우는 상속말고 합성을 통해 좀 더 직관적인 설계가 가능한 경우가 많다.




여튼 이 글의 주제로 돌아와서.. 백문이 불여일견. 

{"visible":"visible","invisible":"invisible"}


객체에서 invisible 데이터는 이용하되 직렬화시 invisible의 데이터를 보이지 않게 설정하고자 한다.
위의 데이터를 응답모델에 deserialize/ serialize 하여 세팅별로 어떤 결과가 나오는지 확인해보자.

final String json = "{\"visible\":\"visible\",\"invisible\":\"invisible\"}";

ResponseSample responseSample = new ObjectMapper().readValue(json, ResponseSample.class);

System.out.println("deserialize : " + responseSample);

System.out.println("serialize : " + new ObjectMapper().writeValueAsString(responseSample));




Case 1. 최초 생성 모델

@Getter
@Setter
@ToString
class ResponseSample implements Serializable {

private static final long serialVersionUID = -1246490797953136249L;

private String visible;
private String invisible;
}

결과

deserialize : ResponseSample(visible=visible, invisible=invisible)
serialize : {"visible":"visible","invisible":"invisible"}




Case 2. field @JsonIgnore 적용 모델

@Getter
@Setter
@ToString
class ResponseSample implements Serializable {

private static final long serialVersionUID = -1246490797953136249L;

private String visible;
@JsonIgnore
private String invisible;
}


결과

deserialize : ResponseSample(visible=visible, invisible=null)
serialize : {"visible":"visible"}





Case 3. getter @JsonIgnore 적용 모델

@Getter
@Setter
@ToString
class ResponseSample implements Serializable {

private static final long serialVersionUID = -1246490797953136249L;

private String visible;
private String invisible;

@JsonIgnore
public String getInvisible() {
return invisible;
}

@JsonProperty
public void setInvisible(String invisible) {
this.invisible = invisible;
}
}

결과

deserialize : ResponseSample(visible=visible, invisible=invisible)
serialize : {"visible":"visible"}





Case 4. @JsonProperty access 적용 모델

@Getter
@Setter
@ToString
class ResponseSample implements Serializable {

private static final long serialVersionUID = -1246490797953136249L;

private String visible;

@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private String invisible;
}

결과

deserialize : ResponseSample(visible=visible, invisible=invisible)
serialize : {"visible":"visible"}















다른 카테고리의 글 목록

Dev. 자바/참고소스 카테고리의 포스트를 톺아봅니다