-
[16] Spring Web MVC : Template EngineSpring/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으로 권장하지 않는 이유는 다음과 같습니다.
- JAR패키징 할 때는 동작하지 않고, WAR패키징 해야 함.
- JSP 의존성 추가 시 문제 발생할 가능성이 있음
- Undertow는 JSP를 지원하지 않음.
- https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-jsp-limitations
[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을 출력합니다.
'Spring > Spring boot' 카테고리의 다른 글
[18] Spring Web MVC : ExceptionHandler (0) 2020.06.28 [17] Spring Web MVC : HtmlUnit (0) 2020.06.26 [15] Spring Web MVC : Index page and Favicon (0) 2020.06.24 [14] Spring Web MVC : Web JAR (0) 2020.06.23 [13] Spring Web MVC : static resource 지원 (0) 2020.06.22