본문 바로가기

Programming!

json object 상호 변환시 lombok으로 인한 boolean 기본형 오류

오늘 옆 동료분이 restful 관련 json 변환시 boolean에 속성의 한 필드가 이럴경우 저럴경우 오류가 생기고 안생긴다고 한다.

 

대충 보니 이름 문제같은 느낌적인 느낌이 들고, 마침 다른 동료도 해당 이슈에 대해 처리했던 경험을 얘기해 줘서 한번 보기로 함.

 

자 lombok의 @Data 로 생성된 boolean 을 보자.

property를 isResult로 했지만 Lombok에 의해 생성된 메소드는 isResult, setResult이다.

 

 

그럼 그냥 result로 한다면?... 똑같다.

흠.. 이상도 하지.. 그럼 Boolean 타입이라면?

어어... get/set이 is앞에 붙어버린다. is가 없는 경우도 당연히~

즉, @Data를 쓸경우 의도와는 다르게 처리될 수 있기 때문에 꼭 네이밍을 확실히 정해야 한다. 

 

RestController를 통해 기본형 boolean이 json으로 변환될 경우 아래 json처럼 되기 때문에 받는 오브젝트에서는 변환이 안되고 기본값 false가 될 수 있다.

{

    isSoldout : true

}

 

 

ObjectMapper의 처리 방식도 염두해둬야 한다.

받는 쪽 Object에 @Data를 넣고 속성명을 isResult로 하면 json이 'isResult : true' 이든 'result : true' 문제가 없다.

----

@Data

public class ...{

    private boolean isResult;

----

하지만 'result' 로 하면 넘어오는 값은 true이지만 매핑이 되지않아 기본값 false로 지정되어 버린다. 

----

@Data

public class ...{

    private boolean result;

----

 

이게 한번 격고나면 문제와 원인, 처리방법이 자연스럽게 몸에 배어 있게 되는데(그러다 원인과 이유를 까먹음..), lombok 사용을 새롭게 하시는 분들은 한번씩 격는 문제이지 싶다.

 

결론

- @Data 사용시 boolean에 대해 한번 더 생각해보기.

- @Data 를 사용하여 기본형 boolean을 받을 경우, 아래와 같이 @JsonProperty로 json의 속성명을 직접 지정해준다.

@JsonProperty("isResult")

private boolean result;

 

- boolean 을 Boolean으로.

- 뭐 여러가지.