[SPRINGBOOT] ObjectMapper

728x90

자바에서 ObjectMapper 클래스는 타입을 문자열로 변환하거나 문자열을 타입으로 변환시켜주는 클래스입니다.

이를 직렬화, 역직렬화라고합니다.

스프링 또는 스프링부트에서 API방식으로 코드를 작성하면 이러한 직렬화 방식이 필요합니다. 

왜냐하면 자바의 기본타입에는 자바스크립트의 객체형태나 파이썬의 딕셔너리 형태인 json타입이 존재하지 않기 때문입니다. 따라서 자바에서는  {"key":value} 형태로 데이터를 담은 다음 문자열로 바꿔서 전송합니다. 즉 전송은 "{"key":value}" 로 보낸다고 생각하시면 됩니다. 물론 "{"key":value}" 형태로 직접 전송하는 방법도 있습니다. 그러나 이러한 방법은 코드가 길어지거나 객체를 활용할때는 불편한 부분이 있습니다.

1. 직렬화

첫번째 방법은 문자열로 전송하는 방식입니다.

@ResponseBody
@GetMapping("/test/{uid}")
public String deleteProduct(@PathVariable("uid") int uid,HttpSession session) throws Exception{
    String m_id = (String) session.getAttribute("m_id");
    productService.test(uid,m_id);
    return "{\"status\":\"success\",\"content\":\"삭제되었습니다.\"}";
}

 

 

두번째 방법은 ObjectMapper로 직렬화에서 전송하는 방법입니다.

@ResponseBody
@GetMapping("/test/{uid}")
public String deleteProduct(@PathVariable("uid") int uid,HttpSession session) throws Exception{
    String m_id = (String) session.getAttribute("m_id");
    productService.test(uid,m_id);
    Map<String,Object> map = new HashMap<>();
        ObjectMapper objectMapper = new ObjectMapper();
        map.put("status","success");
        map.put("content","삭제되었습니다.");
        return objectMapper.writeValueAsString(map);
}

 

 

프로그램을 실행해보면 동일한 결과를 반환합니다.

그러나 첫번째 예제를 보면 문자열안에 문자열을 넣기위해서 이스케이프를 사용합니다. 이 때 value값이 문자열이 아니라면 이스케이프를 사용하지 않아야합니다. 그리고 만약 value값또한 객체가 된다면 문자열 전송방식은 더 복잡해집니다.

따라서 ObjectMapper를 사용하는 방식이 더 간편합니다.

 

2. 역직렬화

클라이언트나 타 서버에서 자바서버로 api호출을 할때 GET방식이 아닌 다른 방식으로 전송을 한다면 메시지 본문에 json타입을 직렬화해서 전송합니다. 스프링부트에서는 이를 받을 때 @RequestBody 애노테이션으로 받을 수 있으면 타입은 JsonNode타입으로 받을 수 있습니다.

이때 ObjectMapper를 활용한다면 key,value를 가진 객체로 변환시킬 수 있습니다.

 

예를 들어 살펴보겠습니다.

@PatchMapping("/v1/craw-data")
@Transactional
public String test2(@RequestHeader("Authorization") String api_key,
                    @RequestBody JsonNode productList) throws Exception{
    	ObjectMapper objectMapper = new ObjectMapper();
        try {
            for (JsonNode product : productList) {
                ResponseData data = objectMapper.convertValue(product, ResponseData.class);
                System.out.println(data);
            }
            map.put("status", "success");
        } catch (Exception e) {
            e.printStackTrace();
            map.put("status", "fail");
            map.put("reason", e.getMessage());
        }

        return objectMapper.writeValueAsString(map);
    
}

 

위 코드를 보시면 JsonNode 타입으로 전달받은 값을 반복문을 통해 ObjectMapper로 ResponseData클래스의 객체로 변환시킨 것을 확인할 수 있습니다. 

 

ResponseData.class

@Data
public class ResponseData {

    private String key1;
    private String key2;
}

 

 

이렇게 ObjectMapper를 사용하면 REST방식으로 코드를 쉽게 작성할 수 있습니다.