2022.10.08 - [분류 전체보기] - [사이드프로젝트] Oauth 회원가입 및 로그인 - 카카오
Request, Response 및 Dto 객체를 이용하여 응답을 내려주면서, 객체에 lombok 어노테이션을 잊어버려서 에러가 나는 경우가 종종 있었다.
그럴때마다 그냥 getter, setter를 넣어줬었는데, 한번 정확히 알고 넘어가야할 것 같아서 정리하게 되었다.
용어
- unmarshal == deserialize == json to object
- marshal == serialize == object to json
Serializable
- Public 필드
- Getter
Deserializable
- Public 필드
- Getter
- Setter
Public 필드로는 대부분 선언을 안하니, 역직렬화만 필요한 경우에는 Setter를 하고, 나머지 경우에는 Getter만 넣으면 된다.
@JsonIgnoreProperties(value = { "field" })
Serialize / Deserialize 될 때, 내보내지 않을 필드 설정 → class 레벨의 annotation
@JsonIgnoreProperties(value = { "intValue" })
public class MyDto {
private String stringValue;
private int intValue;
private boolean booleanValue;
public MyDto() {
super();
}
// standard setters and getters are not shown
}
@JsonIgnore
Serialize / Deserialize 될 때, 내보내지 않을 필드 → field 레벨 annotation
public class MyDto {
private String stringValue;
@JsonIgnore
private int intValue;
private boolean booleanValue;
public MyDto() {
super();
}
// standard setters and getters are not shown
}
아래와 같이 getter setter에 따로 명시하여, Serialize 시 / Deserialize 시 다르게 설정할 수 있다.
@JsonIgnore
public String getPassword() {
return password;
}
@JsonProperty
public void setPassword(String password) {
this.password = password;
}
그런데 @JsonIgnore 를 봐보니 아래와 같은 설명이 있었다.
NOTE! As Jackson 2.6, there is a new and improved way to define `read-only` and `write-only` properties,
using JsonProperty.access() annotation:
this is recommended over use of separate JsonIgnore and JsonProperty annotations.
설명대로 access level를 직접 명시하여, read, write, read-write, auto 를 설정하여 더 직관적으로 사용할 수 있다.
public class MyDto {
private String stringValue;
@JsonProperty(access = Access.WRITE_ONLY)
private int intValue;
private boolean booleanValue;
...
}
@JsonIgnoreType
Serialize / Deserialize 될 때, 항상 제외할 class
@JsonIgnoreType
public class SomeType { ... }
@JsonInclude
empty, null, default value를 제외할지 여부
@JsonInclude(Include.NON_NULL) // NULL이 아닌 값만 포함한다
public class MyBean {
public int id;
public String name;
}
@JsonFormat
Date나 Time을 Serialize할 때, 표현될 포맷 설정
public class EventWithFormat {
public String name;
@JsonFormat(
shape = JsonFormat.Shape.STRING,
pattern = "dd-MM-yyyy hh:mm:ss")
public Date eventDate;
}
https://www.baeldung.com/jackson-field-serializable-deserializable-or-not