실무/[ 스프링 ]

[ 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 요청을 받아들이고, 이를 처리하는 중심 컨트롤러이다.

  1. 클라이언트의 요청을 받아들이고 핸들러(controller)에게 전달.
  2. 핸들러가 요청 처리 후, 그 결과로부터 적절한 뷰를 결정하고 실행.
  3. 뷰에서 생성된 응답을 클라이언트에게 전송

따라서 HTTP 프로토콜로 들어오는 모든 요청을 가장 먼저 받아  적합한 컨트롤러에 위임해주는 컨트롤러이다.

 

 

 

ViewResolver란?

스프링에서 뷰 이름을 실제 뷰 객체로 매핑하는 역할을 하는 인터페이스.

즉, 컨트롤러에서 반환한 뷰 이름을 기반으로 실제 사용할 뷰 객체를 결정하는 것.

  1. 핸들러(컨트롤러)에서 반환된 뷰 이름을 해석하여 실제 사용할 뷰 객체를 찾는다.
  2. 해당 뷰 객체를 생성 및 초기화
  3. 생성된 뷰 객체를 반환하여 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 경로로 뷰를 이동시키는 과정

  1. 사용자가 브라우저에서 특정 url요청
  2. DispatcherServlet이 받아서 컨트롤러에 전달
  3. 컨트롤러가 요청 처 후 비즈니스 로직 실행 후 보여줄 뷰의 이름 반환(경로 기입).
  4. DispatcherServlet으로 뷰의 이름을 받고, ViewResolver에게 전달하여 실제 뷰 객체 얻음
  5. ViewResolver는 이 이름을 기반으로 적절한 뷰 객체 생성.
  6. DispatcherServlet은 생성된 뷰 객체를 사용하여 클라이언트에게 응답을 보냄. 뷰객체는 모델에 담긴 데이터를 사용하여 동적인 HTML을 생성하고, 이를 클라이언트에게 반환.

따라서 return "/user/login/loginUserView"; 코드는 실제로 브라우저에게 해당 경로의 뷰를 보여달라는 지시이다.

이는 ViewResolver에 의해 해석되어 실제 뷰로 변환되고 클라이언트에게 전달된다.

 

 

 

 

 

728x90
반응형