실무/[ 스프링 ]
[ Spring ] 컨트롤러는 어떻게 특정 경로로 이동 시킬까?
glenn93
2024. 4. 12. 10:06
728x90
반응형
어떤 원리로 return 경로로 뷰를 이동시킬까?
아래 코드에서 로직이 끝나면, return "/user/login/loginUserView"; 경로로 뷰를 이동시켜준다.
어떠한 원리로 이를 이동시키는 걸까?
@RequestMapping(value = {"/user/login/loginUserView.do"})
public String loginUserView(@ModelAttribute("loginVO") LoginVO loginVO, HttpServletRequest request, ModelMap model) throws Exception {
String login_error = request.getParameter("login_error") == null ? "" : request.getParameter("login_error");
model.addAttribute("login_error", login_error);
// INFO : 공인인증서 인증 후 실패 했을 때
if (TypeValidator.isNotEmpty(request.getParameter("alertMessage"))) {
model.addAttribute("message", request.getParameter("alertMessage"));
}
// IP 체크
try {
if (!mngrManageService.viewMngrIpCheck(request)) {
return "redirect:https://www.xxx.co.kr";
}
} catch (Exception e) {
LOGGER.error("아이피 체크 에러", e);
}
return "/user/login/loginUserView";
}
먼저 DispatcherServlet, ViewResolver의 이해가 필요하다.
DispatcherServlet 이란?
DispatcherServlet은 Spring MVC 프레임워크에서 중심적인 역할을 하는 클래스이다.
웹 애플리케이션의 모든 HTTP 요청을 받아들이고, 이를 처리하는 중심 컨트롤러이다.
- 클라이언트의 요청을 받아들이고 핸들러(controller)에게 전달.
- 핸들러가 요청 처리 후, 그 결과로부터 적절한 뷰를 결정하고 실행.
- 뷰에서 생성된 응답을 클라이언트에게 전송
따라서 HTTP 프로토콜로 들어오는 모든 요청을 가장 먼저 받아 적합한 컨트롤러에 위임해주는 컨트롤러이다.
ViewResolver란?
스프링에서 뷰 이름을 실제 뷰 객체로 매핑하는 역할을 하는 인터페이스.
즉, 컨트롤러에서 반환한 뷰 이름을 기반으로 실제 사용할 뷰 객체를 결정하는 것.
- 핸들러(컨트롤러)에서 반환된 뷰 이름을 해석하여 실제 사용할 뷰 객체를 찾는다.
- 해당 뷰 객체를 생성 및 초기화
- 생성된 뷰 객체를 반환하여 DispatcherServlet이 클라이언트에게 응답을 보냄.
아래 <beans:property name="viewResolvers"> 관련 설명.
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xsi:schemaLocation="
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<beans:bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<!-- URL과 컨트롤러를 매핑하는 설정 -->
</beans:bean>
<beans:bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="viewResolvers">
<beans:list>
<beans:bean class="org.springframework.web.servlet.view.BeanNameViewResolver" />
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:viewClass="org.springframework.web.servlet.view.JstlView"
p:prefix="/WEB-INF/views/"
p:suffix=".jsp" />
</beans:list>
</beans:property>
</beans:bean>
<!-- 기타 Spring MVC 설정 -->
</beans:beans>
1. BeanNameViewResolver
- Spring에서 관리하는 빈 이름과 일치하는 뷰를 찾는다
- 예를 들어, 컨트롤러가 "home"이라는 뷰 이름을 반환하면, BeanNameViewResolver는 home이라는 이름을 가진 빈을 찾는다.
2. InternalResourceViewResolver
- 논리적인 뷰 이름을 물리적인 경로로 변환한다. 여기서는 JSP 뷰를 사용하도록 설정되어있음.
- prefix와 suffix 속성을 사용하여, 논리적인 뷰 이름에 앞뒤로 경로를 추가한다.
- 예를 들어, 컨트롤러가 "home"이라는 뷰 이름을 반환하면, InternalResourceViewResolver는 "/WEB-INF/views/home.jsp" 파일을 찾는다.
결론 ! return 경로로 뷰를 이동시키는 과정
- 사용자가 브라우저에서 특정 url요청
- DispatcherServlet이 받아서 컨트롤러에 전달
- 컨트롤러가 요청 처 후 비즈니스 로직 실행 후 보여줄 뷰의 이름 반환(경로 기입).
- DispatcherServlet으로 뷰의 이름을 받고, ViewResolver에게 전달하여 실제 뷰 객체 얻음
- ViewResolver는 이 이름을 기반으로 적절한 뷰 객체 생성.
- DispatcherServlet은 생성된 뷰 객체를 사용하여 클라이언트에게 응답을 보냄. 뷰객체는 모델에 담긴 데이터를 사용하여 동적인 HTML을 생성하고, 이를 클라이언트에게 반환.
따라서 return "/user/login/loginUserView"; 코드는 실제로 브라우저에게 해당 경로의 뷰를 보여달라는 지시이다.
이는 ViewResolver에 의해 해석되어 실제 뷰로 변환되고 클라이언트에게 전달된다.
728x90
반응형