뷰 리졸버에 대해서 알아보자.
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
'Spring > SpringMVC' 카테고리의 다른 글
SpringMVC 구조 정리 (0) | 2022.04.28 |
---|---|
스프링 MVC를 시작과 컨트롤러 통합 & 실용적인 방식 (0) | 2022.04.28 |
핸들러 매핑과 핸들러 어댑터 (0) | 2022.04.28 |
스프링 MVC 전체 구조 (0) | 2022.04.25 |
유연한 컨트롤러2 - v5 (0) | 2022.04.25 |