<요청 파라미터>
GET에 쿼리 스트링이 오는 것, POST 방식으로 HTML Form 데이터 전송하는 방식
@RequestParam, @ModelAttribute을 사용한다.
<요청 메시지>
- 단순 텍스트
HTTP message body에 데이터를 직접 담아서 요청. 데이터 형식은 주로 JSON 사용
요청 파라미터와 다르게 HTTP 메시지 바디를 통해 데이터가 직접 넘어오는 경우는 @RequestParam, @ModelAttribute를 사용할 수 없으며, HttpEntity를 사용해서 데이터(message Body)를 직접 꺼내야 한다.
(HttpEntity <T> httpEntity)
T messageBody = httpEntity
@RequestBody를 통해서 위의 복잡한 과정 없이 한 번에 데이터(message Body)를 꺼낼 수 있다!
(@RequestBody String messageBody)
@ResponseBody를 통해서 응답 결과를 HTTP message Body에 직접 담아서 전달할 수 있다!
(return "ok";) - JSON
HttpEntity나 @RequestBody를 사용하면 HTTP 메시지 컨버터가 JSON의 내용을 우리가 원하는 문자나 객체 등으로 바꾸어준다.
@ReuqestBody 요청 - (content-type : application/json)
JSON → HTTP 메시지 컨버터 → 객체
@ResponseBody 응답 - (Accept : application/json)
객체 → HTTP 메시지 컨버터 → JSON
<응답 메시지>
스프링 서버에서 응답 데이터를 만드는 방법은 3가지가 있다.
- 정적 리소스
스프링 부트는 클래스패스의 다음 디렉토리에 있는 정적 리소스를 제공한다.
'/static', '/public', '/resources/', '/META-INF/resources/'
'src/main/resources/' 하위 폴더에 리소스를 넣어두면 스프링 부트가 정적 리소스로 제공한다. - 뷰 템플릿 (동적 HTML)
뷰 템플릿을 거쳐 HTML이 생성되고 뷰가 응답을 만들어 전달한다. 스프링 부트는 기본 뷰 템플릿 경로를 제공한다.
'src/main/resources/templates'
1) ModelAndView를 반환
public ModelAndView responseViewV1(){
ModelAndView mav = new ModelAndView("response/hello")
.addObject("data", "hello!");
return mav;
}
2) Model을 통해 view를 반환
public String responseViewV2(Model model){
model.addAttribute("data", "hello!");
return "response/hello";
}
반환 타입이 String일 경우에는 반환 값을 뷰 리졸버로 실행하여 뷰를 찾고 렌더링 한다.
3) 동적 HTML 경로 자체를 매핑 (반환 Type은 void)
@RequestMapping("/response/hello")
public void responseViewV3(Model model){
model.addAttribute("data", "hello!");
}
반환 타입이 void일 경우에는 @Controller를 사용하며 메시지 바디를 처리하는 파라미터가 없다면, @ReqeustMapping을
참고하여 논리 뷰 이름으로 사용한다. - HTTP 메시지
HTTP API를 제공하는 경우에는 HTML이 아니라 데이터를 전달해야 하므로, HTTP 메시지 바디에 JSON 같은 형식(객체)으로 데이터를 실어 보낸다.
<HTTP 메시지 컨버터>
뷰 템플릿으로 HTML을 생성해서 응답하는 게 아니라, HTTP API 처럼 JOSN 데이터를 HTTP 메시지 바디에 직접 읽거나 쓰는 경우 HTTP 메시지 컨버를 사용하면 편리하다.
@RequestBody (HTTP 요청데이터 생성)
- HTTP 요청이 오고, 컨트롤러에서 @RequestBody, HttpEntity 파라미터를 사용한다.
- 메시지 컨버터가 메시지를 읽을 수 있는지 확인하기 위해 canRead()를 호출
2-1) @RequestBody의 대상 클래스 타입을 지원하는가!?
2-2) Content-type 미디어 타입을 지원하는가!? - canRead() 조건을 만족하면 read()를 호출해서 객체를 생성해서 반환한다.
@ResponseBody (HTTP 응답데이터 생성)
- 컨트롤러에서 @ResponseBody, HttpEntity 로 값이 반환된다
- 메시지 컨버터가 메시지를 쓸 수 있는지 확인하기 위해 canWrite()를 호출
2-1) 대상 클래스 타입의 return 타입을 지원하는가!?
2-2) Accept 미디어 타입을 지원하는가!? - canWrite() 조건을 만족하면 write()를 호출해 HTTP 응답 메시지 바디에 데이터를 생성한다
※ 미디어 타입
요청의 경우 Content-type(application/json) // JSON 형식의 데이터를 보낸다
응답의 경우 HTTP Accept(text/html) // HTML 데이터를 해석할 수 있다
- 기본 문자처리 : StringHttpMessageConverter
ex) return "ok";
- 기본 객체처리 : MappingJackson2HttpMessageConverter
ex) return hellodata;
'MVC with 김영한' 카테고리의 다른 글
타임리프(thymeleaf) (0) | 2021.11.15 |
---|---|
요청 매핑 핸들러 어뎁터 (0) | 2021.10.22 |
로깅(logging) (0) | 2021.10.17 |
스프링 애노테이션 (0) | 2021.10.16 |
스프링 MVC (0) | 2021.10.15 |