Spring/SpringMVC

뷰 리졸버

느리지만 꾸준하게 2022. 4. 28. 13:59

뷰 리졸버에 대해서 알아보자.

View를 사용할 수 있도록 아래 코드를 추가해주고

return new ModelAndView("new-form");

원래 만들었던 OldController에서 return 값을 new-form으로 설정해준다.

package hello.setvlet.web.springmvc.old;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component("/springmvc/old-controller")
// @Component 컨트롤러는 /springmvc/old-controller라는 이름의 스프링 빈으로 등록이 되어있고
// 빈의 이름으로 URL을 매핑할 거다.
public class OldController implements Controller {

    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        System.out.println("OldController.handleRequest");
        return new ModelAndView("new-form");
    }
}

 

 

application.properties이다.

logging.level.org.apache.coyote.http11=debug

spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

 

잘나온다.

지금 하고 있는 프로젝트가 스프링 부트인데 스프링 부트는 InternalResourceViewResolver라는 뷰 리졸버를 자동으로 등록하고 이 때, 

application.properties에 등록한 spring.mvc.view.prefix, spring.mvc.view.suffix 설정 정보를 사용해서 등록한다.

아래와 같이 전체 경로를 주어도 동작한다.(권장하지는 않는다.)
return new ModelAndView("/WEB-INF/views/new-form.jsp");

ServletApplication에서 이렇게 등록할 수 있다.

package hello.setvlet;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.context.annotation.Bean;
import org.springframework.web.servlet.view.InternalResourceView;
import org.springframework.web.servlet.view.InternalResourceViewResolver;


@ServletComponentScan // 서블릿 자동 등록
@SpringBootApplication
public class SetvletApplication {

   public static void main(String[] args) {
      SpringApplication.run(SetvletApplication.class, args);
   }

   @Bean
   InternalResourceViewResolver internalResourceViewResolver() {
      return new InternalResourceViewResolver("/WEB-INF/views/", ".jsp");
   }

}

 

 

뷰 리졸버 동작 방식을 보자.

뷰 리졸버 동작 방식

스프링 부트가 자동 등록하는 뷰 리졸버인데

  • 1 = BeanNameViewResolver : 빈 이름으로 뷰를 찾아서 반환한다. (: 엑셀 파일 생성 기능에 사용)
  •  
  • 2 = InternalResourceViewResolver : JSP를 처리할 수 있는 뷰를 반환한다.

 

1. 핸들러 어댑터 호출

핸들러 어댑터를 통해서 new-form이라는 논리 뷰 이름을 획득한다.

 

 

2. ViewResolver 호출

new-form 이라는 뷰 이름으로 viewResolver를 순서대로 호출한다.

BeanNameViewResolver new-form 이라는 이름의 스프링 빈으로 등록된 뷰를 찾아야 하는데 없다.

InternalResourceViewResolver 가 호출된다.

 

3. InternalResourceViewResolver

이 뷰 리졸버는 InternalResourceView 를 반환한다.

 

4. - InternalResourceView

InternalResourceView JSP처럼 포워드 forward() 를 호출해서 처리할 수 있는 경우에 사용한다.

 

5. view.render()

view.render() 가 호출되고 InternalResourceView forward() 를 사용해서 JSP를 실행한다.

 

참고사항을 보자.

InternalResourceViewResolver 는 만약 JSTL 라이브러리가 있으면 InternalResourceView 를
상속받은 JstlView 를 반환한다. JstlView 는 JSTL 태그 사용시 약간의 부가 기능이 추가된다.



다른 뷰는 실제 뷰를 렌더링하지만, JSP의 경우 forward() 통해서 해당 JSP로 이동(실행)해야 렌더링이
된다. JSP를 제외한 나머지 뷰 템플릿들은 forward() 과정 없이 바로 렌더링 된다.



Thymeleaf 뷰 템플릿을 사용하면 ThymeleafViewResolver 를 등록해야 한다. 최근에는 라이브러리만
추가하면 스프링 부트가 이런 작업도 모두 자동화해준다.

 

 

여기까지 스프링 MVC를 위한 디딤돌 단계였다.

 

 

이제 스프링 MVC를 본격적으로 배워보자!

 

 

 

 

 

 

 

 

 

 

 

 

 

<출처 김영한: 스프링 MVC 1편 - 벡앤드 웹 개발 핵심 기술>

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard

 

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의

웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., -

www.inflearn.com