본문 바로가기
Back-end/Spring MVC 개념

15. Request - message Body 조회방법

by devraphy 2022. 3. 15.

0. 개요

- 이전 포스팅에서 Request parameter를 조회하는 방법에 대해서 알아보았다.

 

- Request Body는 Client가 POST method를 사용한 요청에서 사용된다.

- POST 방식을 사용한 요청은 HTTP message body에 데이터를 담아 Server에게 전달한다.

- 이때 데이터는 JSON 형식으로 작성되는 것이 일반적이다.

 

- 이번 포스팅에서는 Server 측에서 Reqeust Body를 조회하는 방법에 대해 알아보자.


1. HttpServlet

- HttpServletRequest를 통해 Request Body를 조회하는 방법을 알아보자.

@Slf4j
@Controller
public class RequestBodyController {

    @PostMapping("/requestbody/servlet")
    public void usingHttpServlet(HttpServletRequest request, HttpServletResponse response) throws IOException {

        ServletInputStream inputStream = request.getInputStream();
        String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);

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

        response.getWriter().write("request body using Servlet");

    }
}

- Client가 Request body를 전달할 때에는 반드시 POST 방식을 사용해야 한다.

- 그러므로 Server 측에서 요청을 받을 때 POST 방식의 요청만을 허용하도록 @PostMapping을 설정한다.

 

- POST 방식으로 들어오는 요청이기 때문에 getParameter() 또는 getParameterValues()를

   사용하여 데이터를 읽을 수 없다.

  → POST 방식은 URL parameter 형식이 아닌 JSON 형식으로 데이터가 전달되기 때문이다. 

 

- Servlet을 이용하여 Request body를 받을 때에는 getInputStream() 또는 getReader()를 사용한다.

 

* 주의하자! 

  → Stream을 사용하는 경우 Byte 단위로 값을 반환한다. 그러므로 반드시 인코딩 작업을 거쳐야 한다.


2. InputStream

- InputStream을 이용하여 Request body를 받아올 수 있다.

@Slf4j
@Controller
public class RequestBodyController {

    @PostMapping("/requestbody/inputstream")
    public void usingInputStream(InputStream inputStream, Writer responseWriter) throws IOException {

        String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
        log.info("messageBody = {}", messageBody);

        responseWriter.write("request body using InputStream");

    }
}

 

* 주의하자!

  → Stream을 사용하는 경우 Byte 단위로 값을 반환한다. 그러므로 반드시 인코딩 작업을 거쳐야 한다.


3. HttpEntity

- HttpEntity를 사용하면 Spring이 알아서 Request Body의 내용을 읽는다.

- HttpEntity를 응답(response)에 사용하면 Client에게 Response body에 메시지를 담아 전달할 수 있다. 

@Slf4j
@Controller
public class RequestBodyController {

    @PostMapping("/requestbody/http-entity")
    public HttpEntity<String> usingHttpEntity(HttpEntity<String> httpEntity) throws IOException {

        String messageBody = httpEntity.getBody();
        log.info("messageBody = {}", messageBody);

        return new HttpEntity<>("request body using HttpEntity");

    }
}

a) RequestEntity & ResponseEntity

- Request/ResponseEntity는 HttpEntity를 상속받은 하위 개념이다.

- 이를 사용하면 Response body에 메시지와 함께 상태 코드를  Client에게 전달할 수 있다.

@Slf4j
@Controller
public class RequestBodyController {

    @PostMapping("/requestbody/request-entity")
    public HttpEntity<String> usingRequestEntity(RequestEntity<String> httpEntity) {

        String messageBody = httpEntity.getBody();
        log.info("messageBody = {}", messageBody);

        return new ResponseEntity<>("request body using RequestEntity", HttpStatus.ACCEPTED);

    }
}

4. @RequestBody

- @RequestBody를 사용하면 Spring이 알아서 Request body의 내용을 읽어준다.

- 아래의 코드에서는 응답을 전달하는 역할로 @ResponseBody를 사용하였다.

- @ResponseBody를 사용하면 메서드의 반환 값을 viewname이 아니라 String으로 처리한다.

@Slf4j
@Controller
public class RequestBodyController {

    @ResponseBody
    @PostMapping("/requestbody/request-body")
    public String usingRequestBody(@RequestBody String messageBody) {

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

        return "Using @RequestBody and @ResponseBody";
    }
}

'Back-end > Spring MVC 개념' 카테고리의 다른 글

17. Response 처리방법  (0) 2022.03.17
16. Request - JSON 조회방법  (0) 2022.03.16
14. Request - URL parameter 조회방법  (0) 2022.03.14
13. Annotation 기반의 URL 매핑  (0) 2022.03.10
12. Annotation 기반의 Spring MVC  (0) 2022.03.09

댓글