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

16. Request - JSON 조회방법

by devraphy 2022. 3. 16.

0. 개요

- 앞선 2개의 포스팅에서 Request parameter와 body를 조회하는 방법에 대해서 알아보았다.

- 이를 요약하자면 다음과 같이 정리할 수 있다.

 

  1. 요청 parameter를 조회하는 경우

    → GET 방식의 HTTP request 

    → <form> 태그를 이용한 POST 방식의 HTTP request

    →  @RequestParam, @ModelAttribute를 사용한다.

 

  2. 요청 body를 조회하는 경우 

    → POST 방식의 HTTP request  

    → @RequestBody, @ResponseBody를 사용한다.

 

- 그렇다면 JSON 형식으로 전달되는 Request body는 어떻게 조회할까? 천천히 알아보자.


1. Servlet

- HttpServlet을 이용하여 JSON 형식의 데이터를 다음과 같이 조회할 수 있다.

public class UserData {
    private String username;
    private int age;
}
@Slf4j
@Controller
public class JsonController {

    /** 전달되는 JSON 형식
     * {"username":"hello", "age":20}
     * content-type: application/json
     */

    private ObjectMapper objectMapper = new ObjectMapper();

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

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

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

        UserData userdata = objectMapper.readValue(messageBody, UserData.class);

        log.info("username = {}, age = {}", userData.getUsername(), userData.getAge());

        response.getWriter().write("JSON using HttpServlet");
    }
}

- HttpServletRequest를 사용하여 request body을 읽기 위해서 ServletInputStream을 사용한다.

- ServletInputStream에서 읽어온 내용을 ObjectMapper를 이용하여 Model 클래스의 변수와 매핑한다.

- 그다음 Model로부터 데이터를 가져온다.


2. @RequestBody

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

- 그러나 JSON 형식에 맞게 데이터가 정리되지는 않은 상태이다.

- 그러므로 ObjectMapper를 사용하여 Model 클래스의 변수와 매핑한다.

@Slf4j
@Controller
public class JsonController {

    /** 전달되는 JSON 형식
     * {"username":"hello", "age":20}
     * content-type: application/json
     */
     
    private ObjectMapper objectMapper = new ObjectMapper();

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

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

        UserData userData = objectMapper.readValue(messageBody, UserData.class);

        log.info("username = {}, age = {}", userData.getUsername(), userData.getAge());

        return "JSON using @RequestBody";

    }
}

3. @RequestBody, Model

- @RequestBody와 Model 객체를 사용하여 JSON을 읽을 수 있다.

- 아래 코드와 같이 @RequestBody의 매개변수를 Model 객체로 설정하면 Spring이 알아서 매핑해준다.

- 그러므로 ObjectMapper를 따로 사용할 필요가 없다.

@Slf4j
@Controller
public class JsonController {

    /** 전달되는 JSON 형식
     * {"username":"hello", "age":20}
     * content-type: application/json
     */
     
    @ResponseBody
    @PostMapping("/json/reqeust-body-model")
    public String usingRequestBodyModel(@RequestBody UserData userData) {

        log.info("userData = {}", userData);
        log.info("username = {}, age = {}", userData.getUsername(), userData.getAge());

        return "JSON using @RequestBody and Model";

    }
}

 

* 주의하자!

   - 이전 포스팅에서 Request Parameter를 조회하는 방법 중 하나로 @ModelAttribute를 사용하였다.

   - @ModelAttribute의 매개변수로 Model 클래스를 사용하는 경우 @ModelAttribute를 생략해도 되었다.

 

   - 위에서 설명한 방식에서 @RequestBody를 생략하는 경우, @ModelAttribute를 생략하는 경우와 동일한 상황이 된다.

   - 그러므로 @RequestBody는 생략될 수 없다.


4. HttpEntity, Model

- 제네릭을 이용하여 HttpEntity의 자료형을 Model로 설정하면, Spring이 알아서 Model과 JSON 내용을 매핑해준다.

- 다만, 이 과정에서 HttpEntity.getBody() 메서드를 사용하여 특정 Model 클래스와 매핑됨을 선언해준다. 

@Slf4j
@Controller
public class JsonController {

    /** 전달되는 JSON 형식
     * {"username":"hello", "age":20}
     * content-type: application/json
     */
     
    @ResponseBody
    @PostMapping("/json/http-entity-model")
    public String requestBodyJsonV4(HttpEntity<UserData> httpEntity) {
    
        UserData data = httpEntity.getBody();
        log.info("httpEntity = {}", data);
        log.info("username = {}, age = {}", data.getUsername(), data.getAge());

        return "JSON using HttpEntity and Model";

    }
}

5. Model 객체를 사용한 응답 방법 

- 메서드의 반환형을 Model 클래스로 설정하여 Client에게 JSON 형식의 응답 메시지를 전달할 수 있다.

- 이를 위해서는 메서드의 반환형을 Model 클래스로 설정하고 @ResponseBody를 부착하면 된다.

@Slf4j
@Controller
public class JsonController {

    /** 전달되는 JSON 형식
     * {"username":"hello", "age":20}
     * content-type: application/json
     */
     
    @ResponseBody
    @PostMapping("/json/response-json")
    public UserData usingResponseBody(@RequestBody UserData data) {
        log.info("httpEntity = {}", data);
        log.info("username = {}, age = {}", data.getUsername(), data.getAge());

        return data;
    }
}

 

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

18. HTTP message converter  (0) 2022.03.18
17. Response 처리방법  (0) 2022.03.17
15. Request - message Body 조회방법  (0) 2022.03.15
14. Request - URL parameter 조회방법  (0) 2022.03.14
13. Annotation 기반의 URL 매핑  (0) 2022.03.10

댓글