단순 텍스트
Request Parameter와 다르게, HTTP Message Body를 통해 데이터가 직접 넘어오는 경우는
@RequestParam, @ModelAttribute를 사용할 수 없다.
먼저 단순한 텍스트를 HTTP Message Body에 담아서 전송하고, 이를 InputStream으로 읽어보자.
Spring 공식 문서를 참조하면 알 수 있듯이, InputStream과 OutputStream을 직접 받을 수 있다.
따라서 아래와 같이 코드를 작성할 수 있다.
스프링 MVC는 다음 파라미터를 지원한다.
HttpEntity : HTTP header, body 정보를 편리하게 조회
- 메시지 바디 정보를 직접 조회
- 요청 파라미터를 조회하는 기능과 관계 없음
HttpEntity는 응답에도 사용 가능
- 메시지 바디 정보를 직접 반환
- 헤더 정보 포함 가능
- view 조회X
이를 바탕으로 코드를 작성해보면
- HttpMessageConverter가 동작하여 메시지 바디를 보고 바이트 코드를 문자로 바꾸어준다.
- getHeader()를 통해 헤더정보도 가져올 수 있음.
HttpEntity를 상속받은 다음 객체들도 같은 기능을 제공
- RequestEntity
- HttpMethod, url 정보가 추가됨, 요청에서 사용
- ResponseEntity
- HTTP 상태 코드 설정 가능, 응답에서 사용
HttpEntity를 상속받은 객체를 사용하여 위와 같이 변경하여 사용할 수 있다.
상태 코드가 200에서 201로 변경된 것을 확인할 수 있다.
Spring MVC 내부에서 HTTP Message Body를 읽어 문자나 객체로 변환하여 전달해주는데,
이때 HttpMessageConverter라는 기능을 사용함.
@RequestBody / @ResponseBody
@RequestBody를 사용하면 HTTP Message Body 정보를 편리하게 조회할 수 있다. 헤더 정보가 필요하면 @RequestHeader를 사용
@ResponseBody를 사용하면 응답 결과를 HTTP Message Body에 담아서 전달할 수 있다.
이 경우에는 view를 사용 X
요청 파라미터를 조회하는 기능 : @RequestParam, @ModelAttribute
HTTP Message Body를 직접 조회하는 기능 : @RequestBody
JSON
JSON 데이터 형식을 조회해보자.
먼저 서블릿 방식으로 조회
- 문자로 된 JSON 데이터를 Jackson 라이브러리인 objectMapper 를 사용해서 자바 객체로 변환
@RequestBody / @ResponseBody 사용
@RequestBody 파라미터로 객체 받기
- @RequestBody에 객체를 파라미터로 넘길 수 있다.
- HttpEntity, @RequestBody를 사용하면 HTTP Message Converter HTTP Message Body의 내용을 원하는 문자나 객체 등으로 변환해준다.
- HTTP Message Converter는 문자 뿐만 아니라 JSON도 객체로 변환해줌. V2에서 했던 작업을 대신 처리
@RequestBody는 생략 불가능
- 스프링이 정해놓은 규칙에 의해 이를 생략하면 @ModelAttribute가 적용되어버림.
- @ModelAttribute가 적용되어 HTTP Message Body가 아니라 요청 파라미터를 처리함.
content-type이 application/json이어야 JSON을 처리할 수 있는 컨버터가 실행됨
HttpEntity
객체를 응답으로 반환하기
- 이 경우 또한 HttpEntity를 사용해도 된다.
- 해당 객체를 HTTP Message Body에 집어 넣어주는 것
@RequestBody 요청
- JSON 요청 -> HTTP Message Converter -> 객체
@ResponseBody 응답
- 객체 -> HTTP Message Converter -> JSON 응답
반응형
'Spring > Spring MVC' 카테고리의 다른 글
HTTP Message Converter (0) | 2021.05.11 |
---|---|
HTTP Response (0) | 2021.05.10 |
HTTP Request Parameter (0) | 2021.05.07 |
HTTP 요청 - 헤더 정보 (0) | 2021.05.07 |
요청 매핑 (0) | 2021.05.06 |