ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [16] Spring Web MVC : Template Engine
    Spring/Spring boot 2020. 6. 24. 21:53
    반응형

    [Template Engine]

    Template engine은 주로 view를 만드는 데 사용합니다. spring boot가 자동 설정을 지원하는 template engine은 다음과 같습니다.

    • FreeMarker
    • Groovy
    • Thymeleaf
    • Mustache

     

    JSP를 spring boot의 template engine으로 권장하지 않는 이유는 다음과 같습니다.


    [Thymeleaf 사용하기]

    Thymeleaf 학습용 reference: https://www.thymeleaf.org/ https://www.thymeleaf.org/doc/articles/standarddialect5minutes.html
    의존성 추가: spring-boot-starter-thymeleaf
    템플릿 파일 위치: /src/main/resources/template/
    예제: https://github.com/thymeleaf/thymeleafexamples-stsm/blob/3.0-master/src/main/webapp/WEB-INF/templates/seedstartermng.html

     

     

    동적 resource에 대한 request를 처리할 수 있는 controller를 만들어 response 하는 예제를 통해 spring boot에서의 template engine이 어떻게 동작하는지 살펴보고자 합니다.

     

    먼저 Thymleaf에 대한 의존성 spring-boot-starter-thymeleaf을 pom.xml에 추가합니다.

    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>

     

    controller에 대한 test code를 작성합니다.

    @RunWith(SpringRunner.class)
    @WebMvcTest(SampleController.class)
    public class SampleControllerTest {
    
        @Autowired
        MockMvc mockMvc;
    
        @Test
        public void hello() throws Exception {
            /**
             * request "/hello"
             * response
             *      - model name : dave
             *      - view name : hello
             */
            mockMvc.perform(get("/hello"))	//	①
                    .andExpect(status().isOk())
                    .andExpect(content().string(containsString("dave")))	//	②
                    .andExpect(view().name("hello"))	//	③
                    .andExpect(model().attribute("name", is("dave")))	//	④
                    .andDo(print());
        }
    }

    ① ~/hello URI로 get request를 던집니다.

    ② content안에 "dave"라는 string이 있는지 검사합니다.

    ③ view name이 hello인지 확인합니다.

    ④ model의 attribute 중 "name"에 해당하는 값이 "dave"인지 확인합니다.

     

     

    test를 실행해보면 아직 ~/hello를 처리할 contoller가 만들어지지 않았기 때문에 실패하게 됩니다. test를 빠르게 통과하기 위해 controller를 작성합니다.

    @Controller
    public class SampleController {
    
        @GetMapping("/hello")
        public String hello(Model model) {
            model.addAttribute("name", "dave");	//	①
            return "hello";	//	②
        }
    }

    ① View에 동적으로 적용할 data들이 model입니다. map이라고 생각하고 값을 담으면 됩니다.

    ② 현재 controller는 @RestController가 아니고 @Controller이기 때문에 반환하는 String은 response 본문이 아닌 View의 이름입니다.

     

     

     

    다시 test code를 실행하면 hello라는 이름의 template를 찾을 수 없어 통과하지 못합니다.

     

     

     

    test 통과를 위해 template를 작성합니다. 동적으로 생성되는 view는 /src/main/resources/templates 아래에서 찾습니다. /templates directory 아래에 hello.html을 생성합니다. 내용을 작성합니다. (HTTP의 rendering은 servlet engine이 담당하고 있으며 JSP의 경우 servlet engine을 통해 rendering 하므로 test 중에 content를 확인하기 어렵습니다. 하지만 Thymleaf와 같은 template engine은 자체적으로 HTML을 rendering 하기 때문에 test시에도 content를 확인해 볼 수 있어 편리합니다.)

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org"><!-- ① -->
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <h1 th:text="${name}">Name</h1><!-- ② -->
    </body>
    </html>

    ① th를 사용하기 위해 xml name space를 추가합니다.

    ② ${name}에 값이 들어있으면 text에 넣은 후 h1 tag에 보일 값으로 사용하고 그렇지 않으면 Name을 출력합니다.

     

     

     

     

     

    댓글

Designed by Tistory.