Back-end/Spring

[Springboot] 카멜케이스로 코드를 작성했는데 스네이크케이스로 요청이 온다면? (@JsonProperty, @JsonNaming)

Nellie Kim 2024. 7. 12. 17:50
728x90

카멜케이스로 코드를 작성했는데 스네이크케이스로 요청이 온다면 어떻게 할까? 

 

Jackson 라이브러리에서 제공하는 ObjectMapper 객체는 어노테이션으로 @JsonProperty와 @JsonNaming 을 제공해준다.

Snake Case 데이터를 받아, Camel Case 변수에 데이터를 바인딩 해준다. 

 

스네이크케이스 말고도, 케밥케이스 등 많은 데이터와 매핑하는 기능을 제공한다. 

 

예제로 실습을 해보자.

 

컨트롤러

  @PostMapping("/test/test")
  public TestDto testTest(@RequestBody TestDto testDto) {
      return testDto;
  }

 

포스트맨 요청

스네이크 케이스로 데이터를 post한다.

post) http://localhost:8080/api/member/test/test

{
    "test_data": "test~",
    "test_data2":"test2~~"
}

@JsonNaming을 붙이기 전과 후다. 붙이기 전에는 매핑이 되지 않고 null로 반환된다.

이렇게 필드 하나하나 수동으로 지정해도 된다.

 

 

TestDto

매핑하려는 Dto는 카멜케이스로 작성되어 있다. 

@Data
public class TestDto {
    private String testData;
    private String testData2;
}

 

 

포스트맨 호출을 하니 당연히 매핑이 안되고 null 이 나온다.

 

@JsonNaming

 

이제 objectMapper가 제공하는 @JsonNaming 어노테이션을 사용해보자.

@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) 

 

이 한 줄만 Dto 위에 붙여주면 스네이크 케이스로 요청이 와도 알아서 다 매핑이 된다!  

import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.Data;

@Data
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) // 🎯 이거 한줄만 붙여주면 된다!!
public class TestDto {
    private String testData;
    private String testData2;
}

 

@JsonNaming 으로 성공적으로 매핑이 되었다.

 

@JsonProperty

@JsonProperty를 사용하여 key를 매핑시켜줄 수 있다. 이렇게 하면 코드가 길어질 우려가 있어서 @JsonNaming 쓰는 것을 추천한다!

@Data
//@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public class TestDto {
    @JsonProperty("test_data") // 🎯 추가
    private String testData;
    @JsonProperty("test_data2") // 🎯 추가
    private String testData2;
}