@JsonNaming이 무엇일까 (feat. jsonnaming snakecasestrategy deprecated 해결)

byeol·2023년 4월 12일
0

위와 같은 문제가 발생했습니다.
snakecasestrategy deprecated로 인해서 중간에 줄이 그어졌습니다.

해결하기 전에 어노테이션과 snake case가 무엇인지 정리해보려고 합니다.

그리고 @JsonNaming의 의미와 deprecated에 대한 해결방법을 정리하겠습니다.


변수 네이밍 방식

프로그래밍에서 변수명을 표현할 때 공백을 어떻게 메우는지에 따라 용어가 구분되어 있습니다.

변환 전 : My Visitor Count

변환 후

  • Camel Case(낙타의 쌍봉과 같이 첫문자 제외 대문자) : myVisitorCount
  • Kebab Case : my-visitor-count
  • Snake Case : my_visitor_count or MY_VISITOR_COUNT
  • Pascal Case : MyVisitorCount

@JsonNamging과 @JsonProperty

POST API와 PUT API를 사용할 때 Json을 통해 RequestBody를 받게 됩니다.
문제는 Json에서는 Snake Case방식을 사용하고
Java에서는 Camel Case 방식을 사용한다는 것
입니다.
이렇게 변수 네이밍 방식이 다를 경우 Java에서는 Json으로 데이터를 보내거나 받을 때 제대로 받지 못하는 문제가 발생합니다.
이를 해결해주는 것이 @JsonNaming과 @JsonProperty라는 어노테이션입니다.

  • Java의 DTO는 아래와 같습니다
# UserDto.java
private String name;
private int age;
private List<CarDto> carList;
# CarDto.java
private String name;
private String carNumber;
  • Json에서 아래와 같이 RequestBody를 보냅니다.
{
    "name" : "steve",
    "age" : 20,
    "car_list" : [
        {
            "name" : "BMW",
            "car_number" : "11가 1234"
        },
        {
            "name" : "A4",
            "car_number" : "22가 3456"
        }
    ]
}
  • 실제로 Server에서 받게되는 값을 아래와 같습니다.
    변수 네이밍 방식이 달라서 제대로 데이터를 가지고 오지 못했습니다.
name='steve',
age=20,
carList=null

해결방법

  • @JsonProperty

    하나의 변수를 네이밍 해줄 때 사용합니다.
@JsonProperty("car_number")
private String carNumber;
  • @JsonNaming

    새로 네이밍할 개수가 많다면 변수마다 @JsonProperty를 선언하기는 너무 귀찮습니다. 따라서 @JsonNaming을 통해서 클래스 전체 멤버 변수를 네이밍 할 수 있습니다.
@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)
public class UserDto {
    private String name;
    private int age;
    private List<CarDto> carList;

jsonnaming snakecasestrategy deprecated 해결

stack overflow를 통해서 해결방법을 찾았습니다.

reference

https://stackoverflow.com/questions/74714449/alternatives-for-propertynamingstrategy-snake-case-or-propertynamingstrategy-sna

https://velog.io/@zz1996zz/JsonProperty-JsonNaming

profile
꾸준하게 Ready, Set, Go!

0개의 댓글