Backend/JAVA

Java 객체 형변환 (mapper.convertValue)

dddzr 2023. 6. 14. 12:53

자바에서 직접 형변환을 할 수 없는 경우가 있습니다.

 

아래는 예제입니다.

  @RequestMapping(value = "/convertValueTest", method = RequestMethod.POST)
  @ResponseBody
  public HashMap<String, Object> convertValueTest(@RequestBody  Map<String, Object> param, HttpServletRequest request) {
    HashMap<String, Object> result = new HashMap<String, Object>();
    try {
      ObjectMapper mapper = new ObjectMapper();
      TestModel testModel = mapper.convertValue(param.get("testModel"), new TypeReference<TestModel>() {});
      service.convertValueTest(testModel, (String) param.get("option"));
      result.put("result", "Success");
    } catch (Exception e) {
      result.put("result", "Error");
      result.put("message", e.getMessage());
    }

    return result;
  }

위의 코드에서 String인 option의 경우 형변환을 직접 수행했지만

param.get("testModel")은 Object 형식으로 반환되는데, 이를 TestModel으로 형변환하려면 컴파일러가 해당 형식 간의 유효한 형변환 규칙을 파악하고 수행해야 합니다. 그러나 컴파일러는 Object와 TestModel 사이의 상속 또는 인터페이스 구현 관계를 알지 못하기 때문에 직접적인 형변환이 불가능합니다. 이러한 경우에는 명시적인 형변환 연산자인 (TestModel)을 사용할 수 없습니다.

 

mapper.convertValue

mapper.convertValue는 Jackson 라이브러리에서 제공하는 메서드로, Java 객체 간의 변환을 수행합니다. 이 메서드를 사용하면 다른 형식의 객체를 원하는 형식의 객체로 변환할 수 있습니다.

설명을 위해 mapper는 Jackson의 ObjectMapper 객체로 가정하겠습니다.

ObjectMapper mapper = new ObjectMapper();


mapper.convertValue는 다음과 같은 구문을 가지고 있습니다:

public <T> T convertValue(Object fromValue, TypeReference<T> toValueTypeRef)
  • fromValue: 변환할 대상 객체입니다.
  • toValueTypeRef: 변환 결과로 얻고자 하는 객체의 형식을 나타내는 TypeReference입니다.
  • TypeReference는 제네릭 형식에 대한 Type 정보를 보존하는 데 사용됩니다. 일반적으로 제네릭 형식은 컴파일 시에 Type 소거로 인해 Type 정보가 손실되므로, Jackson은 이를 보존하기 위해 TypeReference를 사용합니다.