Free Lines Arrow
본문 바로가기
Spring/spring mvc 1 스터디

[Spring] HTTP 요청메세지 TEXT, JSON

by skahn1215 2021. 11. 16.
728x90
반응형

HTTP 요청메세지 Text 편

  • HTTP Message Body에 데이터가 담겨 요청이올때 처리하는 방법을 알아본다.
  • HTTP API 에서 주로 사용된다.
     - JSON, XML, TEXT
  • 주로 JSON 사용
  • POST, PUT, PATCH
  • 메세지 BODY 를 통에 데이터가 넘어오는 경우 @RequestParam, @ModelAttribute 사용 못한다.
    - FORM 으로 넘어오는건 가능하다.

 

Message Body 가져오는 방법

HttpServletRequest V1

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

        log.info("messageBody={}", messageBody);
        res.getWriter().write("ok");
    }

 

 

InputStream V2(V1 개선)

  • 파라미터 값으로 Inpustream 과 Writer 를 직접 사용할수 있다.
  • InputStream(Reader): HTTP 요청메시지 바디의 내용을 조회
  • OutputStream(Writer) HTTP 응답 메시지의 바디에 직접 결과를 출력
    //inputstream 과 reader 를 바로 받을수 있다.
    @PostMapping("/request-body-string-v2")
    public void requestBodyString2(InputStream inputStream, Writer responseWriter) throws IOException {
        String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);

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

 

 

HttpEntity V3(V2 개선)

  • HttpEntity 를 이용하면 Header 와  Body 정보를 쉽게 조회 할 수 있다.
  • HttpEntity 를 리턴 값으로 사용하게 되면 View를 조회 하지 않는다.
    - 메시지 바디에 데이터를 직접 넣어서 반환한다.
  • T 타입이 String 인 경우 스프링에서 MessageConverter를 이용하여 Body 내용을 문자로 넘겨준다.
    // !!!!!! 요청 파라미터는 GET 의 쿼리스트링 또는 , POST 의 HTML form 데이터 전송하는 방식 인 경우에만
    // @RequestParam, ModelAttritube 해당 어노테이션을 사용한다.
    @PostMapping("/request-body-string-v3")
    public HttpEntity<String> requestBodyString3(HttpEntity<String> httpEntity) throws IOException {

        String messageBody = httpEntity.getBody();

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

        // 이렇게 하면 body에 데이터를 넣어준다.
        return new HttpEntity<String>("ok");
    }

 

ResponseEntity, RequestEntity V3

  • RequestEntity: HttpMethod, url 정보가 추가, 요청에 사용
  • ResponseEntity: HTTP 상태코드 설정가능, 응답에 사용한다.
    @PostMapping("/request-body-string-v3-1")
    public ResponseEntity<String> requestBodyString3_1(RequestEntity<String> httpEntity) throws IOException {

        String messageBody = httpEntity.getBody();

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

        // 이렇게 하면 body에 데이터와 상태코드를 넣을수 있다.
        return new ResponseEntity<String>("OK",HttpStatus.CREATED);
    }

 

 

ResponseBody, RequestBody V4(V3 개선)

ResponseBody: 를 이용하면 데이터와 상태코드를 넣을수 있다.

RequestBody:  실무에서 많이 쓴다. 그냥 데이터를 바로 스트링으로 가져온다.

    // 응답  RequestBody 실무에서 엄청 많이 쓴다.
    @ResponseBody
    @PostMapping("/request-body-string-v4")
    public String requestBodyString4(@RequestBody String messageBody) throws IOException {
        // 끝이다.
        log.info("messageBody={}", messageBody);
        // 이렇게 하면 body에 데이터와 상태코드를 넣을수 있다.
        return "OK";
    }

 

 

HTTP 요청메세지 JSON 편

 

HttpServletRequest V1

  • HttpServletRequest 를 이용한다
     - 문자로된 데이터를 jackson 의 objectMapper 를 사용하여 자바 객체로 변환한다.
  • objectMapper.readValue
     - 문자를 객체로 변환 해주는 역할을 한다.
    @PostMapping("request-body-json-v1")
    public void requestBodyJsonV1(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        ServletInputStream inputStream = req.getInputStream();
        String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);

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

        resp.getWriter().write("OK");
    }

 

RequestBody V2(V1 개선)

  • RequestBody 를 직접 파라미터로 사용한다.
    @ResponseBody
    @PostMapping("request-body-json-v2")
    public String requestBodyJsonV2(@RequestBody String messageBody) throws IOException {

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

        return "OK";
    }

 

 

RequestBody V3(V2개선)

  • 객체를 직접 사용할수 있다.
  • RequestBody 는 생략할수 없다.
     - 생략하게 되면 @ModelAttribute 가 적용된다. 바디의 메시지가 아니라 요청파라미터를 처리한다.
     - 바디로 메세지를 담아서 오면 파라미터가 없기때문에 Null 값이 들어가게 된다.
    @ResponseBody
    @PostMapping("request-body-json-v3")
    // RequesBody 객체를 지정할수 있다.
    // HTTP 메세지 컨버터가 알아서 데이터를 넣어준다.
    // JSON 이구나 객체에 맞게 반환해준다.
    // @RequestBody 생략하면 안된다.
    // 값이 안들어가는 이유는 생략하면 모델 어트리뷰트가 된다. 즉 요청 파라미터를 처리하게 된다.
    public String requestBodyJsonV3(@RequestBody HelloData helloData) throws IOException {
        log.info("username={}, age={}", helloData.getUsername(), helloData.getAge());
        return "OK";
    }

 

HttpEntity V4

    @ResponseBody
    @PostMapping("request-body-json-v4")
    public String requestBodyJsonV4(HttpEntity<HelloData> httpEntity) throws IOException {
        HelloData data = httpEntity.getBody();
        log.info("username={}, age={}", data.getUsername(), data.getAge());
        return "OK";
    }

 

 

ResponseBody V5

  • @ResponseBody가 있는 경우 객체를 직접 리턴 할수 있다.
     - 컨버터가 알아서 바디에 객체를 JSON으로 넘겨준다.
    @ResponseBody
    @PostMapping("request-body-json-v5")
    // 나갈때 ResponseBody 가 있으면 컨버터가 알아서 바디에 넣어준다.
    // 객체가 JSON 으로 바껴 body에 들어간다.
    public HelloData requestBodyJsonV5(@RequestBody HelloData data) throws IOException {
        log.info("username={}, age={}", data.getUsername(), data.getAge());
        return data;
    }

 

 

 

참고

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard

 

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의

웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., 원

www.inflearn.com

 

728x90
반응형

'Spring > spring mvc 1 스터디' 카테고리의 다른 글

[Spring] Message Converter  (0) 2021.11.25
[Spring] HTTP 응답  (0) 2021.11.21
[Spring] HTTP 요청파라미터  (0) 2021.11.13
[Spring] 요청매핑  (0) 2021.11.10
[Spring] Spring Controller 다루기  (0) 2021.11.06

댓글