View Resolvers

2024. 10. 15. 05:11Spring 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();
    }
}

코드 설명:

  1. ViewResolverRegistry: Spring에서 제공하는 ViewResolver를 쉽게 등록할 수 있도록 도와주는 클래스입니다. ViewResolverRegistry는 뷰 리졸버를 간단히 추가하고 설정할 수 있는 다양한 메서드를 제공합니다.
  2. enableContentNegotiation(new MappingJackson2JsonView()): 이 메서드는 Content Negotiation을 활성화하여 클라이언트가 요청한 콘텐츠 타입에 따라 응답을 JSON으로 렌더링할 수 있도록 설정합니다. MappingJackson2JsonView는 Jackson을 사용하여 Java 객체를 JSON으로 변환하는 뷰입니다.
  3. jsp(): JSP 뷰 리졸버를 등록합니다. 이는 기본적으로 JSP 파일을 찾고 렌더링할 수 있도록 설정하며, JSP 파일은 일반적으로 /WEB-INF/views/ 경로에 위치합니다. Spring은 뷰 이름에 .jsp 확장자를 자동으로 추가하여 해당 파일을 찾습니다.

Thymeleaf 뷰 리졸버 등록

타임리프는 HTML 템플릿을 사용하여 동적 웹 페이지를 렌더링하는 데 자주 사용되는 뷰 기술입니다. 타임리프를 Spring MVC와 함께 사용하려면 타임리프 뷰 리졸버를 등록해야 합니다. 타임리프를 설정하려면 ThymeleafViewResolverSpringTemplateEngine을 구성해야 합니다.

아래는 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();
    }
}

타임리프 설정 설명:

  1. SpringTemplateEngine: 타임리프 템플릿 엔진을 생성합니다. 이 엔진은 타임리프 템플릿 파일을 처리하는 데 사용됩니다. templateResolver()를 통해 템플릿 리졸버를 설정하고 타임리프 엔진에 연결합니다.
  2. ThymeleafViewResolver: 타임리프 뷰 리졸버를 설정합니다. 이 리졸버는 .html 확장자를 가진 파일을 처리하며, 타임리프를 사용하여 HTML 템플릿을 렌더링합니다.
    • setOrder(1): 뷰 리졸버의 우선순위를 설정합니다. 숫자가 작을수록 우선순위가 높습니다.
    • setViewNames("*.html"): 타임리프가 처리할 뷰 파일 확장자를 .html로 지정합니다.
  3. ServletContextTemplateResolver: 타임리프 템플릿 리졸버입니다. 템플릿 파일이 위치한 경로(prefix), 파일 확장자(suffix), 템플릿 모드 등을 설정합니다. UTF-8 인코딩을 사용하여 HTML 템플릿을 렌더링합니다.
  4. 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