@JsonIgnore, @JsonIgnoreProperties, @JsonIgnoreType차이점

Web Development assistant·2022년 1월 14일
2

# spring

목록 보기
6/32

영어 원문 글
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)를 붙혀주시면 활성/비활성화를 컨트롤할 수 있습니다.

0개의 댓글