영어 원문 글
https://www.concretepage.com/jackson-api/jackson-jsonignore-jsonignoreproperties-and-jsonignoretype
//maven Jackson dependency
//서버와 클라이언트간에 데이터 전송을 json타입으로 전송할 수 있게 도와준다
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.0</version>
</dependency>
영어 원글 자의적 해석...
@JsonIgnore, @JsonIgnoreProperties, @JsonIgnoreType 이러한 주석은 JSON 직렬화, 역직렬화에서
속성을 무시하는데 사용됩니다.
직렬화, 역직렬화
직렬화란??
객체의 직렬화는 객체의 내용을 바이트 단위로 변환하여
파일 또는 네트워크를 통해서 스트림(송수신)이 가능하도록 하는 것을 의미한다.
...
출처: https://weicomes.tistory.com/63 [25%]
@JsonIgnore 어노테이션은 클래스의 속성(필드, 멤버변수) 수준에서 사용되고
@JsonIgnoreProperties 어노테이션은 클래스 수준(클래스 선언 바로 위에)에 사용됩니다.
@JsonIgnoreType 어노테이션은 클래스 수준에서 사용되며 전체 클래스를 무시합니다.
@jsonIgnore
@JsonIgnore는 직렬화 역직렬화에 사용되는 논리적 프로퍼티(속성..) 값을 무시할때 사용됩니다.
@jsonIgnore
public String myName;
또한 게터 세터 메서드에서도 사용 가능하다.
@JsonIgnore
public String getmyName(){
return this.myName;
}
@JsonIgnore
public void setmyName(String myName){
return this.myName = myName;
}
위의 예제에서 사용된 myName 필드가
역직렬화할때 서버는
Unrecognized field "myName"
와 같이 에러를 던질 것이다.
직렬화를 할땐 myName 필드가 Json에 담기지 않습니다.
@JsonIgnore 어노테이션은 @JsonProperty와 함께 사용될 수 있습니다.(명시적 선언 그리고 JSON에서 선언된 키값을 맵핑시킴)
@JsonIgnore
@JsonProperty("Name")
private String myName;
myName 프로퍼티에 @JsonProperty("myName")를 추가함으로서 에러를 던지지 않으면서
JSON의 직렬, 역직렬화 할때 myName필드를 무시할 수 있습니다.
또한 @JsonIgnore의 속성값으로(false)를 줄 수 있습니다
@JsonIgnore(false)
private String myName;
@JsonIgnore를 false 속성으로 비활성화 시켰고,
논리적 프로퍼티인 myName을
JSON 직렬화, 역직렬화에 사용할 수 있게 되었습니다.
@JsonIgnoreProperties
@JsonIgnoreProperties어노테이션은 클래스 단위 레벨에 사용되며 지정된 필드값의 JSON 직렬, 역직렬화를 무시할 수 있습니다.
@JsonIgnoreProperties({ "bookName", "bookCategory" })
public class Book {public class Book {
@JsonProperty("bookId")
private String id;private String id;
@JsonProperty("bookCategory")
private String category;
위의 소스에서 bookName, bookCategory필드는
@@JsonIgnoreProperties 어노테이션에 지정되어
JSON 직렬, 역직렬화에 담기지 않을것 입니다.
만약 Book 클래스 내에
BookId와 같은 다른 필드가 존재하고,
@JsonIgnore 어노테이션이 적용 되었다면
BooK 클래스의 모든 필드값은 JSON에 담기지 않을 것 입니다.
이 말은 즉 @JsonIgnore, @JsonIgnoreProperties은 JSON 직렬, 역직렬화를 무시할때 사용 됩니다.
@JsonIgnoreProperties 어노테이션은
allowGetters, allowSetters, ignoreUnknown, value 속성을 가지고 있습니다.
영어 원문의 설명이 너무길어 요약만 하겠습니다.
@JsonIgnoreProperties
(
value={"bookName","bookCategory"}, allowGetters=true
)
는 특정 필드가 직렬화는 허용하지만 역직렬화는 허용하지 않게 해주는 어노테이션입니다.
@JsonIgnoreProperties
(
value={"bookName","bookCategory"}, allowSettersa=true
)
는 allowGetters와 반대로 역직렬화는 허용하나 직렬화는 허용하지 않게 해주는 어노테이션 입니다.
@JsonIgnoreProperties(ignoreUnknown = true)
현재 진행중인 프로젝트에서 사용되고 있으며
아마 가장 많이 쓰이는 어노테이션이라 생각되는 속성 입니다.
@JsonIgnoreProperties(ignoreUnknown = true)를 사용하게 되면 역직렬화,
JSON 데이터가 가진 프로퍼티 중에
자바 class의 vo 프로퍼티에 값이 없는경우
에러를 던지지 않고 무시됩니다.
##Class Person ###
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@Data //lombok
@JsonIgnoreProperties(ignoreUnknown = true)
public class person{
private String name;
private int age;
}
##JSON##
{
"name" : "han",
"age" : "29",
"language" : "korean",
"gender" : "male"
}
위의 Person class는 name과 age 프로퍼티를 가지고 있습니다.
JSON 데이터는 Person class 존재하지 않는 추가적인 필드가 존재합니다.
Json 데이터의 language, gender는 Person 클래스의 논리적인 필드값에 대응하지 않습니다.
하지만
@JsonIgnoreProperties 의 ignoreUnknown =true 속성을 사용함 으로써 역직렬화(클라이언트 -> 서버)에 예외를 받지 않을것 입니다.
@JsonIgnoreType
@JsonIgnoreType 어노테이션은 클래스 레벨에 사용되며
위에 클래스내에 존재하는 모든 필드들이 JSON 직렬, 역직렬화에 무시될 것입니다.(즉 클래스 자체를 JSON 데이터 맵핑에 사용불가)
마찬가지로 @JsonIgnoreType(false)와 같이 boolean 속성을가지고 있으며
활성/ 비활성화 할 수 있습니다.
//default 값 = true
@JsonIgnoreType
class Address{
private String address;
}
public class Writer {
@JsonProperty("writerAddress")
private Address address;
}
프로퍼티 writerAddress는 Writer 클래스의 직렬, 역직렬화에 무시될것 입니다.
만약 Address 클래스에
@JsonIgnore(false)를 붙혀주시면 활성/비활성화를 컨트롤할 수 있습니다.