Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

HTTP 요청 메시지 - JSON 본문

인프런/[인프런] 스프링 MVC 1

HTTP 요청 메시지 - JSON

Seung__ 2021. 9. 14. 23:54

 

1. JSON 형식 data 받기 v1


  • ObjectMapper : JSON <--> Object 
@Slf4j
@Controller
public class RequestBodyJsonController {

    private ObjectMapper objectMapper = new ObjectMapper();

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

        log.info("messageBody = {}",messageBody);
        
        //json -> object
        HelloData helloData = objectMapper.readValue(messageBody, HelloData.class);
        log.info("username = {}, age={}", helloData.getUsername(), helloData.getAge());

    }
}

 

 

 

2. @RequestBody, @ResponseBody 사용


    @ResponseBody
    @PostMapping("/request-body-json-v2")
    public String requestBodyJsonV1(@RequestBody String messageBody) throws IOException {
        
        log.info("messageBody = {}",messageBody);

        //json -> object
        HelloData helloData = objectMapper.readValue(messageBody, HelloData.class);
        log.info("username = {}, age={}", helloData.getUsername(), helloData.getAge());

       return "ok";

    }
  • HttpEntity , @RequestBody 를 사용하면
  •  HTTP 메시지 컨버터가 HTTP 메시지 바디의 내용을 문자나 객체 등으로 변환해준다.

 

3. JSON을 객체로 변환해서 받기.


  • ObjectMapper쓰고,, 귀찮은데...
  • HTTP 메시지 컨버터는 JSON도 객체로 변환할 수 있음.
  • @RequestBody를 사용하는 경우 별도 ObjectMapper없이도 직접 만든 객체로 받을 수 있음.
    @ResponseBody
    @PostMapping("/request-body-json-v3")
    public String requestBodyJsonV3(@RequestBody HelloData helloData){
  
        log.info("username = {}, age={}", helloData.getUsername(), helloData.getAge());

        return "ok";

    }

 

 

4. @RequestBody 생략 가능??


  • @RequestBody를 생략하면 위의 예제는 HelloData 를 받는다.
  • 어? @RequestParam, @ModelAttribute 생략한거랑 헷갈림
  • @RequestParam은 String, int 등 에 적용되고
  • 나머지는 @ModelAttribute가 적용된다.
  • 즉 @RequestBody를 생략하면 ... @ModelAttribute가 적용된다.
  • 따라서 파라미터로 넘어오는 값들이 @ModelAttribute에 의해 HelloData에 바인딩 된다.

 

5. 주의


  • HTTP 요청시에 content-type이 application/json 으로 지정 되어야
  • JSON을 처리할 수 있는 HTTP 메시지 컨버터가 실행된다.

 

6. HTTP Entity 사용 가능


    @ResponseBody
    @PostMapping("/request-body-json-v4")
    public String requestBodyJsonV4(HttpEntity<HelloData> helloData){

        HelloData messageBody = helloData.getBody();
        log.info("username = {}, age={}", messageBody.getUsername(), messageBody.getAge());

        return "ok";

    }

 

 

7.  JSON 반환.


  • @ReponseBody가 적용되어 있으면
  • return이 나갈 때도 HTTP 메시지 컨버터가 작동된다.
  • 즉 생성된 객체가 메시지 컨버터에 의해 JSON으로 바뀌고 응답 메시지 body 에 담겨서 나감.
    @ResponseBody
    @PostMapping("/request-body-json-v5")
    public HelloData requestBodyJsonV5(@RequestBody HelloData helloData){

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

        return helloData;

    }

 

8. 정리


  • @RequestBody 요청
    • JSON 요청 --> HTTP 메시지 --> 컨버터 객체
  • @ResponseBody 응답(Client 의 Accept 확인 필요)
    • 객체 --> HTTP 메시지 컨버터 --> JSON 응답

 

9. GitHub : 210914 JSON


 

GitHub - bsh6463/MVC2

Contribute to bsh6463/MVC2 development by creating an account on GitHub.

github.com

 

Comments