관리 메뉴

샐님은 개발중

7. HTTP 요청 메시지 - JSON 본문

스프링 MVC 1편 -인프런 김영한/섹션6-스프링MVC - 기본 기능

7. HTTP 요청 메시지 - JSON

샐님 2023. 7. 10. 19:46
728x90
반응형

1.  requestBodyJsonV1 : HttpServletRequest를 사용해 직접 http 메시지 바디에서 데이터를 읽어와서 문자로 변환한다. 

문자로된 json 데이터를 Jackson 라이브러리인 objectMapper 를 사용해서 자바 객체로 변환한다.

 

2.requestBodyJsonV2 - @RequestBody 문자 변환

@RequestBody 를 사용해서 HTTP 메시지에서 데이터를 꺼내고 messageBody에 저장

 

3.requestBodyJsonV3 - @RequestBody 객체 변환

@RequestBody 객체 파라미터 

@RequestBody HelloData data @RequestBody 에 직접 만든 객체를 지정

 

HttpEntity , @RequestBody 를 사용하면 HTTP 메시지 컨버터가 HTTP 메시지 바디의 내용을 우리가 원하는 문자나 객체 등으로 변환

 

@RequestBody는 생략 불가능

   스프링은 @ModelAttribute , @RequestParam 과 같은 해당 애노테이션을 생략시 다음과 같은 규칙을 적용

    String , int , Integer 같은 단순 타입 = @RequestParam

   나머지 = @ModelAttribute (argument resolver 로 지정해둔 타입 외)

 

    따라서 이 경우 HelloData에 @RequestBody 를 생략하면 @ModelAttribute 가 적용되어

     HelloData data @ModelAttribute HelloData data 따라서 생략하면 HTTP 메시지 바디가 아니라 요청 파라미터를 처리.

 

 

package hello.springmvc.basic.request;

import com.fasterxml.jackson.databind.ObjectMapper;
import hello.springmvc.basic.HelloData;
import jakarta.servlet.ServletInputStream;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.util.StreamUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;

import java.io.IOException;
import java.nio.charset.StandardCharsets;

/**
 * {username:"hello","age":20}
 * content-type:application/json
 */
@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("messageBoduy={}", messageBody);
        HelloData helloData = objectMapper.readValue(messageBody,HelloData.class);
        log.info("username={}, age={}", helloData.getUserName(),helloData.getAge());

        response.getWriter().write("ok");
    }
    @ResponseBody
    @PostMapping("/request-body-json-v2")
    public String requestBodyJsonV2(@RequestBody String messageBody) throws IOException{

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

        return "ok";
    }

    @ResponseBody
    @PostMapping("/request-body-json-v3")
    public String requestBodyJsonV3(@RequestBody HelloData hellodata) throws IOException{

        log.info("username={}, age={}", hellodata.getUserName(),hellodata.getAge());

        return "ok";
    }
    
      // 반환값을 객체로 지정해주면 컨버터에 의해서 다시 json 으로 변환되어서 화면에 보여준다.
    @ResponseBody
    @PostMapping("/request-body-json-v4")
    public HelloData requestBodyJsonV4(@RequestBody HelloData hellodata) throws IOException{

        log.info("username={}, age={}", hellodata.getUserName(),hellodata.getAge());

        return hellodata;
    }
}

 

728x90
반응형