스프링/3. 스프링 MVC

45. HTTP API JSON

sdafdq 2023. 8. 12. 21:28

 

@Slf4j
@Controller
public class RequestBodyJsonController {
    private ObjectMapper objectMapper = new ObjectMapper();

    @ResponseBody
    @PostMapping("/request-body-json-v1")
    public String requestBodyJsonV1(HttpServletRequest request, HttpServletResponse response) throws IOException {
        InputStream ip = request.getInputStream();
        String messageBody = StreamUtils.copyToString(ip, StandardCharsets.UTF_8);
        HelloData helloData = objectMapper.readValue(messageBody,HelloData.class);

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

        log.info("name={}, age={}",helloData.getUsername(), helloData.getAge());
        return "ok";
    }

    @ResponseBody
    @PostMapping("/request-body-json-v3")
    public String requestBodyJsonV3(HttpEntity<HelloData> entity) {
        HelloData helloData = entity.getBody();
        log.info("name={}, age={}",helloData.getUsername(), helloData.getAge());
        return "ok";
    }

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

    @ResponseBody
    @PostMapping("/request-body-json-v5")
    public HelloData requestBodyJsonV5(@RequestBody HelloData helloData) {
        log.info("name={}, age={}",helloData.getUsername(), helloData.getAge());
        return helloData;
    }
}

json 전용 라이브러리 객체인 ObjectMapper 이용한다.

먼저 똑같이 그냥 String 형식으로 만들고 받아서, objectMapper를 이용한다.

objectMapper.readValue(String형식의 json 데이터, 변화할 대상의 클래스)

 

 

@RequestBody는 아예 바디를 받는 것이다. 

HttpEntity라는 컨버터를 이용해 받는 것이다. String이니 HttpEntity라는 컨버터로 String으로 변환시켜준다.

v3보면 알 수 있듯이 지정한 유형으로 변화시켜준다.

 

그래서 @RequestBody HelloData helloData도 변화시켜 주는거다. HttpEntity<HelloData>와 같다.

 

@RequestBody가 

바디(json) -> Http메시지컨버터(HttpEntity) -> 객체였다면

@ResponseBody는

객체 -> Http메시지컨버터 -> 바디(json)이다.

 

참고로,

    @ResponseBody
    @PostMapping("/request-body-json-v5")
    public HelloData requestBodyJsonV5(HelloData helloData) {
        log.info("name={}, age={}",helloData.getUsername(), helloData.getAge());
        return helloData;
    }

그냥 이런 식으로 하는 건 바디를 읽는게 아니다.

저렇게 하면 Get url 파라미터나 form을 통한 파라미터만 읽는다. 그게 기본값이다.

그래서 바디를 읽을 때는 @RequestBody로 해줘야 한다.

'스프링 > 3. 스프링 MVC' 카테고리의 다른 글

47. HTTP API  (0) 2023.08.13
46. 정적 리소스, 뷰 템플릿  (0) 2023.08.13
44. HTTP API  (0) 2023.08.12
43. ModelAttribute  (0) 2023.08.12
42. 스프링으로 파라미터 꺼내기  (0) 2023.08.12