Java Snake Case & Camel Case Data 변환

Gogh·2023년 8월 18일
1

Java

목록 보기
1/1
post-thumbnail

Object Mapper 활용

  • 외부로 요청하여 응답 받은 JSON 데이터가 Snake Case고, 서버에서 사용하고 있는 객체의 변수는 Camel Case 를 사용하고 있다.

  • 예제 코드는 컨트롤러로 String 타입의 Snake Case JSON 데이터를 받아, ObjectMapper를 사용하여 Camel Case 변수명을 사용하고 있는 객체로 값을 매핑해준다.

    @Controller
    @RequiredArgsConstructor
    @RequestMapping("/sample")
    public class MapperController {
    
        ObjectMapper snakeMapper = new ObjectMapper()
                .setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE);
                
      @PostMapping("/snake")
      public ResponseEntity<?> checkout(
              @RequestBody String data
      ) throws JsonProcessingException {
          PropPaypalOrderDto propPaypalOrderDto = snakeMapper.readValue(data, PropPaypalOrderDto.class);
          return ResponseEntity.ok(propPaypalOrderDto);
      }
  • PropertyNaming 전략을 Snake Case로 설정한 ObjectMapper 객체는, Snake Case 데이터를 받아, Camel Case 변수에 데이터를 바인딩 해주며, 객체 변수의 네이밍 전략이 다른 경우라도 들어오는 데이터가 Snake Case 라면 모두 바인딩 가능하다.

  • 컨트롤러로 데이터 전송(Snake Case JSON 데이터)

  • 응답 데이터(Camel Case JSON 데이터로 변환하여 응답)

  • 아래 코드는 PropertyNamingStrategies 추상 클래스의 일부 코드며, 지원하는 PropertyNaming 전략 변수들을 확인할 수 있다.

    
    public abstract class PropertyNamingStrategies implements Serializable {
        private static final long serialVersionUID = 2L;
        public static final PropertyNamingStrategy LOWER_CAMEL_CASE;
        public static final PropertyNamingStrategy UPPER_CAMEL_CASE;
        public static final PropertyNamingStrategy SNAKE_CASE;
        public static final PropertyNamingStrategy UPPER_SNAKE_CASE;
        public static final PropertyNamingStrategy LOWER_CASE;
        public static final PropertyNamingStrategy KEBAB_CASE;
        public static final PropertyNamingStrategy LOWER_DOT_CASE;
    
        .................

Jackson 라이브러리 활용

  • jackson 라이브러리를 활용하여 어노테이션 기반으로 데이터를 변환 해줄수 있다
  • @JsonProperty 는 하나의 변수 단위에 Naming을 지정해 준다.
  • @JsonNaming 은 클래스 단위에 Naming 전략을 지정한다.
@Slf4j
@RequestMapping("/checkout")
@RequiredArgsConstructor
@RestController
public class CheckoutController {

    @PostMapping
    public ResponseEntity<?> checkout(
            @RequestBody OrderDto orderDto
    ) throws Exception {
        CreateOrderResponseDto orderResponse = orderService.createOrder(orderDto);
        return ResponseEntity.ok(orderResponse);
    }
}

// OrderDto.java (@JsonProperty 사용)
@Data
public class OrderDto implements Serializable {

    private OrderIntent intent;

    @JsonProperty("purchase_units")
    private List<PurchaseUnit> purchaseUnits;

    @JsonProperty("application_context")
    private PaypalAppContextDto applicationContext;

}

// OrderDto.java (@JsonNaming 사용)
@Data
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public class OrderDto implements Serializable {

    private OrderIntent intent;

    private List<PurchaseUnit> purchaseUnits;

    private PaypalAppContextDto applicationContext;

}
  • 요청 데이터(Snake Case JSON)

  • 정상 응답

  • OrderDto.java @JsonNaming & @JsonProperty 두 가지 경우 모두 정상 응답을 확인 할 수 있으며, Snake Case 데이터가 CamelCase 객체 변수로 바인딩 되는것을 확인 할 수 있다
profile
컴퓨터가 할일은 컴퓨터가

2개의 댓글

comment-user-thumbnail
2023년 8월 18일

정리가 잘 된 글이네요. 도움이 됐습니다.

답글 달기
comment-user-thumbnail
2023년 8월 22일

오….

답글 달기