본문 바로가기

카테고리 없음

[사이드프로젝트] Jackson

728x90

2022.10.08 - [분류 전체보기] - [사이드프로젝트] Oauth 회원가입 및 로그인 - 카카오

 

[사이드프로젝트] Oauth 회원가입 및 로그인 - 카카오

2022.10.01 - [분류 전체보기] - [사이드프로젝트] 프로젝트 설정 - CloudWatch / EC2 배포 [사이드프로젝트] 프로젝트 설정 - CloudWatch / EC2 배포 2022.09.29 - [분류 전체보기] - [사이드프로젝트] 프로젝트..

juna-dev.tistory.com

Request, Response 및 Dto 객체를 이용하여 응답을 내려주면서, 객체에 lombok 어노테이션을 잊어버려서 에러가 나는 경우가 종종 있었다.

그럴때마다 그냥 getter, setter를 넣어줬었는데, 한번 정확히 알고 넘어가야할 것 같아서 정리하게 되었다.

용어

  • unmarshal == deserialize == json to object
  • marshal == serialize == object to json

Serializable

  1. Public 필드
  2. Getter

Deserializable

  1. Public 필드
  2. Getter
  3. 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

 

Jackson - Decide What Fields Get (De)Serialized | Baeldung

How to control which fields get serialized/deserialized by Jackson and which fields get ignored.

www.baeldung.com

 

728x90