개발/Spring

[Springboot] @JsonProperty는 언제 써야 할까!

joon95 2023. 2. 22. 00:07
반응형

이번에 개발하다가 DB 테이블 컬럼 중 숫자형태의 'A_CNT' 이런 앞에가 짧은 컬럼이 있어서, 늘 하던대로 RequestDTO 에 aCnt 로 작성하고 난 뒤 Post 방식으로 데이터를 보내봤더니 자꾸만 0 이 넘어오는게 아닌가????

 

@JsonProperty

이 때 @JsonProperty를 쓰면된다.(변수가 많다면 @JsonNaming 으로 통합해도 됨)

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Sample {
  @JsonProperty("a_cnt")
  private int aCnt;
}

이렇게 하고 요청할 때 a_cnt 로 던지면 정상적으로 오게된다.

 

추가로 mybatis 에서 camelCase vo를 자동으로 변환해 주는 설정은 아래와 같다.

<setting name="mapUnderscoreToCamelCase" value="true"/>

이렇게 하면 Sample Class에서 카멜케이스 표기법으로 변수를 작성하면 mybatis mapper에서 자동으로 변환된다.

 

[Post Request 스네이크] -> [springboot 카멜] -> [DataBase 스네이크]

 

원인 : 서로 다른 표기법

a_cnt 에 대한 API 요청의 처리가 달랐던 이유는 아래와 같다.

- POST Json : snake_case

- JAVA Entity : camelCase

 

근데 왜 다른건 되고 이것만 안되는 지는 잘 모르겠다. 누가알면 설명좀..

간혹 변환이 안되는 경우라는데...

 

 

스네이크 / 카멜 표기법

스네이크식은 단어가 - 가 아닌 _ 로 연결된다.

ex) my name is joon95 -> my_name_is_joon95

 

카멜식은 첫 단어 소문자, 두번째 단어부터 대문자로 시작하여 단어사이를 붙인다.

ex) my name is joon95 -> myNameIsJoon95

 

표기법은 보통 아래와 같은 사용처를 가지는 것 같다.

사용처 표기법
API snake_case (통신 규격)
DB snake_case
JAVA camelCase, Class 파일만 UpperCase

 

추가로 다른 블로그를 보니

API 에서 Camel Case로 받는 것으로 정의하여 사용하는 케이스도 있다고 하는데

이런 부분은 jackson ObjectMapper를 사용해 데이터를 조작하면 된다고 한다.

ObjectMapper mapper = new ObjectMapper();
Sample sample = mapper.convertValue(params, Sample.class);

 

 

참고

 

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

카멜 케이스 Entity에 스네이크 케이스 Json 데이터를 매핑시키는 방법을 알아보자

velog.io

 

반응형