환경: 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
'개발 > java' 카테고리의 다른 글
[java] LocalDateTime, ZonedDateTime, OffsetDateTime (0) | 2024.02.14 |
---|---|
[java] stream.concat, stream.generate (0) | 2024.02.06 |
[getter/setter] 같은 클래스 안의 변수에 접근할 때 (1) | 2024.01.04 |
[map] getOrDefault vs computeIfAbsent (0) | 2023.12.20 |
[pom] http로 repository 연결 (0) | 2023.10.23 |