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
위와 같이 추가해주면
서버를 재기동해주면 아래와 같이 나온다.
스프링 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를 등록해야 한다. 최근에는 라이브러리만 추가하면 스프링 부트가 이런 작업도 모두 자동화해준다.
'스프링 > 스프링 웹' 카테고리의 다른 글
[Spring] 스프링 MVC 컨트롤러 통합 (0) | 2023.05.31 |
---|---|
[Spring] 스프링 MVC로 적용하기 - @RequestMapping, @Controller (0) | 2023.05.31 |
[Spring] 핸들러 매핑과 핸들러 어댑터 (0) | 2023.05.25 |
[Spring] 스프링 MVC 전체 구조, 스프링 MVC 동작순서 (0) | 2023.05.25 |
[Spring] HandlerAdapter를 적용한 유연한 컨트롤러2 - v5 (0) | 2023.05.25 |
댓글