본문 바로가기
학습/Spring

[spring] 스프링 웹 MVC의 동적 리소스 지원 (Thymeleaf)

by KKambi 2020. 4. 25.

Template Engine

- 주로 View를 만드는데 사용

- 그 외 Code Generation / Email Template 등에 사용

- 사용 이유 : 서버 처리 후, 템플릿에 동적으로 값을 삽입

- 스프링 부트가 자동 설정 지원하는 엔진

  1. Thymeleaf (★)
  2. FreeMarker
  3. Groovy
  4. Mustache

 

JSP를 권장하지 않는 이유

- 스프링 부트의 Goal : 내장WAS로 독립적으로 실행 가능한 웹 어플리케이션을 빠르게 배포

- JSP 사용 시

  1. WAR패키징만 가능
  2. Undertow 서블릿 컨테이너는 JSP 미지원
  3. 의존성 문제 가능성

 

Thymeleaf 사용

- 의존성 추가 : spring-boot-starter-thymeleaf

- 템플릿 탐색 위치 : src/main/resources/templates/

 

실습

1. 테스트 작성

  • MockMvc 객체의 perform(HTTP요청메소드)로 ResultActions 객체 생성
  • ResultActions 객체의 andDo(print())로 응답본문 콘솔에 출력가능
  • ResultActions 객체의 andExpect() 안에서 view()로 ViewResultMatchers 객체 생성
  • view().name() / model.attribute()로 테스트 가능
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@RunWith(SpringRunner.class)
@WebMvcTest(SampleController.class)
public class SampleControllerTest{
    
    @Autowired
    MockMvc mockMvc;
 
    @Test
    public void hello() throws Exception {
        //요청: /hello
        //응답: 
        // - 모델 Attribute name : kkambi
        // - 뷰 이름 : hello
        
        mockMvc.perform(get("/hello"))
            .andExpect(status().isOk())
            .andDo(print())
            .andExpect(view().name("hello"))
            .andExpect(model().attribute("name", is("kkambi")))
            .andExpect(content().string(containsString("hello world!")));
    }
}
 
cs

 

2. View name을 반환하는 @Controller 작성

  • [왜] ModelAndView를 안쓰고 Model만 써도 될까?
  • 리턴값으로 View를 표현할 것이므로 상관없다 함
  • Model 객체를 일종의 Map으로 생각하여, attribute를 설정해줄 수 있다
1
2
3
4
5
6
7
8
9
@Controller
public class SampleController{
    
    @GetMapping("/hello")
    public String hello(Model model){
        model.attribute("name""kkambi");
        return "hello";
    }
}
cs

 

3. 동적 리소스 작성

1
2
3
4
5
6
7
8
9
10
11
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Hello</title>
</head>
<body>
    hello world!
    <h1 th:text="${name}">name이 존재하지 않을 때 표시되는 문구</h1>
</body>
</html>
cs

 

SpringBootTest에선 Mock 서블릿을 사용하는데?

- [어떻게] 동적 렌더링 결과를 테스트에서 확인할 수 있을까??

- Thymeleaf는 가능!

  • 독자적으로 최종 View를 완성
  • 서블릿 엔진 개입X

- JSP는 불가능! 서블릿 엔진이 렌더링하기 때문!

댓글