본문 바로가기
스프링/스프링 웹

[Spring] 뷰 리졸버(View Resolver)

by drCode 2023. 5. 31.
728x90
반응형

OldController 에서 View를 조회할 수 있도록 변경한다.

 

package helloMVC.servlet.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")
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");
    }
}

실행 결과

실행하면 위와 같이 나온다.

 

추가 작업을 해줘야 하는데,

 

(1) ServletApplication 에 Bean 추기

 

package helloMVC.servlet;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;

@ServletComponentScan   // 서블릿 자동 등록하는 역할
@SpringBootApplication
public class ServletApplication {

	public static void main(String[] args) {

		SpringApplication.run(ServletApplication.class, args);
	}
	
	
	// 이거를 스프링 부트가 직접 해줌
	@Bean
	InternalResourceViewResolver internalResourceViewResolver() {
		return new InternalResourceViewResolver("/WEB-INF/views", ".jsp");
	}

}

이렇게 해주거나

 

(2) application.properties 에 설정 추가

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

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

 

위와 같이 추가해주면 

 

서버를 재기동해주면 아래와 같이 나온다.

new-form

 

스프링 MVC 구조에서 뷰 리졸버 동작 방식은 아래와 같다.

스프링 MVC 구조에서 뷰 리졸버 동작 방식

 

1. 핸들러 조회

2. 핸들러를 처리할 수 있는 핸들러 어댑터 조회

3. handle(handler)

4. handler 호출

5. ModelAndView 반환

6. viewResolver 호출

7. View 반환

8. render(model) 호출

 

아래의 내용은 스프링 부트가 자동으로 뷰 리졸버를 등록하는 과정을 보여준다.

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를 등록해야 한다. 최근에는 라이브러리만 추가하면 스프링 부트가 이런 작업도 모두 자동화해준다.

728x90
반응형

댓글