필드에 @JsonIgnore 어노테이션을 사용하여 코딩하다보면 항상 마주하게 되는 문제점이 있다.
바로 deserialize시 데이터 저장이 안된다는 점...
이게 다 '필드'에 @JsonIgnore를 설정하면 getter, setter에 모두 적용되어 발생하는 문제인데..
그럼 왜 필드에 사용하느냐? 아마 대부분 lombok을 사용하니까 그렇게 쓰지 않을까 싶다..
여튼 원론적으로.. 직렬화(getter)/ 역직렬화(setter) 시 원하는 범위에만 @JsonIgnore를 적용하고 싶으면 그 부분에만 사용해주면 된다는 점!
한마디로.. @JsonIgnore/ @JsonProperty를 getter/setter에 사용하거나 @JsonProperty access 범위를 필드에 지정하면 된다.
물론 이런 커스터마이징이 많이 필요하다는 얘기는 설계를 다시 한 번 생각해봐야 한다는 것이겠지만.. 불가피한 경우가 있으므로..ㅎ
이런 경우는 상속말고 합성을 통해 좀 더 직관적인 설계가 가능한 경우가 많다.
여튼 이 글의 주제로 돌아와서.. 백문이 불여일견.
{"visible":"visible","invisible":"invisible"}
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. 자바 > 참고소스' 카테고리의 다른 글
카운트 증가 로직 성능 향상을 위한 방법 (0) | 2019.09.26 |
---|---|
[jackson] json serialize 시 상위클래스 필드 무시하기 (0) | 2019.01.15 |
[spring - mybatis tip] MyBatis(iBatis)에서 Java Enum code custom typeHandler 사용하기 (1) | 2017.07.06 |
[java 팁] split - pipeline(|)을 구분자로 문자열 쪼갤때 주의 (1) | 2014.06.11 |
[reflection] 클래스(Class) 의 필드명, 값 map으로 가져오기 (0) | 2014.05.08 |