코더가 되고싶은 남자

JAVA Map > vo convert 해쉬 맵 데이터를 vo객체로 변환 2 본문

java

JAVA Map > vo convert 해쉬 맵 데이터를 vo객체로 변환 2

guney 2021. 12. 24. 15:48
반응형

안녕하신가?

 

자바에서 Map > vo로 컨버트 할 수 있는 코드인데 공통 함수로 쓰기 좋을 것이다.

 

1. HashMap -> vo 변환

public class CommonUtils {
    public static <T> T convertVo(Map<String,Object> map, Class<T> vo) throws Exception {
            T obj = null;

            if (ObjectUtils.isEmpty(vo)) {
                throw new Exception("CommonUtils convertVo : vo Class null");
            } else {
                //vo 객체 생성
                obj = vo.getConstructor().newInstance();

                if (MapUtils.isEmpty(map)) {
                    return obj;
                } else {
                    for (Map.Entry<String, Object> entry : map.entrySet()) {
                        //vo 필드 id 추출
                        Field[] field = vo.getDeclaredFields();

                        for (Field v : field) {
                            v.setAccessible(true);      //필드에 접근하기 위해

                            if (null != entry.getValue() && entry.getKey().equals(v.getName())) {

                                try {
                                    Object returnValue  = map.get(v.getName());

    //                                log.info("value : " + entry.getValue());
    //                                log.info("type : " + entry.getValue().getClass() + " : " + v.getType());
    //                                log.info("key : " +  entry.getKey() + " : " + v.getName());

                                    //Map > vo 형 변환 시 BigDecimal은 동적 변환이 안되서 정적변환 (웬만하면 알아서 파싱 할 것 같은데 파싱하다 에러나면 하나씩 추가해줘야함 ㅠㅠ)
                                    if (!entry.getValue().getClass().equals(v.getType()) && String.valueOf(v.getType()).contains("BigDecimal")) {
                                        returnValue = new BigDecimal(String.valueOf(entry.getValue()));
                                    }

                                    v.set(obj, returnValue);    //값이 존재하는 것만 set

                                } catch (Exception e) {
                                    log.info("CommonUtils convertVo Error : " + e.getMessage());
                                }

                            }
                        }
                    }
                }
            }

            return obj;
        }
}

 

호출 하는 법

 

//CommonUtils 클래스 임포트 해주시고 변환할 map객체, vo명칭.class
CommonUtils.convertVo(map, PointSearchVO.class);

 

 

위 코드를 사용하면 단 건으로 변환 할 수 있다.

 

 

2. List<Map<String, Object>> -> List<vo> 로 변환

 

public static <T> List<T> convertVoList(List<Map<String, Object>> list, Class<T> type) throws Exception {
	    if (list == null || list.isEmpty()) {
            return Collections.emptyList();
        }

        List<T> convertList = new ArrayList<>();

        list.stream().filter(el -> !ObjectUtils.isEmpty(el))
                    .forEach(map -> {
                        try {
                            convertList.add(convertVo(map, type));
                        } catch (Exception e) {
                            log.info("CommonUtils convertVoList Error : " + e.getMessage());
                        }
                    });
        
        return convertList;
}

 

리스트로 컨버트 시키고 싶으면 위 함수만 추가해서 사용하면 된다.