본문 바로가기

JAVA/Spring

[Spring] 스프링MVC - HTTP 요청과 응답

728x90

[Spring]스프링MVC - HTTP 요청과 응답

스프링에서 HTTP요청을 받는 방법은 여러가지가 있다.

폼 데이터의 인자로 넘어올 때는 RequestParam, ModelAttribute를 사용할 수 있지만

Http 바디를 통해 직접 넘어올 때는 별도의 파싱이 필요하다.

텍스트 파싱

1. InputStream (V1)

@PostMapping("/request-body-string-v1")
public void requestBodyString(HttpServletRequest request,
HttpServletResponse response) throws IOException {
	ServletInputStream inputStream = request.getInputStream();

	String messageBody = StreamUtils.copyToString(inputStream,
	StandardCharsets.UTF_8);

	log.info("messageBody={}", messageBody);

	response.getWriter().write("ok");
}

Http 메시지 바디의 데이터를 InputStream으로 읽는다.

2. InputStream (V2)

@PostMapping("/request-body-string-v1")
public void requestBodyString(InputStream inputStream, Writer responseWriter) throws IOException {
	String messageBody = StreamUtils.copyToString(inputStream,
	StandardCharsets.UTF_8);

	log.info("messageBody={}", messageBody);

	responseWriter.writer("ok");
}

스프링 MVC는 InputSream, OutputStream(Writer)을 파라미터로 지원하여 이를 이용해 더 간결한 컨트롤러를 작성할 수 있다.

3. HttpEntity (V3)

@PostMapping("/request-body-string-v3")
public HttpEntity<String> requestBodyStringV3(HttpEntity<String> httpEntity) {
	String messageBody = httpEntity.getBody();
	log.info("messageBody={}", messageBody);
	return new HttpEntity<>("ok");
}

스프링 Mvc에서 제공하는 HttpEntity는 HTTP 요청의 header, body 정보를 간편하게 조회할 수 있다.

응답에도 사용할 수 있어 메시지 바디와 헤더 정보를 직접 반환할 수 있다.

아래는 HttpEntity를 상속받은 객체이다.

RequestEntity

  • HttpMethod, Url 정보가 추가됨 (요청에 사용)

ResponseEntity

  • Http 상태코드를 설정할 수 있음 (응답에 사용)

※참고

스프링 MVC에서 Http 메시지 바디를 읽거나 문자, 객체로 변환해 줄 때 HTTP 메시지 컨버터(HttpMessageConverter)를 사용한다

4. RequestBody (V4)

@ResponseBody
@PostMapping("/request-body-string-v4")
public String requestBodyStringV4(@RequestBody String messageBody) {
	log.info("messageBody={}", messageBody);
	return "ok";
}

RequestBody를 사용하면 더 간편하게 조회할 수 있다.

Body정보만을 파싱하여 헤더 정보가 필요하면 HttpEntity나 @RequestHeader 를 사용하자.

  • 요청 파라미터 조회: RequestParam, ModelAttribute
  • HTTP 메시지 바디 직접조회: RequestBody

@ResponseBody

응답 결과를 Http 메시지 바디에 직접 담아 전달할 수 있다.

(view를 사용하지 않음)

Json 파싱

V1,V2 생략

1. RequestBody (V3)

@ResponseBody
@PostMapping("/request-body-json-v3")
public String requestBodyJsonV3(@RequestBody HelloData data) {
	log.info("username={}, age={}", data.getUsername(), data.getAge());
	return "ok";
}

HttpEntity, RequestBody를 사용하면 HTTP 메시지 컨버터가 우리가 원하는 문자나 객체로 변환해준다.

@RequestBody 를 생략하면 ModelAttribute가 적용되어 body타입이 아닌 요청 타입을 처리하게 되어 생략하면 안된다.

2. HttpEntity (V4)

@ResponseBody
@PostMapping("/request-body-json-v4")
public String requestBodyJsonV4(HttpEntity<HelloData> httpEntity) {
	HelloData data = httpEntity.getBody();
	log.info("username={}, age={}", data.getUsername(), data.getAge());
	return "ok";
}

마찬가지로 HttpEntity를 사용할 수 있다.

@ResponseBody
@PostMapping("/request-body-json-v5")
public HelloData requestBodyJsonV5(@RequestBody HelloData data) {
	log.info("username={}, age={}", data.getUsername(), data.getAge());
	return data;
}

@ResponseBody

응답 또한 객체를 직접 바디에 넣어줄 수 있다.

HttpEntity를 사용해도 된다.

  • @RequestBody
    • JSON 요청 → HTTP 메시지 컨버터 → 객체
  • @ResponseBody 응답
    • 객체 → HTTP 메시지 컨버터 → JSON응답