하나의 가정을 들어보겠습니다.
프론트팀에게 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로 변환되지 않습니다.
'JAVA > JAVA' 카테고리의 다른 글
[JAVA] 리눅스 자바 설치 위치 찾는 방법 (how to find real installed java path) (0) | 2023.02.05 |
---|---|
[Error] Keycloak The method getLocation() is undefined for the type Response (Eureka com.sun.jersey - jsr311-api 관련) (0) | 2023.01.27 |
[Error] Unrecognized field "xml 필드명" (0) | 2023.01.18 |
[JAVA][면접 질문] StringBuilder, StringBuffer 의 차이 (0) | 2022.04.14 |
[JAVA][ERROR] String cannot be cast to Integer (0) | 2022.02.18 |