본문 바로가기
SPRING

[SPRING] HTTP 요청 데이터 매핑(JSON) - 3

by steadyMan 2022. 3. 13.

클라이언트에서 HTTP 요청을 통해 전달한 HTTP 메시지 바디의 JSON 형식의 데이터를 서버에서

매핑하는 방법에 대해 학습한 내용입니다. 

 

개인적인 학습의 대한 정리 내용입니다.

 

1. ObjectMapper 

HttpServletRequest를 사용하여 HTTP 메시지 바디의 데이터를 읽어,  문자로 변환한 후 

문자 형식의 JSON데이터를 Jackson 라이브러리인 ObjectMapper를 사용하여 자바 객체로 변환한다. 

대상 자바 객체는 필드에 JSON 키 값과 동일한 이름의 필드데이터,  getter,  setter를 가지고 있어야한다. 

@PostMapping("/request-body-json")
public void requestBodyJsonV1(HttpServletRequest request, HttpServletResponse response) throws IOException {
    private ObjectMapper objectMapper = new ObjectMapper();
    ServletInputStream inputStream = request.getInputStream();
    String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);

    log.info("messageBody={}", messageBody);
    HelloData helloData = objectMapper.readValue(messageBody, HelloData.class);
    log.info("username={}, age={}", helloData.getUsername(), helloData.getAge());
    response.getWriter().write("OK");
}

{"username" : "aaa", "age" : 12}의 전송결과

Stream에서 문자로 변환하는 과정을 생략 하려면 @RequestBody를 사용하면 된다. 

@ResponseBody
@PostMapping("/request-body-json")
public String requestBodyJsonV2(@RequestBody String messageBody) throws IOException {
    HelloData data = objectMapper.readValue(messageBody, HelloData.class);
    log.info("username={}, age={}", data.getUsername(), data.getAge());
    return "ok";
}

 

문자로 변환하고 JSON형식의 문자를 다시 JSON으로 변환하는 과정을 생략하고 한번에 객체로 변환 하는 방법은? 

 

2. @RequestBody + 객체 

@ResponseBody
@PostMapping("/request-body-json")
public String requestBodyJsonV3(@RequestBody HelloData data) {
    log.info("username={}, age={}", data.getUsername(), data.getAge());
    return "ok";
}

 

HttpEntity<>, @RequestBody에 자바객체를 지정하면 HTTP 메세지 컨버터가 HTTP 메세지 바디의 내용을 

문자, 객체 등으로 변환한다. 

HTTP 메시지 컨버터는 JSON형식의 데이터도 객체로 변환해주는데 이 때 MappingJackson2HttpMessageConverter가

동작한다.

@RequestBody를 생략할 경우 @ModelAttribute가 적용되기 때문에 생략하면 안된다. 

 

주의!

HTTP 요청시에 content-type이 application/json이여야 한다. 그래야 JSON을 처리할 수 있는 HTTP 메시지 컨버터가 실행된다.

2-1. HttpEntity

@ResponseBody
@PostMapping("/request-body-json")
public String requestBodyJsonV4(HttpEntity<HelloData> httpEntity) {
    HelloData data = httpEntity.getBody();
    log.info("username={}, age={}", data.getUsername(), data.getAge());
    return "ok";
}

HttpEntity의 제네릭에 주입된 객체가 매핑되어 사용가능하다. 

 

응답의 경우 @ResponseBody를 사용하면 해당 객체를 HTTP 메시지 바디에 직접 넣어주며 

리턴 타입이 객체일 경우 HTTP 메세지 컨버터에 의해 JSON으로 응답된다.

댓글