본문 바로가기

Back-End

Class To Map, Map To Class 변환하는 함수를 만들어 보자!

Class To Map, Map To Class 변환하는 공통 메서드 만들기!!

개요

현재 유지 보수를 하는 소스가 java 1.7을 사용함으로 람다식은 제외하고
제네릭을 통해서 공통으로 Class To Map, Map To Class 가능한 소스를 만들어 볼까 한다.
다음번에는 람다를 이용해서 좀더 좋은 소스 코드를 짜볼 수 있을지 고민해 보겠다.

Map To Class

  • 우선 User라는 클래스를 생성한다.이 클래스를 이용해서 Map으로 변경하고 다시 Class(Dto or Vo)로 변경할 예정이다.
public class User { String id = ""; String name = ""; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getId() { return id; } public void setId(String id) { this.id = id; } }

간단하게 Jackson Lib를 이용하여 구현이 가능하다.

  • Maven 설정 추가

      <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.6.3</version>
      </dependency>

    그레이들등을 사용하신다면 검색 고고 ~!

Class To Map : Java Code 부분

    public <S> S 클래스를맵으로변경(Object obj, Class<S> type2) {
        com.fasterxml.jackson.databind.ObjectMapper oMapper = new com.fasterxml.jackson.databind.ObjectMapper();
        S s = oMapper.convertValue(obj, type2);
        return s;
    }

실행 구분

User user = new User();
user.setId("whydda");
user.setName("변진환");

Map<String, String> map1 = 클래스를맵으로변경(user, Map.class);

System.out.println(map1.get("id"));
System.out.println(map2.get("name"));

//result
whydda
변진환

Map To Class : Java Code 부분

  • jackson lib를 사용하여 구현해 보려 했지만 오류가 발생 하였다.
    Stackoverflow를 보니 BeanUtils를 이용하면 jackson 보다 속도가 좋다고 해서
    BeanUtil을 사용하여 구현 하였다.

      public <T> T 맵을클래스으로변경(Map map, Object o, Class<T> t){
          try {
              BeanUtils.populate(o, map);
          } catch (IllegalAccessException e) {
              e.printStackTrace();
          } catch (InvocationTargetException e) {
              e.printStackTrace();
          }
          return (T) o;
      }

    다음에는 java8을 응요해서 구현해 보도록 하겠다.
    :)

  • 참고링크

    Convert a Map<String, String> to a POJO