본문으로 바로가기

[JAVA] JsonIgnore, JsonProperty(READ_ONLY) 차이

category JAVA/JAVA 2022. 12. 26. 22:18

하나의 가정을 들어보겠습니다.

프론트팀에게 api의 swagger를 제공할 때

해당 파라미터가 RequestBody json 구조로 이뤄져있다면..

이런식으로 Request Parameter가 이루어져 있습니다.

 

이때 age 파라미터는 프론트에서 필요 없는 파라미터이고

api에서만 set할 때 사용하는 파라미터라면 어떻게 해야될까요?

 

age 파라미터를 보이지 않게 해야합니다.

프론트에서 사용하지 않는 파라미터까지 전부 보이게 되면

개발하는데 불편함을 느낄 수 있기 때문입니다.

(프론트 팀이 이렇게 째려볼 수도 있습니다.)

 

그럴 때 사용하는 것이 @JsonIgnore

import com.fasterxml.jackson.annotation.JsonProperty;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class Users {

    @JsonIgnore
    private Ingeger age;
    
    private String name;
    
}

 

위와 같이 @JsonIgnore를 age 파라미터에 선언해주면

{
	"name" : "gildong"
}

swagger에서 위와 같이 age 파라미터는 사라지게 됩니다.

 

하지만 api에서 Users 에 setAge를 한 후

ObjectMapper에서 제공하는 writeValueAsString or readValue 등의

함수를 이용하게 되는 경우 age 파라미터는 null로 전달이 됩니다.

ObjectMapper란?

Java 객체로 deserialization 하거나 Java 객체를 JSON으로 serialization 할 때 사용하는 Jackson 라이브러리의 클래스입니다.

Users users = new Users();
users.setAge(38);
HashMap newMap = new HashMap();
newMap.put("newMap", users);
String newMapStr = this.objectMapper.writeValueAsString(newMap);

저는 setAge를 다시 해주면 상관이 없을 줄 알았는데

JsonIgnore 속성은 계속 존재하는 듯 보였습니다.

newMapStr = {"name" : "gildong", "age" : null}

심지어 newMap이라는 HashMap에 새롭게 put을 해주었음에도

age 속성은 null로 오게 됩니다.

 

 

    @JsonProperty(access = JsonProperty.Access.READ_ONLY) 
    private Ingeger age;

즉 해당 모델을 직렬화 혹은 역직렬화하는 함수에 사용하기 위해선

@JsonIgnore를 사용하면 안 되고

@JsonProperty(access = JsonProperty.Access.READ_ONLY) 를 선언해주어야 합니다.

 

이렇게 선언을 해주면

setAge을 하고 직렬화 or 역직렬화해도 null로 변환되지 않습니다.