타임리프(thymeleaf)
- HTML5 웹 표준을 준수하는 템플릿
- 전체적인 문법이 HTML5 마크업 표준을 최대한 해치지 않게 설계
- Decoupled logic : 템플릿 문법을 아예 템플릿에서 분리 가능
- 템플릿 엔진이 작동하지 않아도 렌더링 되는 정적 목업 페이지
- 순수한 마크업으로만 구성
- 템플릿 문법 적용
- th: tag
- data-th attribute
- decoupled logic
- • Variable Expressions: ${...}
• Selection Variable Expressions: *{...}
• Message Expressions: #{...}
• Link URL Expressions: @{...}
• Fragment Expressions: ~{...}
Thymeleaf 문법
- ${name}
- 변수 name 값 불러오기
- th:with
- 변수값 지정
- th:text
- text 수정
- th:block, th:if, th:unless
- 자바의 if else
- th:switch, th:case
- 자바의 switch case
- th:each
- 반복문
- th:fragment
- 공통 layout을 나누고 사용
// eventController
@GetMapping
public ModelAndView events() {
Map<String, Object> map = new HashMap<>();
map.put("events", List.of(EventResponse.of(
1L,
"오후 운동",
EventStatus.OPENED,
LocalDateTime.of(2021, 1, 1, 13, 0,0),
LocalDateTime.of(2021, 1, 1, 16, 0,0),
0,
24,
"마스크 꼭 착용하세요"
), EventResponse.of(
1L,
"오후 운동",
EventStatus.OPENED,
LocalDateTime.of(2021, 1, 1, 13, 0,0),
LocalDateTime.of(2021, 1, 1, 16, 0,0),
0,
24,
"마스크 꼭 차용하세요"
)
));
return new ModelAndView("event/index", map);
}
// eventControllerTest
class EventControllerTest {
private final MockMvc mvc;
public EventControllerTest(@Autowired MockMvc mvc) {
this.mvc = mvc;
}
@DisplayName("[view][GET] 이벤트 리스트 페이지")
@Test
void givenNothing_whenRequestingEventsPage_thenReturnsEventsPage() throws Exception {
// Given
// When & Then
mvc.perform(get("/events"))
.andExpect(status().isOk())
.andExpect(content().contentTypeCompatibleWith(MediaType.TEXT_HTML))
.andExpect(view().name("event/index"))
.andExpect(model().hasNoErrors())
.andExpect(model().attributeExists("events"));
}
@DisplayName("[view][GET] 이벤트 세부 정보 페이지")
@Test
void givenEventId_whenRequestingEventDetailPage_thenReturnsEventDetailPage() throws Exception {
// Given
long eventId = 1L;
// When & Then
mvc.perform(get("/events/" + eventId))
.andExpect(status().isOk())
.andExpect(content().contentTypeCompatibleWith(MediaType.TEXT_HTML))
.andExpect(view().name("event/detail"))
.andExpect(model().hasNoErrors())
.andExpect(model().attributeExists("event"));
}
}
- decoupled logic 설정
@Configuration
public class ThymeleafConfig {
@Bean
public SpringResourceTemplateResolver thymeleafTemplateResolver(
SpringResourceTemplateResolver defaultTemplateResolver,
Thymeleaf3Properties thymeleaf3Properties
) {
defaultTemplateResolver.setUseDecoupledLogic(thymeleaf3Properties.isDecoupledLogic());
return defaultTemplateResolver;
}
@Getter
@RequiredArgsConstructor
@ConfigurationProperties("spring.thymeleaf3")
public static class Thymeleaf3Properties {
/**
* Thymeleaf 3 Decoupled Logic 활성화
*/
private final boolean decoupledLogic;
}
}
결과
'개발 > Spring' 카테고리의 다른 글
Actuator (0) | 2024.02.24 |
---|---|
Devtool (0) | 2024.02.24 |
비즈니스 로직 테스트 (0) | 2024.02.20 |
spring boot properties (0) | 2024.02.20 |
오류 처리 (0) | 2024.02.19 |