[Springboot] @JsonProperty는 언제 써야 할까!
이번에 개발하다가 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);
참고