HTTP 요청으로 오는 데이터는 주로 3가지로 분류할 수 있다.
사실 GET 쿼리 파라미터 전송 방식이든, POST HTML Form 전송 방식이든 둘 다 형식이 같으므로 구분없이 조회할 수 있다.
⇒ 요청 파라미터(request parameter) 조회
이러한 요청 파라미터 조회는 여러가지 방법을 사용할 수 있다.
HttpServlet 은 request로부터 파라미터를 직접 꺼내야 한다.
request.getParameter("username");
Integer.parseInt(request.getParameter("age"));
스프링이 제공하는 @RequestParam 을 이용하여 요청 파라미터를 편리하게 사용할 수 있다.
public String requestParamV2(
@RequestParam("username") String memberName,
@RequestParam("age") int memberAge) {}
@RequestParam 를 통해 파라미터 이름으로 바인딩 한다. @RequestParam의 name(value) 속성이 파라미터 이름으로 사용된다.
만약 HTTP 파라미터 이름이 변수 이름과 같으면 (”username”) 부분은 생략 가능하다.
@RequestParam의 옵션
요청 파라미터를 받아서 필요한 객체를 만들고 객체에 값을 넣어주어야 한다. 스프링은 이 과정을 @ModelAttribute를 통해 자동화해준다.
public String modelAttrubute(@ModelAttribute HelloData helloData) {}
요청 파라미터와 다르게 HTTP 메시지 바디를 통해 데이터가 직접 넘어오는 경우는 @RequestParam, @ModelAttribute 사용 X (단, HTML Form 형식은 제외)
request.getInputStream()requestBodyString(InputStream inputStream, Writer responseWriter)requestBodyStringV3(HttpEntity<String> httpEntity)requestBodyStringV4(@RequestBody String messageBody)만약 이전처럼 HttpServlet, @RequestBody를 통해 String으로 받는다면 ObjectMapper를 통해서 객체를 생성해야 한다.
즉, String으로 인자를 받고 문자로 된 JSON 데이터인 messageBody를 ObjectMapper를 통해 자바 객체로 변환한다.
스프링은 이 부분 또한 @ModelAttribute 처럼 한번에 객체로 변환시킬 수 있다.
public String requestBodyJson(@RequestBody HelloData data) {}
물론 HttpEntity도 가능하다.
HttpEntity, @RequestBody를 사용하면 HTTP 메시지 컨버터가 HTTP 메시지 바디의 내용을 우리가 원하는 문자나 객체 등으로 변환해준다.