반응형

환경: springboot 2.7, java11

현 상황: 외부 api가 아래와 같은 json으로 전달될 때 서버에서 해당 값을 받아서 내려야 함

    "isBan": true,
    "isPaidUser": false,

 

1.  primitive + is~ + no jsonproperty

private boolean isPaidUser;

private boolean isBan;

////// getter/setter모양

 public boolean isPaidUser() {
      return isPaidUser;
    }

    public void setPaidUser(boolean paidUser) {
      isPaidUser = paidUser;
    }

    public boolean isBan() {
      return isBan;
    }

    public void setBan(boolean ban) {
      isBan = ban;
    }

결과

: 옳지 않은 값 반환

 

2. wrapper + no is + no jsonproperty

private Boolean isPaidUser;

private Boolean ban;

////// getter/setter모양

   public Boolean getPaidUser() {
      return isPaidUser;
    }

    public void setPaidUser(Boolean paidUser) {
      isPaidUser = paidUser;
    }

    public Boolean getBan() {
      return ban;
    }

    public void setBan(Boolean ban) {
      this.ban = ban;
    }

: null 반환

 

3. wrapper + is~ + no jsonproperty

  private Boolean isPaidUser;

  private Boolean isBan;
  
////// getter/setter모양

  public Boolean getPaidUser() {
    return isPaidUser;
  }

  public void setPaidUser(Boolean paidUser) {
    isPaidUser = paidUser;
  }

  public Boolean getBan() {
    return isBan;
  }

  public void setBan(Boolean ban) {
    isBan = ban;
  }
}

: wrapper class 사용 시 jsonproperty 없어도 알맞은 값 반환, 그 이유는 boolean의 경우 자동으로 is를 자동으로 삭제하여 판단하기 때문 getter/setter 생김새 참고

 

4. primitive + is ~ + with jsonproperty

@JsonProperty("isPaidUser")
private boolean isPaidUser;

@JsonProperty("isBan")
private boolean isBan;

////// getter/setter모양

//자동 생성
    public boolean isBan() {
      return isBan;
    }

    public void setBan(boolean ban) {
      isBan = ban;
    }
    
// jackson lib에서 사용하는 getter
    public boolean getIsBan(){
      return isBan;
    }

: JsonProperty를 사용하게 되면 설정한 IsBan의 함수를 찾아서 내리고

@Getter로 자동생성된 isBan에서 ban이 추가적으로 내려옴??? 왜 이놈만 두 번 내려올까..

=> 정확한 원리는 모르겠음

 

5. primitive + is~ + getter override

private boolean isPaidUser;
private boolean isBan;

////// getter/setter모양

    public boolean getIsBan() {
      return isBan;
    }

    public boolean getIsPaidUser() {
      return isPaidUser;
    }

: getter를 getIs~ 로 작성해주면 해결

 

6. primitive + no is + with jsonproperty

@JsonProperty("isPaidUser")
private boolean paidUser;

@JsonProperty("isBan")
private boolean ban;

: set할 때는 paidUser를 찾아 세팅하고 내릴 때는 자동 생성되는 getter사용

: 해결

 

정리

When using Jackson for JSON serialization and deserialization, it recognizes this convention and automatically maps it to the property name without the "is" prefix.

If you annotate a getter method with @JsonProperty, Jackson will use the annotated method as the getter for that property.

 

json의 isEnable 값을 기본적으로는 enable 값에 꽂음

enable -> getter 사용해서 내림..

아직 완벽하게 이해한게 아니라 좀 더 보완해야 한다..

 

결론

1. Wrapper class

  • is~ 로 필드명 주기

2. primitive type

  • is 없이 필드명 주고 JsonProperty 사용하기
  • is 로 필드명 주고 getIs~로 getter override
728x90
반응형

+ Recent posts