핸들러 매핑과 핸들링 어댑터
SpringMVC 구조

<동작순서>
1. 핸들러 조회 : 핸들러 매핑을 통해 요청 URL에 매핑된 핸들러를 조회한다.
2. 핸들러 어댑터 조회 : 핸들러를 실행할 수 있는 핸들러 어댑터를 조회한다.
3. 핸들러 어댑터 실행 : 핸들러 어댑터를 실행한다.
4. 핸들러 실행
5. ModelAndView 반환 : 핸들러 어댑터는 핸들러가 반환하는 정보를 ModelAndView로 변환해서 반환한다.
6. viewResolver 호출 : 뷰 리졸버를 찾고 실행한다.
7. View 반환 : 뷰 리졸버는 뷰의 논리 이름을 물리 이름으로 바꾸고, 렌더링 역할을 담당하는 뷰 객체를 반환한다.
8. 뷰 렌더링 : 뷰를 통해서 뷰를 렌더링한다.
HttpRequestHandler
public interface HttpRequestHandler {
void handleRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException;
}
간단하게 구현해보자.
@Component("/springmvc/request-handler")
public class MyHttpRequestHandler implements HttpRequestHandler {
@Override
public void handleRequest(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
System.out.println("MyHttpRequestHandler.handleRequest");
}
}
1. 핸들러 매핑으로 핸들러 조회
1. HandlerMapping을 순서대로 실행해서 핸들러를 찾는다.
2. 이 경우 빈 이름으로 핸들러를 찾아야 하기 때문에 이름 그대로 빈 이름으로 핸들러를 찾아주는
BeanNameUrlHandlerMapping가 실행에 성공하고 핸들러인 MyHttpRequestHandler를 반환한다.
2. 핸들러 어댑터 조회
1. HandlerAdapter의 supports()를 순서대로 호출한다.
2. HttpRequestHandlerAdapter가 HttpRequestHandler 인터페이스를 지원하므로 대상이 된다..
3. 핸들러 어댑터 실행
1. 디스패처 서블릿이 조회한 HttpRequestHandlerAdapter를 실행하면서 핸들러 정보도 함께 넘겨준다.
2. HttpRequestHandlerAdapter는 핸들러인 MyHttpRequestHandler를 내부에서 실행하고, 그 결과를 반환한다.
뷰 리졸버
@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");
}
}
View를 사용할 수 있도록
return new ModelAndView("new-form"); 을 추가
스프링 부트가 자동등록하는 주요 뷰 리졸버
1. BeanNameViewResolver : 빈 이름으로 뷰를 찾아서 반환한다.
2. InternalResourceViewResolver : JSP를 처리할 수 있는 뷰를 반환한다.
<동작 순서>
1. 핸들러 어댑터를 통해 new-form 이라는 논리 뷰 이름을 획득한다.
2. new-form 이라는 뷰 이름으로 viewResolver를 순서대로 호출한다.
BeanNameViewResolver 는 new-form 이라는 이름의 스프링 빈으로 등록된 뷰를 찾아야 하는데 없다.
InternalResourceViewResolver가 호출된다.
3. 뷰 리졸버가 InternalResourceViewResolver를 반환한다.
4. InternalResourceView는 JSP처럼 forward()를 호출해서 처리할 수 있는 경우에 사용한다.
5. view.render()가 호출되고 InternalResourceView는 forward()를 사용해서 JSP를 실행한다.
'🍀Spring > Web MVC' 카테고리의 다른 글
[MVC] 타임리프 - 표준 표현식 구문 (0) | 2024.07.21 |
---|---|
[MVC] 타임리프 - 기본 기능, 텍스트 (1) | 2024.07.20 |
[MVC] 요청 매핑 (RequestMapping, HTTP 메서드) (0) | 2024.05.05 |
[MVC] MVC 패턴 (0) | 2024.03.31 |
[MVC] 서블릿 - HttpServletRequest (0) | 2024.03.30 |
핸들러 매핑과 핸들링 어댑터
SpringMVC 구조

<동작순서>
1. 핸들러 조회 : 핸들러 매핑을 통해 요청 URL에 매핑된 핸들러를 조회한다.
2. 핸들러 어댑터 조회 : 핸들러를 실행할 수 있는 핸들러 어댑터를 조회한다.
3. 핸들러 어댑터 실행 : 핸들러 어댑터를 실행한다.
4. 핸들러 실행
5. ModelAndView 반환 : 핸들러 어댑터는 핸들러가 반환하는 정보를 ModelAndView로 변환해서 반환한다.
6. viewResolver 호출 : 뷰 리졸버를 찾고 실행한다.
7. View 반환 : 뷰 리졸버는 뷰의 논리 이름을 물리 이름으로 바꾸고, 렌더링 역할을 담당하는 뷰 객체를 반환한다.
8. 뷰 렌더링 : 뷰를 통해서 뷰를 렌더링한다.
HttpRequestHandler
public interface HttpRequestHandler {
void handleRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException;
}
간단하게 구현해보자.
@Component("/springmvc/request-handler")
public class MyHttpRequestHandler implements HttpRequestHandler {
@Override
public void handleRequest(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
System.out.println("MyHttpRequestHandler.handleRequest");
}
}
1. 핸들러 매핑으로 핸들러 조회
1. HandlerMapping을 순서대로 실행해서 핸들러를 찾는다.
2. 이 경우 빈 이름으로 핸들러를 찾아야 하기 때문에 이름 그대로 빈 이름으로 핸들러를 찾아주는
BeanNameUrlHandlerMapping가 실행에 성공하고 핸들러인 MyHttpRequestHandler를 반환한다.
2. 핸들러 어댑터 조회
1. HandlerAdapter의 supports()를 순서대로 호출한다.
2. HttpRequestHandlerAdapter가 HttpRequestHandler 인터페이스를 지원하므로 대상이 된다..
3. 핸들러 어댑터 실행
1. 디스패처 서블릿이 조회한 HttpRequestHandlerAdapter를 실행하면서 핸들러 정보도 함께 넘겨준다.
2. HttpRequestHandlerAdapter는 핸들러인 MyHttpRequestHandler를 내부에서 실행하고, 그 결과를 반환한다.
뷰 리졸버
@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");
}
}
View를 사용할 수 있도록
return new ModelAndView("new-form"); 을 추가
스프링 부트가 자동등록하는 주요 뷰 리졸버
1. BeanNameViewResolver : 빈 이름으로 뷰를 찾아서 반환한다.
2. InternalResourceViewResolver : JSP를 처리할 수 있는 뷰를 반환한다.
<동작 순서>
1. 핸들러 어댑터를 통해 new-form 이라는 논리 뷰 이름을 획득한다.
2. new-form 이라는 뷰 이름으로 viewResolver를 순서대로 호출한다.
BeanNameViewResolver 는 new-form 이라는 이름의 스프링 빈으로 등록된 뷰를 찾아야 하는데 없다.
InternalResourceViewResolver가 호출된다.
3. 뷰 리졸버가 InternalResourceViewResolver를 반환한다.
4. InternalResourceView는 JSP처럼 forward()를 호출해서 처리할 수 있는 경우에 사용한다.
5. view.render()가 호출되고 InternalResourceView는 forward()를 사용해서 JSP를 실행한다.
'🍀Spring > Web MVC' 카테고리의 다른 글
[MVC] 타임리프 - 표준 표현식 구문 (0) | 2024.07.21 |
---|---|
[MVC] 타임리프 - 기본 기능, 텍스트 (1) | 2024.07.20 |
[MVC] 요청 매핑 (RequestMapping, HTTP 메서드) (0) | 2024.05.05 |
[MVC] MVC 패턴 (0) | 2024.03.31 |
[MVC] 서블릿 - HttpServletRequest (0) | 2024.03.30 |