ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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

Designed by Tistory.