티스토리 뷰
서블릿에서 학습한 내용
요청 파라미터와 다르게, HTTP 메시지 바디를 통해 데이터가 직접 넘어오는 경우는 @RequestParam ,
@ModelAttribute 를 사용할 수 없다. (물론 HTML Form 형식으로 전달되는 경우는 요청 파라미터로 인정된다.)
먼저 가장 단순한 텍스트 메시지를 HTTP 메시지 바디에 담아서 전송하고, 읽어보자.
HTTP 메시지 바디의 데이터를 InputStream 을 사용해서 직접 읽을 수 있다.
RequestBodyStringController
@Slf4j
@Controller
public class RequestBodyStringController {
@PostMapping("/request-body-string-v1")
public void requestBodyString(HttpServletRequest request,
HttpServletResponse response) throws IOException {
// 요청의 InputStream을 가져온다. 이 InputStream은 요청의 바디(body)를 읽기 위해 사용.
ServletInputStream inputStream = request.getInputStream();
// InputStream으로부터 문자열을 읽어와 messageBody 변수에 저장.
String messageBody = StreamUtils.copyToString(inputStream,
StandardCharsets.UTF_8);
// 로그에 messageBody 값을 출력.
log.info("messageBody={}", messageBody);
// HTTP 응답에 "ok" 문자열을 쓰고 반환.
response.getWriter().write("ok");
}
}
Postman 사용한 테스트
실행하면
messageBody에 hello 가 들어와 있음을 확인할 수 있음.
Input, Output 스트림, Reader - requestBodyStringV2
여기서 바꾼다.
@PostMapping("/request-body-string-v2")
public void requestBodyStringV2(InputStream inputStream, Writer responseWriter)
throws IOException {
// InputStream을 사용하여 HTTP 요청의 바디 내용을 읽어와 messageBody 변수에 저장.
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
// 로그에 messageBody 값을 출력.
log.info("messageBody={}", messageBody);
// Writer를 사용하여 HTTP 응답에 "ok" 문자열을 쓰고 반환.
responseWriter.write("ok");
}
부연
- 메서드 파라미터로 InputStream inputStream을 받아옴. 이 inputStream은 HTTP 요청의 바디를 읽기 위해 사용됨.
- 메서드 파라미터로 Writer responseWriter를 받아옴. 이 responseWriter는 HTTP 응답에 쓸 내용을 작성하기 위해 사용됨.
- StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8)를 사용하여 inputStream에서 문자열로 바디 내용을 복사함. UTF-8 문자 인코딩을 사용하여 바디를 문자열로 변환한다.
- log.info("messageBody={}", messageBody)는 로그에 바디의 내용을 출력함
- responseWriter.write("ok")는 responseWriter를 사용하여 HTTP 응답에 "ok"라는 문자열을 쓴다.
이러한 방식으로 이 컨트롤러는 HTTP POST 요청의 바디 내용을 직접 파라미터로 받아와서 처리하고, 응답 내용을 직접 responseWriter를 통해 작성하여 반환. 요청의 바디 내용을 로그에 기록하고 "ok"라는 응답을 반환한다.
스프링 MVC는 다음 파라미터를 지원한다.
완전히 다 바꾼 코드는
/**
* HttpEntity: HTTP header, body 정보를 편리하게 조회
* - 메시지 바디 정보를 직접 조회(@RequestParam X, @ModelAttribute X)
* - HttpMessageConverter 사용 -> StringHttpMessageConverter 적용
*
* 응답에서도 HttpEntity 사용 가능
* - 메시지 바디 정보 직접 반환(view 조회X)
* - HttpMessageConverter 사용 -> StringHttpMessageConverter 적용
*/
@PostMapping("/request-body-string-v3")
public HttpEntity<String> requestBodyStringV3(HttpEntity<String> httpEntity) {
String messageBody = httpEntity.getBody();
log.info("messageBody={}", messageBody);
return new HttpEntity<>("ok");
}
부연
- 메서드 파라미터로 HttpEntity<String> httpEntity를 받아온다.
- HttpEntity는 HTTP 요청 또는 응답의 헤더와 바디 정보를 편리하게 조회하고 조작할 수 있는 클래스.
- httpEntity.getBody()를 호출하여 HttpEntity에서 HTTP 요청의 바디 내용을 직접 조회.
- log.info("messageBody={}", messageBody)는 로그에 바디의 내용을 출력.
- new HttpEntity<>("ok")를 사용하여 "ok" 문자열을 포함한 새로운 HttpEntity를 생성.
- 생성된 HttpEntity를 반환한다. 이렇게 반환된 HttpEntity는 HTTP 응답으로 클라이언트에게 전송됨.
정리
이 코드는 HTTP 요청의 바디 내용을 HttpEntity를 통해 편리하게 조회하고,
"ok" 문자열을 포함한 HttpEntity를 응답으로 반환한다.
이것은 Spring Framework의 HttpMessageConverter가 내부적으로 작동하여
요청과 응답의 메시지 바디를 자동으로 변환하고 처리하는 기능을 활용한 것.
포스트맨에서 실행하면
메시지 바디에 잘 담겨서 나옴.
이렇게 상태 코드를 넣을 수도 있음.
HttpEntity를 상속받아도 됨.
실행하면 201 잘 반환이 됨.
@RequestBody - requestBodyStringV4
/**
* @RequestBody
* - 메시지 바디 정보를 직접 조회(@RequestParam X, @ModelAttribute X)
* - HttpMessageConverter 사용 -> StringHttpMessageConverter 적용
*
* @ResponseBody
* - 메시지 바디 정보 직접 반환(view 조회X)
* - HttpMessageConverter 사용 -> StringHttpMessageConverter 적용
*/
@ResponseBody
@PostMapping("/request-body-string-v4")
public String requestBodyStringV4(@RequestBody String messageBody) {
log.info("messageBody={}", messageBody);
return "ok";
}
부연
- @ResponseBody 어노테이션은 이 메서드가 반환하는 값이 HTTP 응답의 바디 내용임을 나타냄.
이 어노테이션이 적용되면 메서드의 반환 값이 직접 HTTP 응답으로 전송된다.
- 메서드 파라미터로 @RequestBody String messageBody를 받아온다.
@RequestBody 어노테이션은 HTTP 요청의 바디 내용을 직접 문자열로 받아온다.
- log.info("messageBody={}", messageBody)는 로그에 바디의 내용을 출력한다.
- 메서드는 "ok" 문자열을 반환한다. 이 문자열은 HTTP 응답의 바디로 설정되어 클라이언트에게 반환된다.
이 코드는 HTTP POST 요청의 바디를 @RequestBody 어노테이션을 사용하여 직접 문자열로 받아오고, 이를 응답으로 반환하는 간단한 컨트롤러 메서드를 나타낸.
'[개발] - Spring > MVC 1' 카테고리의 다른 글
HTTP 응답 - 정적 리소스, 뷰 템플릿 (1) | 2023.10.10 |
---|---|
HTTP 요청 메시지 - JSON (0) | 2023.10.10 |
HTTP 요청 파라미터 - @ModelAttribute (0) | 2023.10.08 |
HTTP 요청 파라미터 - @RequestParam (0) | 2023.10.08 |
HTTP 요청 파라미터 - 쿼리 파라미터, HTML Form (1) | 2023.10.08 |