Contents

[Java]@JsonProperty이 왜 동작을 안하지?

Contents

java

class anonymousDTO {
    String whatYouWant;
}

대부분 자바의 변수를 생성할때 위와 같이 CamelCase를 많이 쓰는것으로 알고있습니다…..(본인이 잘못 생각하는것일 수 있습니다.)

필자 또한 위와 같이 camelCase를 사용하였으나 API 통신 및 응답을 리턴할때에는 hyphen uppercase가 필요했습니다.

위의 조건을 충족하기 위해 적절한 어노테이션을 찾았는데, @JsonProperty("{WHAT_YOU_WANT}")였습니다.

json으로 매핑할때 WHAT_YOU_WANT에 들어갈 값으로 해당 프로퍼티를 매핑하는것이였습니다.

테스트 코드를 작성하여 확인해보았지만 정상 동작하지 않아,

주위의 도움을 받았는데, getter메소드에 해당 어노테이션을 작성해야한다는 조언도 있었으며, compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind' 해당 라이브러리를 gradle에 추가하여 jackson 라이브러리를 최신화 할 필요가 있다는 조언을 받았습니다.

java

@Getter
@Setter
class anonymousDTO {
    @JsonProperty("WHAT-YOU-WANT")
    String whatYouWant;
}

java

class anonymousDTO {
    String whatYouWant;
    
    @JsonProperty("WHAT-YOU-WANT")
    public String getWhatYouWant() {
        return this.whatYouWant;
    }
}

많은 주위의 도움을 받아 위와 같이 두가지 방법을적용해 보았으나, 기대하는 결과를 얻을 수 없었습니다. (에러나 Exception은 발생하지 않았으나, 요청에 대한 응답을 모델에 매핑하였으나, Null 값이 해당 프로퍼티에 매핑되었습니다.)

오랜 삽질 끝에 얻은 결과는 제가 요청에 대한 json Object 응답을 Gson을 이용하여 해당타입으로 받았는데, jackson의 json object로 매핑하였고, jackson의 어노테이션인 @JsonProperty가 기대와 다르게 동작하여, 검색하였는데 @SerializedName 어노테이션으로 해결할 수 있다는 StackOverFlow에서의 답변이였습니다.

그리하여 해당 코드를 이와같이 변경하였습니다.

java

@Getter
@Setter
class anonymousDTO {
    @SerializedName("WHAT-YOU-WANT")
    String whatYouWant;
}

Gson을 이용할 때에는 @SerializedName을 사용해야하고 jackson을 사용할때에는 @JsonProperty를 사용해야 한다는데 레거시 PHP와 JS를 좋아하는 저로써는 똑같은 json object 이고, 사실상 JsonObject라는 타입인데, Gson의 json 이냐 jackson의 json이냐에 따라 다른 어노테이션을 써야한다는게 이해하기 어려웠습니다.

지난번, 어노테이션을 사용할때에도 해당 어노테이션이 어떻게 동작하는지 유의를 하며 써야겠다고 다짐했으나, 결국 빠른 결과물과 편리함을 추구하다보니, 많이 사용하는 어노테이션을 그저 가져다 쓰는데에만 중점을 두었습니다.

제가 여태까지 사용해온 레거시 php 나 js는 이와 같은 강타입 언어가 아니다보니, 해당 어노테이션도 없을 뿐만 아니라, 그저 모델 클래스를 만들 필요없이 변수에 담을 수 있었는데, 이러한 부분이 어렵기도 하고, 긍정적인 시각으로 바라보았을때는 어느정도 타입체킹이 되고, 개발자 입장에선 복잡도는 증가하지만, 조금 더 안정적이지 않을까 싶기도 합니다.

물론 제가 다른 대안으로 생각하는 TypeScriptPHP v7.x도 있지만요…