Dev/Spring

[Spring MVC 1] 스프링 MVC-기능 (3)

kjyyjk 2023. 2. 7. 15:48

 학습 내용 

스프링 MVC - HTTP 요청 메시지( 텍스트 / json ) 조회


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

 

HTTP 요청 메시지 바디에 직접 데이터를 담아 요청하면,

 

앞에서 학습한 @RequestParam 이나 @ModelAttribute 를 사용할 수 없다.

(두 애노테이션은 요청 파라미터를 조회하는 방식이기 때문!)

 

그렇기 때문에 서블릿 학습 때 처럼 inputStream을 받아, StreamUtils를 이용해야한다.

 

StreamUtils를 이용해 바이트 코드인 inputStream을 UTF-8로 변환.

 

 

스프링이 지원하는 InputStream / Writer 파라미터

(InputStream inputStream, Writer writer)

InputStream은 request, response 를 파라미터로 받지 않고 바로 요청 메시지 바디의 내용을 조회할 수 있다.

Writer도 바로 응답 메시지의 바디에 출력 가능.

 

 

스프링이 지원하는 HttpEntity 파라미터

HttpEntity는 HTTP 요청의 헤더와 메시지 Body를 직접 편리하게 조회할 수 있다.

 

내부적으로 HTTP 메시지 컨버터(HTTP Message Converter) 동작

 

// HTTP 바디에 있는 내용을 문자로 바꾸어서.
(HttpEntity<String> httpEntity)

// messageBody에는 위에서 문자로 바꾼 내용이 들어간다.
String messageBody = httpEntity.getBody();
// 응답에도 사용이 가능하다.
//메시지 바디 정보를 직접 반환! 마치 @ResponseBody 나 @RestController

public HttpEntity<String> .....{
....
return new HttpEntity<>("ok");
}

 

 

HttpEntity 마저도 쓰기 귀찮다고 느낀 개발자님들 덕분에 애노테이션 제공..

 

@RequestBody

HTTP 메시지 바디 정보를 조회.

만약 헤더 정보가 필요하다면 @RequestHeader 나 HttpEntity 의 .getHeader() 이용!

 

 

주의할 것은 앞에서 학습한 @RequestParam과 @ModelAttribute와는 전혀 다르다는 것.

  • 요청 파라미터 조회 : @RequestParam(요청 파라미터 받아옴) / @ModelAttribute(요청 파라미터를 객체로 바인딩)
  • 메시지 바디 조회 : @RequestBody (또는 HttpEntity)

 

 

* HTTP 요청 메시지 조회 - JSON

 

서블릿에서와 마찬가지로 JSON을 조회할 때 Jackson 라이브러리인 ObjectMapper 를 이용한다.

(문자 JSON -> 객체 변환)

 

 

 

단순 문자 조회시와 마찬가지로 @RequestBody 를 이용하여 messageBody로 문자형태의 JSON을 받았다.

 

이렇게 해도 다시 객체로 변환해주어야 하니 불편할 뿐.

 

( @RequestBody HelloData data )

@RequestBody는 직접 만든 객체를 지정해 사용하면, 메시지 바디의 내용을 객체로 변환해준다.

HttpEntity 도 마찬가지

 

이게 바로 HTTP 메시지 컨버터가 내부적으로 동작하기 때문이다 (@RequestBody 와 HttpEntity )

HTTP 메시지 컨버터를 이용하면 HTTP 메시지 바디의 내용을 원하는 문자나 객체로 변환

 

만약 여기서 @RequestBody를 생략한다면 어떻게 될까나.

전에 애노테이션 생략됐을 시,

단순 타입이면 @RequestParam이, 객체 같은 타입이면 @ModelAttribute가 생략된 것으로 간주한다는 것을 학습.

따라서 여기서 @RequestBody를 생략한다면 @ModelAttribute 애노테이션으로 인식될 것이고

의도와는 다르게 요청 파라미터를 다루게 된다 !!

--> 결론 : @RequestBody 생략 xxxx

 

 

@ResponseBody
@Controller
...{
...

return data;
}

@ResponseBody 또한 @RequestBody와 같이 HTTP 컨버터 동작하기 때문에

객체를 반환해주면 내부적으로 컨버터가 동작해 JSON 응답이 자동으로 HTTP 메세지 바디에 들어가게 된다.

 


 다음 학습 내용 

 

HTTP 응답 / HTTP 메세지 컨버터

 

 

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의

웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., -

www.inflearn.com