<div th:unless="${#lists.isEmpty(books)}"> <!-- books 리스트가 empty가 아니면 -->
<dl th:each="book: ${books}"> <!--반복문, books 리스트에 포함된 각 book 객체 처리 -->
...
☑️ #lists는 Thymeleaf가 제공하는 객체 중 하나
# 실행되는 SQL query를 console에 출력
spring.jpa.properites.hibernate.show_sql=true
# SQL query를 가독성 좋게 formatting
spring.jpa.properties.hibernate.format_sql=true
# 데이터베이스 초기화 전략: 기존 테이블 재생성 및 종료 시 삭제 (default)
spring.jpa.hibernate.ddl-auto=create-drop
# SQL query에 대한 binding parameter 값 출력
logging.level.org.hibernate.type.descriptor.sql=trace
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/shop/index.do").setViewName("index");
registry.addViewController("/shop/signonForm.do").setViewName("SignonForm");
}
/shop/index.do
에 대한 요청이 들어왔을 때, index
이라는 이름의 view를 보여줌@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Autowired
private CustomInterceptor customInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
// CustomInterceptor를 모든 요청 경로에 대해 적용
registry.addInterceptor(customInterceptor).addPathPatterns("/**");
}
}
🌠 인터셉터는 주로 다음과 같은 메서드를 가지고 있습니다:
public class CustomInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// 요청이 컨트롤러에 도달하기 전에 실행되는 코드
System.out.println("Pre Handle method is Calling");
return true; // true를 반환하면 다음 인터셉터 또는 컨트롤러로 요청이 전달됩니다.
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// 컨트롤러의 메서드가 실행된 후, 뷰가 렌더링되기 전에 실행되는 코드
System.out.println("Post Handle method is Calling");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// 뷰가 렌더링된 후 실행되는 코드
System.out.println("Request and Response is completed");
}
}