2024. 10. 15. 05:11ㆍSpring Framework/Web on Servlet Stack
Spring MVC의 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 뷰 리졸버가 처리하게 됩니다.
결론
- View Resolvers는 Spring MVC에서 요청을 적절한 뷰로 매핑하는 중요한 구성 요소입니다.
- Content Negotiation을 사용하여 클라이언트가 요청한 콘텐츠 타입에 따라 JSON 또는 HTML 응답을 동적으로 렌더링할 수 있습니다.
- JSP 뷰 리졸버는 JSP 파일을 처리하고, 타임리프 뷰 리졸버는 타임리프 템플릿을 사용하여 HTML 파일을 처리할 수 있습니다.
- 타임리프와 JSP를 모두 사용할 경우, 각 뷰 리졸버의 우선순위를 설정하여 요청
'Spring Framework > Web on Servlet Stack' 카테고리의 다른 글
Path Matching (0) | 2024.10.15 |
---|---|
Default Servlet (0) | 2024.10.15 |
View Controllers (1) | 2024.10.15 |
Message Converters (0) | 2024.10.15 |
Content Types (0) | 2024.10.15 |