ViewResolver ?
ViewResolver(VS)는 말 그대로 뷰(View)를 결정하는 역할을 한다.
Spring MVC 구조에서, 컨트롤러가 요청을 처리한 후, 클라이언트에게 어떤 뷰 페이지를 보여줄지 결정할 때 ViewResolver가 개입하게 된다.
페이지 이동 시 VR이 관여하고, setter 주입 방식을 사용하므로 prefix와 suffix를 property로 설정한다.
컨트롤러가 반환하는 뷰의 이름(예: "login" 또는 "main")을 받아서 실제 JSP 파일 경로로 변환해주는 객체가 바로 ViewResolver다.
Spring에서는 다양한 ViewResolver를 제공하는데, 그 중 가장 많이 사용하는 것은 InternalResourceViewResolver다.
이 ViewResolver는 JSP, HTML과 같은 서버 쪽에서 처리할 수 있는 파일들에 대한 뷰를 반환해준다.
InternalResourceViewResolver 설정
InternalResourceViewResolver는 JSP 파일을 사용해서 화면을 렌더링할 때 주로 쓰인다.
여기서 렌더링이란, 코드를 실제 화면으로 바꾸는 과정을 뜻한다.
이 때 중요한 게 prefix와 suffix 속성이다.
prefix는 JSP 파일의 경로 앞부분을 설정한다.
suffix는 파일의 확장자를 설정한다.
ViewResolver 경로

ViewResolver는 xml 파일 안에 설정한다.
WEB-INF/web.xml이 다음과 같다면,
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="https://jakarta.ee/xml/ns/jakartaee" xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd" version="6.0">
<servlet>
<servlet-name>ds</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ds</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
위 web.xml 코드에 의해 Spring은 (같은 경로의)ds-servlet.xml 파일을 찾게 된다.
ViewResolver는 WEB-INF/ds-servlet.xml 파일안에 설정한다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd">
<context:component-scan base-package="com.yn.app.view.member" />
<context:component-scan base-package="com.yn.app.view.board" />
<context:component-scan base-package="com.yn.app.biz.member" />
<context:component-scan base-package="com.yn.app.biz.board" />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="viewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
위 코드는 xml 전체 코드이고, 아래부분만 설명해보려고 한다.

여기서는 prefix로 "/WEB-INF/views/"를 주고, suffix로 ".jsp"를 줬기 때문에,
컨트롤러가 반환하는 뷰의 이름이 "main"이면 실제 파일 경로는 "/WEB-INF/views/main.jsp"가 된다.
이런 방식으로 JSP 파일을 WEB-INF 폴더에 숨겨서 외부 클라이언트가 직접 접근하지 못하게 하고,
Spring의 ViewResolver를 통해서만 접근하게 만들 수 있다.
ViewResolver의 필요성
ViewResolver는 클라이언트가 요청한 작업이 끝난 후 어떤 페이지로 이동할지 결정한다. 그럼 왜 이게 필요할까?
- URL 구조의 통일성: 뷰 파일의 경로가 매번 다르면 코드가 지저분해지고 관리가 어려워진다. ViewResolver는 경로 앞뒤를 고정적으로 설정해줌으로써 개발자가 깔끔하게 관리할 수 있게 해준다.
- 보안성 강화: 중요한 페이지는 WEB-INF 하위에 넣어두면 클라이언트가 직접 접근할 수 없다. ViewResolver를 통해서만 접근하게 되어 보안이 강화된다.
- 유연성: ViewResolver를 활용하면 같은 이름의 뷰를 여러 경로에 맞춰 다르게 설정할 수 있다. 예를 들어, 관리자의 페이지는 /WEB-INF/admin/, 일반 사용자의 페이지는 /WEB-INF/user/에 배치하는 식으로 설정할 수 있다.
ViewResolver가 없는 경우
간혹, ViewResolver가 필요 없는 경우도 있다.
특정 페이지에서 리다이렉트를 해야 할 때는 ViewResolver를 거치지 않고 직접 JSP 파일로 이동시킬 수 있다.
ModelAndView mav = new ModelAndView();
mav.setViewName("redirect:login.jsp");
위 코드에서 보면, redirect:를 붙여주면 직접 해당 JSP 파일로 이동시키면서 ViewResolver는 사용하지 않게 된다.
이 경우는, 로그인 페이지나 외부 리다이렉션이 필요한 상황에서 유용하다.
ViewResolver 처리 순서
Spring MVC의 전체적인 흐름을 보면, ViewResolver가 어떻게 동작하는지 쉽게 이해할 수 있다.
- Tomcat 서버 구동: Spring 애플리케이션이 실행되면 Tomcat(또는 다른 서블릿 컨테이너)이 구동된다. 이때, 서블릿 컨테이너는 web.xml 또는 애너테이션 기반 설정 파일을 읽어들여 설정을 초기화한다.
- DispatcherServlet이 요청을 받음: 클라이언트로부터 요청이 들어오면, Spring의 DispatcherServlet이 모든 요청을 처리하기 위해 가장 먼저 요청을 받는다. web.xml에서 이 서블릿이 요청을 처리하도록 설정되어 있어야 한다.
- HandlerMapper가 컨트롤러 호출: DispatcherServlet은 요청 URL을 분석한 후, HandlerMapper를 사용해 요청을 처리할 적절한 컨트롤러 메서드를 찾는다. 이 컨트롤러 메서드는 비즈니스 로직을 처리하거나, 데이터를 조회하고 가공하는 작업을 수행한다.
- 컨트롤러에서 뷰 이름 반환: 컨트롤러는 비즈니스 로직을 처리한 후, JSP와 같은 뷰를 렌더링하기 위해 뷰 이름(String 형태)을 반환한다. 이 뷰 이름은 실제 파일의 이름이 아니라 ViewResolver가 경로를 완성해줄 (파일명을 제외한) 뷰 이름이다.
- ViewResolver가 View 경로 결정: ViewResolver는 이 뷰 이름을 받아서 미리 설정된 prefix와 suffix를 붙여서 실제 파일 경로로 변환한다. View 이름이 "main"이라면, ViewResolver는 prefix와 suffix를 붙여 "/WEB-INF/views/main.jsp"로 변환한다.
- JSP 파일 렌더링: ViewResolver가 찾아낸 파일 경로에 해당하는 JSP 파일을 브라우저에 표시할 수 있도록 처리한다. 이 때 JSP 파일이 실행되어 HTML 코드로 변환되며, 최종적으로 클라이언트에게 렌더링되어 화면에 표시된다.
이 순서에서 ViewResolver는 뷰 이름을 파일 경로로 매핑해주는 중요한 역할을 한다.
ViewResolver의 의존성 주입(DI)
Spring에서 ViewResolver는 의존성 주입을 통해 관리된다.
앞서 말했듯이 보통 setter 주입을 통해 prefix와 suffix를 설정하게 된다.
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="viewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
위 설정에서 prefix와 suffix는 Spring의 DI에 의해 주입되며,
개발자는 각각의 뷰에 대해 따로 경로를 설정할 필요 없이 편리하게 관리할 수 있다.
'Spring' 카테고리의 다른 글
[Spring] 2-Layered 아키텍처 정리 (0) | 2024.10.10 |
---|---|
[Spring] 스테레오타입 어노테이션과 @RequestMapping (0) | 2024.10.09 |
[Spring] DispatcherServlet과 Spring MVC의 핵심 흐름 분석 (0) | 2024.10.07 |
[Spring] DispatcherServlet, ViewResolver , DI 방식 정리 (0) | 2024.10.07 |
[Spring] Spring DI와 비즈니스 로직 (2) | 2024.10.06 |