요청 메시지 바디 처리

wangjh789·2022년 8월 7일
0

[Spring] 스프링-mvc-1

목록 보기
13/15

InputStream

말 그대로 단순하게 body에 있는 데이터를 stream으로 받는 방법

	@PostMapping("/request-body-string-v1")
    public void requestBodyStringV2(InputStream inputStream, Writer writer) throws IOException {
        String body = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
        log.info("messageBody = {}", body);
        writer.write("ok");
    }

HttpEntity

스프링의 http message converter가 요청메시지의 HttpEntity를 가져온다.

    @PostMapping("/request-body-string-v2")
    public HttpEntity<String> requestBodyStringV3(HttpEntity<String> httpEntity){
        String body = httpEntity.getBody();
        log.info("body = {}",body);
        return new HttpEntity<>("ok");
    }

HttpEntity<String> 으로 자료형을 명시하면 메시지 바디에 있는 데이터를 자료형에 따라 가져온다.
HtppEntity는 헤더, 바디 정보를 편리하게 조회할 수 있는 객체이고 메시지 바디를 직접 조회할 수 있다. (요청 파라미터와는 전혀 상관없다, 전혀 다른 메커니즘)

httpEntity를 상속받아 기능을 확장한 RequestEntity, ResponseEntity가 있다.

@RequestBody

	@PostMapping("/request-body-string-v4")
    public String requestBodyStringV4(@RequestBody String messageBody){

        log.info("messageBody = {}", messageBody);
        return "ok";
    }

마찬가지로 HttpMessageConverter를 사용한다.

스프링은 메서드 파라미터에 어노테이션이 생략되면 다음과 같은 규칙을 적용한다.

  • 기본형 : @RequestParam
  • 나머지 : @ModelAttribute (argumentResolver로 지정해둔 타입 외)
    위 두가지 모두 쿼리파라미터를 바인딩 하는 방법, 그러므로 메시지 바디에 접근하기 위해선 @RequestBody를 생략하면 안 된다.

HttpMessageConverter

요청 메시지에 따라 적절한 HttpMessageConveter가 선택되어 수행된다.
content-type : application/json => MappingJackson2HttpMessageConveter
Json요청 -> Http 메시지 컨버터 -> 객체

Accept-type : application/json => MappingJackson2HttpMessageConveter
객체 -> Http 메시지 컨버터 -> Json 응답

profile
기록

0개의 댓글