-
Jackson Object Mapper 사용시 UPPER_SNAKE_CASE to camelCase 변환JAVA 2023. 8. 16. 19:45
교육청(neis) API를 호출하여 학교 정보를 조회하고있다.
교육청 API의 응답값은 대문자 + 스네이크 케이스(UPPER_SNAKE_CASE)로 내려온다.
{ "ATPT_OFCDC_SC_CODE":"B10", "ATPT_OFCDC_SC_NM":"서울특별시교육청", "SD_SCHUL_CODE":"7081450", "SCHUL_NM":"서울신곡초등학교", "ENG_SCHUL_NM":"Seoul Sin-gok Elementary School", "SCHUL_KND_SC_NM":"초등학교", "LCTN_SC_NM":"서울특별시", "JU_ORG_NM":"서울특별시강서양천교육지원청", "FOND_SC_NM":"공립", "ORG_RDNZC":"07731 ", "ORG_RDNMA":"서울특별시 강서구 등촌로13자길 42-14", "ORG_RDNDA":"(화곡동/신곡초등학교)", "ORG_TELNO":"02-2643-2248", "HMPG_ADRES":"http://sg.sen.es.kr", "COEDU_SC_NM":"남여공학", "ORG_FAXNO":"02-2643-6533", "HS_SC_NM":" ", "INDST_SPECL_CCCCL_EXST_YN":"N", "HS_GNRL_BUSNS_SC_NM":"일반계", "SPCLY_PURPS_HS_ORD_NM":null, "ENE_BFE_SEHF_SC_NM":"전기", "DGHT_SC_NM":"주간", "FOND_YMD":"19830617", "FOAS_MEMRD":"19841022", "LOAD_DTM":"20230615 " },
해당 응답값을 School이라는 도메인을 만들어서 매핑하기 위해
Jackson의 ObjectMapper의 treeToValue 를 사용했다.
필드 값이 많기때문에 한번에 맵핑시켜줄수있는 이점이 있어 사용했다.
ObjectMapper mapper = new ObjectMapper(); mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true); School school = mapper.treeToValue(bodyNode, School.class);
이렇게하게 되니 school의 각 요소값이 모두 null로 맵핑이 되었다.
그래서 검색해보니
@JsonNaming(UpperSnakeCaseStrategy.class) 를 사용하면 된다고했다.
@Getter @Setter @ToString @JsonIgnoreProperties(ignoreUnknown = true) // 맵핑시 dto에 없는 key이 있더라도 오류 무시 @JsonInclude(JsonInclude.Include.NON_NULL) // //null인 데이터를 제외하고 json 생성 @JsonNaming(UpperSnakeCaseStrategy.class) public class School { private String atptOfcdcScCode; // 시도 교육청 코드 private String atptOfcdcScNm; // 시도 교육청 명 private String sdSchulCode; // 표준학교코드 private String schulNm; // 학교명 private String engSchulNm; // 영문학교명 private String schulKndScNm; // 학교종류명 private String lctnScNm; // 소재지명 private String juOrgNm; // 관할조직명 private String fondScNm; // 설립명 private String orgRdnzc; // 도로명우편번호 private String orgRdnma; // 도로명주소 private String orgRdnda; // 도로명상세주소 private String orgTelno; // 전화번호 private String hmpgAdres; // 홈페이지 private String coeduScNm; // 남녀공학구분명 private String orgFaxno; // 팩스번호 private String hsScNm; // 고등학교구분명 private String indstSpeclCccclExstYn; // 산업체특별학급존재여부 private String hsGnrlBusnsScNm; // 고등학교일반실업구분명 private String spclyPurpsHsOrdNm; // 특수목적고등학교계열명 private String eneBfeSehfScNm; // 입시전후기구분명 private String dghtScNm; // 주야구분명 private String fondYmd; // 설립일자 private String foasMemrd; // 개교기념일 private String loadDtm; // 수정일 }
맵핑은 된다.
하지만 필드의 모든 값들이 UPPER_SNAKE_CASE로 변경이 되어 리턴된다.
구글에서 다들 이렇게 하라고하는데, 필드명이 바뀌면 안되잖아~~~
mapper에 setPropertyNamingStrategy(PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);
해준다.
ObjectMapper mapper = new ObjectMapper(); mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true) // UPPER_SNAKE_CASE to camelCase mapper.setPropertyNamingStrategy(PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);
그러면 매핑도 되면서, 원하는 camelCase로 필드가 보여진다.
참고 : https://stackoverflow.com/questions/9533227/specifying-the-field-naming-policy-for-jackson
'JAVA' 카테고리의 다른 글