김영한님의 인프런 강의와 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 사용하기
- 이전에 학습했던 @RequestBody 를 사용해서 HTTP 메시지에서 데이터를 꺼내고 messageBody에 저장합니다.
- 문자로 된 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응답
'Spring > spring mvc' 카테고리의 다른 글
(추가 정리) 스프링 요청 응답 정리 (0) | 2021.06.28 |
---|---|
HTTP 응답 메시지 - 정적 리소스, 뷰 템플릿(동적), HTTP 메시지 바디에 직접 입력 (0) | 2021.06.28 |
HTTP 요청 파라미터 - 쿼리 파라미터, HTML FORM + @RequestParam, @ModelAttribute (0) | 2021.06.28 |
HTTP 요청 헤더 정보 조회 (0) | 2021.06.28 |
요청 매핑 API만들기 (0) | 2021.06.28 |