https://sundaland.tistory.com/372
[ ▶ View Resolvers ]
View Resolvers는 Spring MVC에서 클라이언트 요청에 대한 응답을 렌더링할 뷰(HTML, JSON, JSP 등)를 결정하는 역할을 한다. Spring MVC는 다양한 뷰 기술을 지원하며, 이를 위해 ViewResolver를 사용하여 요청이 어떤 뷰로 렌더링될지를 결정한다.
ViewResolver는 컨트롤러가 반환하는 뷰 이름을 실제 뷰로 매핑한다. 예를 들어, 컨트롤러에서 "home"이라는 뷰 이름을 반환하면, 뷰 리졸버는 해당 이름을 실제 뷰 파일(home.jsp 또는 home.html)과 연결한다.
[ ▷ View Resolvers 구성 ]
Spring MVC는 뷰 리졸버 구성을 쉽게 구성할 수 있다. 아래 Java 설정 예시에서는 JSP와 JSON 렌더링을 위한 Content Negotiation 뷰 리졸버를 설정한다. Content Negotiation은 클라이언트가 요청한 콘텐츠 타입(JSON, HTML 등)에 따라 적절한 뷰를 선택할 수 있도록 도와준다.
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
// JSON 렌더링을 위한 Content Negotiation 뷰 리졸버
registry.enableContentNegotiation(new MappingJackson2JsonView());
// JSP 뷰 리졸버
registry.jsp();
}
}
- ViewResolverRegistry: Spring에서 제공하는 ViewResolver를 쉽게 등록할 수 있도록 도와주는 클래스이다. ViewResolverRegistry는 뷰 리졸버를 간단히 추가하고 설정할 수 있는 다양한 메서드를 제공한다.
- enableContentNegotiation(new MappingJackson2JsonView()): 이 메서드는 Content Negotiation을 활성화하여 클라이언트가 요청한 콘텐츠 타입에 따라 응답을 JSON으로 렌더링할 수 있도록 설정한다. MappingJackson2JsonView는 Jackson을 사용하여 Java 객체를 JSON으로 변환하는 뷰이다.
- jsp(): JSP 뷰 리졸버를 등록합니다. 이는 기본적으로 JSP 파일을 찾고 렌더링할 수 있도록 설정하며, JSP 파일은 일반적으로 /WEB-INF/views/ 경로에 위치한다. Spring은 뷰 이름에 .jsp 확장자를 자동으로 추가하여 해당 파일을 찾는다.
[ ▷ Thymeleaf 뷰 리졸버 등록 ]
타임리프는 HTML 템플릿을 사용하여 동적 웹 페이지를 렌더링하는 데 자주 사용되는 뷰 기술이다. 타임리프를 Spring MVC와 함께 사용하려면 타임리프 뷰 리졸버를 등록해야 다. 타임리프를 설정하려면 ThymeleafViewResolver와 SpringTemplateEngine을 구성해야 한다.
▼ JSP와 함께 타임리프 뷰 리졸버를 설정하는 방법
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Bean
public SpringTemplateEngine templateEngine() {
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(templateResolver());
return templateEngine;
}
@Bean
public ThymeleafViewResolver thymeleafViewResolver() {
ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
viewResolver.setTemplateEngine(templateEngine());
viewResolver.setOrder(1); // Thymeleaf 뷰 리졸버의 우선순위 설정
viewResolver.setViewNames(new String[] {"*.html"}); // .html 파일만 처리하도록 설정
return viewResolver;
}
@Bean
public ServletContextTemplateResolver templateResolver() {
ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver();
templateResolver.setPrefix("/WEB-INF/templates/"); // 템플릿 파일의 경로
templateResolver.setSuffix(".html"); // 템플릿 파일 확장자
templateResolver.setTemplateMode("HTML");
templateResolver.setCharacterEncoding("UTF-8");
return templateResolver;
}
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
// 타임리프 뷰 리졸버를 등록
registry.viewResolver(thymeleafViewResolver());
// JSP 뷰 리졸버
registry.jsp();
}
}
[ ▷ 타임 리프 설정 설명 ]
△ SpringTemplateEngine
타임리프 템플릿 엔진을 생성합니다. 이 엔진은 타임리프 템플릿 파일을 처리하는 데 사용된다. templateResolver()를 통해 템플릿 리졸버를 설정하고 타임리프 엔진에 연결한다.
△ ThymeleafViewResolver
타임리프 뷰 리졸버를 설정다. 이 리졸버는 .html 확장자를 가진 파일을 처리하며, 타임리프를 사용하여 HTML 템플릿을 렌더링한다.
- setOrder(1): 뷰 리졸버의 우선순위를 설정한다. 숫자가 작을수록 우선순위가 높다.
- setViewNames("*.html"): 타임리프가 처리할 뷰 파일 확장자를 .html로 지정한다.
△ ServletContextTemplateResolver
타임리프 템플릿 리졸버이다. 템플릿 파일이 위치한 경로(prefix), 파일 확장자(suffix), 템플릿 모드 등을 설정합니다. UTF-8 인코딩을 사용하여 HTML 템플릿을 렌더링한다.
△ configureViewResolvers(ViewResolverRegistry registry)
타임리프 뷰 리졸버와 JSP 뷰 리졸버를 모두 등록한다. 타임리프 뷰 리졸버가 먼저 등록되었으므로 .html 요청은 타임리프가 처리하고, 그 외에는 JSP 뷰 리졸버가 처리하게 된다.
[ ▷ 요약 ]
- iew Resolvers는 Spring MVC에서 요청을 적절한 뷰로 매핑하는 중요한 구성 요소이다.
- Content Negotiation을 사용하여 클라이언트가 요청한 콘텐츠 타입에 따라 JSON 또는 HTML 응답을 동적으로 렌더링할 수 있다.
- JSP 뷰 리졸버는 JSP 파일을 처리하고, 타임리프 뷰 리졸버는 타임리프 템플릿을 사용하여 HTML 파일을 처리할 수 있다.
- 타임리프와 JSP를 모두 사용할 경우, 각 뷰 리졸버의 우선순위를 설정하여 요청한다.
'Web on Servlet Stack' 카테고리의 다른 글
Annotated Controllers[1] (1) | 2024.10.16 |
---|---|
Path Matching (0) | 2024.10.15 |
View Controllers (0) | 2024.10.15 |
Content Types (1) | 2024.10.15 |
Validation (0) | 2024.10.15 |