인프런/스프링 MVC 1편

13)HTTP 응답 (정적리소스,뷰 템플릿) , Thymeleaf 스프링부트 설정

backend dev 2023. 1. 26.

이전에는 http 요청에 대한 공부를 했으니 이번에는 HTTP응답에 대해 공부한다.

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

정적리소스

 

스프링부트는

클래스 패스인 src/main/resources 아래에 

/static, /public,/resources, /META-INF/resources 라는 디렉토리에 있는 정적 리소스를 제공한다.

src 아래 main아래 resources가 존재한다. static이란 폴더를 만들어서 그안에 정적리소스들을 담아왔다.

웹 브라우저에서 실행시 클래스패스는 빼고 그 이후 경로와 파일명을 이용해서 호출할 수 있다.

http://localhost:8080/basic/hello-form.html 이런식

 

뷰 템플릿

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

뷰 템플릿이 만들 수 있는 것이라면 뭐든지 가능하다.

 

스프링 부트는 기본 뷰 템플릿 경로를 제공한다.

기본으로 존재한다.

뷰 템플릿 생성

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

<p th:text="${data}">empty</p>  -> 모델에서 data라는 값을 꺼내와 empty를 치환해준다.

 

 

뷰 템플릿을 호출하는 컨트롤러 V1 - ModelAndView

ModelAndView를 만들고 값을 세팅해서 반환한다.

@Controller
public class ResponseViewController {

    @RequestMapping("/response-view-v1")
    public ModelAndView responseViewV1() {
        ModelAndView mav = new ModelAndView("response/hello").addObject("data", "hello!");
        //ModelAndView 객체에 뷰 경로및 이름과 , 데이터를 넣어준다 (데이터는 속성이름,속성값이 한세트)
        return mav;
    }
}

소스보기를 하면 data라는 속성이름의 속성값이 hello!가 잘들어가있다.

ModelAndView를 반환해주면 DispatcherHandler는 뷰를 생성할수있는 ViewResolver를 찾고, ViewResolver를 통해 뷰객체가 생성되고 해당 뷰에서 화면이 생성되서(렌더링) 응답으로 나간다.

V2 - Model  + @Controller 

Model을 메소드의 매개변수로 세팅해서, Spring으로 전달받고 

받은 Model객체에 값을 담고

 

@Controller 어노테이션의 컨트롤러는 String의 반환값을 뷰이름(논리 뷰이름)으로 생각하므로 

해당 뷰이름을 가지고 ViewResolver를 찾고 , ViewResolver가 뷰를 생성하면 해당 뷰에서 렌더링해서 화면을 응답한다.

 

@RequestMapping("/response-view-v2")
public String responseViewV2(Model model) {
    model.addAttribute("data", "hello!");
    return "/response/hello";
}

 

return으로 뷰이름을 주었지만 , 만약 @RestContoller의 컨트롤러이거나,

메소드에 @ResponseBody어노테이션이 붙어있다면  뷰이름 그 자체가 응답메시지바디에 문자열로 들어가게된다.

 

 

V3 - void를 반환 ( 권장하지않는 방법, 참고용)

@RequestMapping("/response/hello") // url패턴을 템플릿이 있는 위치로 맞춰줘야한다.
public void responseViewV3(Model model) {
    model.addAttribute("data", "hello!");
}

 


타임리프 스프링부트 설정

맨처음 프로젝트를 만들때 타임리프를 추가해줬기에 build.gradle에 라이브러리가 추가되어있다.

implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'

라이브러리가 추가되어있다면 스프링 부트가 자동으로 ThymeleafResolver와 필요한 스프링빈들을 등록한다.

그리고 다음 설정도 사용한다. 이 설정은 "기본값" 이기때문에 변경이 필요할 때만 설정하면 된다.

 

application.properties  or application.yml

spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html

위의 설정은 기본설정이므로, 변경하고싶을때 application.*에 추가하여 수정하면된다.

classpath는 src/main/resources를 의미한다.

 

타임리프 관련 추가 설정은 다음 사이트에서 thymeleaf를 검색하면 볼 수 있다.

https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#appendix.application-properties.templating

 

 

 

댓글