8. HTTP 응답 - 정적 리소스, 뷰 템플릿
스프링 (서버)에서 응답 메시지를 만드는 3가지 방법
정적 리소스
예) 웹 브라우저에 정적인 HTML, css, js제공 .
뷰 템플릿 사용
예) 웹 브라우저에 동적인 HTML을 제공할 때는 뷰 템플릿을 사용.
HTTP 메시지 사용
HTTP API를 제공하는 경우에는 HTML이 아니라 데이터를 전달해야 하므로,
HTTP 메시지 바디에 JSON 같은 형식으로 데이터를 실어 보낸다
1. String을 반환하는 경우
- View or HTTP 메시지 @ResponseBody 가 없으면 response/hello 로 뷰 리졸버가 실행되어서 뷰를 찾고, 렌더링 한다. @ResponseBody 가 있으면 뷰 리졸버를 실행하지 않고, HTTP 메시지 바디에 직접 response/hello 라는 문자가 입력된다.
여기서는 뷰의 논리 이름인 response/hello 를 반환하면 다음 경로의 뷰 템플릿이 렌더링 되는 것을 확인할 수 있다.
실행: templates/response/hello.html
2. Void를 반환하는 경우
- @Controller 를 사용하고, HttpServletResponse , OutputStream(Writer) 같은 HTTP 메시지 바디를 처리하는 파라미터가 없으면 요청 URL을 참고해서 논리 뷰 이름으로 사용
요청 URL: /response/hello 실행: templates/response/hello.html 참고로 이 방식은 명시성이 너무 떨어지고 이렇게 딱 맞는 경우도 많이 없어서, 권장하지 않는다.
3. HTTP 메시지 @ResponseBody , HttpEntity 를 사용하면, 뷰 템플릿을 사용하는 것이 아니라, HTTP 메시지 바디에 직접 응답 데이터를 출력할 수 있다.
package hello.springmvc.basic.response;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class ResponseViewController {
@RequestMapping("/response-view-v1")
public ModelAndView responseViewV1(){
ModelAndView mav = new ModelAndView("response/hello")
.addObject("data","hello!");
return mav;
}
//String을 반환하는 경우 - View or HTTP 메시
@RequestMapping("/response-view-v2")
public String responseViewV2(Model model){
model.addAttribute("data","hello");
return "response/hello";
}
// 권장하지 않음
@RequestMapping("/response/hello") // 스프링이 관례적으로 논리적 뷰이름으로 매칭해줌
public void responseViewV3(Model model){
model.addAttribute("data","hello");
}
}
Thymeleaf 는 기본적으로 응답 화면으로 등록되어있다. 변경하고 싶으면 application.properties 에서 변경가능하다.
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html