예) 웹 브라우저에 정적인 HTML, css, js을 제공할 때는, 정적 리소스를 사용한다.
예) 웹 브라우저에 동적인 HTML을 제공할 때는 뷰 템플릿을 사용한다.
HTTP API를 제공하는 경우에는 HTML이 아니라 데이터를 전달해야 하므로, HTTP 메시지 바디에 JSON 같은 형식으로 데이터를 실어 보낸다.
정적 리소스는 디렉토리에 있는 정적 리소스를 그대로 공급한다.
localhost:8080/basic/hello-form
일반적으로 HTML 동적 생성에 사용된다. 스프링에서는 기본적으로 template 폴더안에 뷰 템플릿을 제공한다.
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<p th:text="${data}">empty</p>
</body>
</html>
이제 컨트롤러를 통해 이 view data에 모델을 넣고 보여줄것이다.
ModelAndView를 이용하는 기본적인 방식이다.
@RequestMapping("/response-view-v1")
public ModelAndView responseViewV1() {
ModelAndView mav = new ModelAndView("response/hello").addObject("data", "hello!");
return mav;
}
Model만 사용하는 방식이다.
@RequestMapping("/response-view-v2")
public String responseViewV2(Model model) {
model.addAttribute("data", "hello!");
return "response/hello";
}
@RequestMapping 에 response/hello를 바로 넣어서 따로 반환하지 않아도 작동하게 할 수 있다.
하지만 권장되지 않는 방법이다.
HTML이나 뷰 템플릿을 사용하더라도 결국 바디에 데이터가 담겨서 나간다. 이 항목은 직접 HTTP 응답 메시지를 전달하는 경우를 말한다.
뷰 템플릿으로 HTMl 생성해서 응답하는것이 아니라, HTTP API처럼 JSON을 HTTP 바디에서 직접 읽고 쓰거나 할 때 사용되는 기능이다.
스프링 부트는 다양한 메시지 컨버터를 제공한다. 대상 클래스 타입과 미디어 타입을 체크해서 사용여부를 확인하는 방식이다.
0 = ByteArrayHttpMessageConverter
1 = StringHttpMessageConverter
2 = MappingJackson2HttpMessageConverter
@ResponseBody가 붙은 Controller가 호출이 되고, Convertor에서 String으로 보낼지, Json으로 보낼지 결정을 해서 보내는 방식이다.
스프링 MVC는 다음의 경우에 HTTP 메시지 컨버터를 적용한다.
HTTP 요청: @RequestBody ,HttpEntity(RequestEntity)
HTTP 응답: @ResponseBody , HttpEntity(ResponseEntity)
핸들러 어뎁터인 RequestMappingHandlerAdapter에서 작동하게 된다.
다양한 Argument(매게변수)를 처리해주는 기능이다.
RequestMappingHandlerAdapter에서 ArgumentResolver에게 필요한 파라미터타입을 문의를 한다. 그러면 ArgumentResolver에서 생성을 해주고, RequestMappingHandlerAdapter가 이를 컨트롤러 호출 시 사용하는 것이다.
요청의 경우
@RequestBody 를 처리하는 ArgumentResolver 가 있고, HttpEntity 를 처리하는 ArgumentResolver 가 있다.
이 ArgumentResolver 들이 HTTP 메시지 컨버터를 사용해서 필요한 객체를 생성하는 것이다.
응답의 경우
@ResponseBody 와 HttpEntity 를 처리하는 ReturnValueHandler 가 있다. 그리고 여기에서 HTTP 메시지 컨버터를 호출해서 응답 결과를 만든다.