> For the complete documentation index, see [llms.txt](https://heunnajo.gitbook.io/mvc/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://heunnajo.gitbook.io/mvc/mvc/undefined-3.md).

# 응답 - 정적 리소스, 뷰 템플릿

스프링(서버)에서 응답 데이터를 만드는 3가지 방법

1. 정적 리소스 ex) 웹 브라우저에 정적인 HTML, css, js을 제공할 때

2. 뷰 템플릿 사용 ex) 웹 브라우저에 동적인 HTML을 제공할 때

3. HTTP 메시지 사용\
   HTTP API를 제공하는 경우에는 HTML이 아니라 데이터를 전달해야 하므로, HTTP 메시지 바디에 JSON 같은 형식으로 데이터 제공

4. 정적 리소스

정적 리소스 경로 : src/main/resources/static\
정적 리소스 생성 : src/main/resources/static/basic/hello-form.html\
\=> <http://localhost:8080/basic/hello-form.html>로 이동

2\. 뷰 템플릿 사용\
뷰 템플릿을 거쳐서 HTML이 생성되고, 뷰가 응답을 만들어서 전달한다. 일반적으로 HTML을 동적으로 생성하는 용도로 사용하지만, 뷰 템플릿이 만들 수 있는 것이라면 뭐든지 가능하다.

뷰 템플릿 경로 : src/main/resources/templates\
뷰 템플릿 생성 : ex) src/main/resources/templates/response/hello.html

th:text => Model에서 "data"라는 key 값을 받아서 empty라는 텍스트 부분에 치환해서 넣어준다는 뜻이다!

```markup
 <!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>
```

뷰 템플릿을 호출하는 3가지 방법❤️⭐️ (@RestController, @ResponseBody ❌)

1. ModelAndView를 반환하는 컨트롤러\
   ModelAndView("response/hello") : 뷰의 논리 이름 넣어주며 ModelAndView 인스턴스 생성\
   .addObject("data","hello") : Model에 변수명(attributeName)과 변수 데이터(attributeValue) 넣어준다!

```java
@RequestMapping("/response-view-v1")
public ModelAndView responseViewV1(){
    ModelAndView mav = new ModelAndView("response/hello")
            .addObject("data","hello!");
    return mav;
}
```

ModelAndView 구현 소스 참고

![](https://4059345879-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MdtAbfiAnzkPUNovpHX%2F-Me99Ai8ky09seXr1U__%2F-Me99Z8Hvtic5hp4Sa0g%2FScreen%20Shot%202021-07-09%20at%204.27.20%20PM.png?alt=media\&token=4562977a-88e8-4f1c-b416-11d3db750ae7)

2\. String을 반환하는 컨트롤러 : 반환되는 String이 뷰의 논리 이름이 된다.\
메서드의 매개변수로 model을 넣어주어야 한다!\
model에 addAttribute로 attributeName과 attributeValue를 넣어준다!

```java
@RequestMapping("/response-view-v2")
public String responseViewV2(Model model){
    model.addAttribute("data","hello!");//모델에 데이터 넣어준다!
    return "response/hello";//@Controller이면서 String 반환 = 뷰의 논리적 이름
}
```

3\. 리턴 타입이 void인 경우(명시성이 떨어지기 때문에 권장하지 않는다.)\
요청 URL과 렌더링하려는 뷰의 논리 이름이 같으면 리턴하는 것이 없어도 된다. 요청 URL과 동일한 이름의 뷰를 랜더링한다.

```java
@RequestMapping("/response/hello")
public void responseViewV3(Model model){
    model.addAttribute("data","hello!");//모델에 데이터 넣어준다!
}
```

<br>
