[Spring] 스네이크 케이스로 받은 JSON 데이터를 객체 내 케멀케이스 변수에 매핑시키는 방법은 무엇일까?

huihui·2021년 4월 11일
0

@JsonNaming, @JsonProperty의 사용법을 소개하기에 앞서 사용할 코드를 작성하도록 하자.

json으로 넘어오는 값이 아래와 같다고 가정하자.

{
    "my_name": "kevin",
    "my_age": 20,
    "my_country": "korea"
}

자바 Entity는 다음과 같다고 가정하자.

@Data
public class Student {
    
    private String myName;
    private String myAge;
    private String myCountry;
    
}

컨트롤러는 다음과 같다.


@RestController
@RequestMapping("/api")
public class StudentController {
    
    public void post(@RequestBody Student student) {
        System.out.println(student);
    }
}

POST로 넘어오는 JSON 데이터는 스네이크 케이스로 이루어져 있는 반면에 자바 엔티티는 케멀 케에스로 이루어져 있다.
이러한 경우에는 컨트롤러 단에서 JSON 데이터와 자바 엔티티를 매핑시켜준다고 해도 Key가 일치하지 않아 값을 제대로 받아올 수 없다.

그래서 이를 해결하기 위해 @JsonProperty, @JsonNaming을 사용하고자 한다.
사용하기 위해 Jackson 라이브러리를 사용해야 하는데 com.fasterxml.jackson.core 패키지를 maven dependencies에 주입하면 된다.

@JsonProperty

@JsonProperty를 사용하여 key를 매핑시켜줄 수 있다.

@Data
public class Student {
    
    @JsonProperty("my_name")
    private String myName;
    
    @JsonProperty("my_age")
    private String myAge;
    
    @JsonProperty("my_country")
    private String myCountry;
    
}

위처럼 각각 @JsonProperty를 붙여주면 된다.

그런데 만약 필드가 30개 이상만 되어도 코드가 엄청 길어질 우려가 있다.
이럴 때 사용하는 것이 @JsonNaming이다.

@JsonNaming

@Data
@JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class)
public class Student {
    
    private String myName;
    private String myAge;
    private String myCountry;
    
}

위처럼 아예 class에 어노테이션을 붙여주면 매핑이 제대로 된다.

0개의 댓글