본문 바로가기
개발/Spring

타임리프(thymeleaf)

by BellOne4222 2024. 2. 20.

타임리프(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