본문 바로가기
Spring/spring mvc

HTTP 요청 메시지 -단순 텍스트, JSON

by 킹차니 2021. 6. 28.
김영한님의 인프런 강의와 PDF를 바탕으로 정리하였습니다.
https://www.inflearn.com/courses?s=%EA%B9%80%EC%98%81%ED%95%9C

 

 

 

 

HTTP 요청 메시지 - 단순 텍스트

HTTP message body에 데이터를 직접 담아서 요청

 HTTP API에서 주로 사용, JSON, XML, TEXT

 데이터 형식은 주로 JSON 사용
 POST, PUT, PATCH

 

 

요청 파라미터와 다르게, HTTP 메시지 바디를 통해 데이터가 직접 데이터가 넘어오는 경우는 @RequestParam , @ModelAttribute 를 사용할 수 없습니다. (물론 HTML Form 형식으로 전달되는 경우는 요청 파라미터로 인정됩니다.)

 

 

 

 

 

먼저 가장 단순한 텍스트 메시지를 HTTP 메시지 바디에 담아서 전송하고, 읽어보겠습니다.

HTTP 메시지 바디의 데이터를 InputStream을 사용해거 직접 읽을 수 있습니다.

 

RequestBoduStringController

 

1. InputStream 사용

 

 

 

 

스프링 MVC는 다음 파라미터를 지원합니다.
 InputStream(Reader): HTTP 요청 메시지 바디의 내용을 직접 조회

 OutputStream(Writer): HTTP 응답 메시지의 바디에 직접 결과 출력

 

2. InputStream으로 직접 받기

 

 

 

 

 

3. HttpEntity 사용하기

스프링 MVC는 다음 파라미터를 지원합니다.
 HttpEntity
: HTTP header, body 정보를 편리하게 조회

 메시지 바디 정보를 직접 조회

 요청 파라미터를 조회하는 기능과 관계 없음 @RequestParam X, @ModelAttribute X

 

 HttpEntity응답에도 사용 가능

 메시지 바디 정보 직접 반환

 헤더 정보 포함 가능

 view 조회X

 

HttpEntity 를 상속받은 다음 객체들도 같은 기능을 제공합니다.

RequestEntity

HttpMethod, url 정보가 추가, 요청에서 사용

ResponseEntity

HTTP 상태 코드 설정 가능, 응답에서 사용

 return new ResponseEntity<String>("Hello World", responseHeaders, HttpStatus.CREATED)

 

참고
스프링MVC 내부에서 HTTP 메시지 바디를 읽어서 문자나 객체로 변환해서 전달해주는데, 이때 HTTP 메시지 컨버터( HttpMessageConverter )라는 기능을 사용합니다. 

 

 

 

 

 

4. @RequestBody사용하기 (제일 많이 사용되는 방법)

 

@RequestBody

@RequestBody 를 사용하면 HTTP 메시지 바디 정보를 편리하게 조회할 수 있습니다. 참고로 헤더 정보가 필요하다면 HttpEntity 를 사용하거나 @RequestHeader 를 사용하면 됩니다.
이렇게 메시지 바디를 직접 조회하는 기능은 요청 파라미터를 조회하는 @RequestParam , @ModelAttribute 와는 전혀 관계가 없습니다.

 

요청 파라미터 vs HTTP 메시지 바디
 요청 파라미터를 조회하는 기능: @RequestParam , @ModelAttribute

 HTTP 메시지 바디를 직접 조회하는 기능: @RequestBody

 

@ResponseBody

@ResponseBody 를 사용하면 응답 결과를 HTTP 메시지 바디에 직접 담아서 전달할 수 있습니다. 물론 이 경우에도 view를 사용하지 않습니다.

 

 

 

 

 


 

 

HTTP 요청 메시지 - JSON

이번에는 HTTP API에서 주로 사용하는 JSON 데이터 형식을 조회해보겠습니다.

 

 

 

RequestBodyJsonV1

 

1. HttpServletRequset, ObjectMapper사용하여 객체 만들기

HttpServletRequest를 사용해서 직접 HTTP 메시지 바디에서 데이터를 읽어와서, 문자로 변환합니다.

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

 

 

 

 

2. @RequestBody 사용하기

  1. 이전에 학습했던 @RequestBody 를 사용해서 HTTP 메시지에서 데이터를 꺼내고 messageBody에 저장합니다.
  2. 문자로 된 JSON 데이터인 messageBody objectMapper 를 통해서 자바 객체로 변환합니다.

 

문자로 변환하고 다시 JSON으로 변환하느 과정없이 @ModelAttribute처럼 한번에 객체로 변환할 수 있는 방법이 있습니다.

 

 

3. HttpEntity 사용하기

 

 

 

4. 파라미터에 @RequestBody와 객체 넣기

@RequestBody 객체 파라미터
@RequestBody HelloData data
 @RequestBody
에 직접 만든 객체를 지정할 수 있습니다.

 

HttpEntity , @RequestBody 를 사용하면 HTTP 메시지 컨버터가 HTTP 메시지 바디의 내용을 우리가 원하는 문자나 객체 등으로 변환해줍니다.
HTTP
메시지 컨버터문자 뿐만 아니라 JSON도 객체로 변환해주는데, 우리가 방금 V2에서 했던 작업을 대신 처리해줍니다.

 

 

@RequestBody는 생략 불가능

스프링은 @ModelAttribute , @RequestParam 해당 생략시 다음과 같은 규칙을 적용합니다.

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

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

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

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

 

 

주의
HTTP 요청시에 content-type이 application/json인지 꼭! 확인해야 합니다. 그래야 JSON을 처리할 수 있는 HTTP 메시지 컨버터가 실행됩니다.

 

@ResponseBody
응답의 경우에도 @ResponseBody 를 사용하면 해당 객체를 HTTP 메시지 바디에 직접 넣어줄 수 있습니다.

 

@RequestBody 요청
JSON 요청 -> HTTP 메시지 컨버터 -> 객체

@ResponseBody 응답

객체 -> HTTP 메시지 컨버터 ->JSON응답