티스토리 뷰

카테고리 없음

[Spring]ViewResolver

박강균 IT 2021. 4. 8. 18:17

View Resolver

뷰를 선택하는 것도 컨트롤러의 역할이다.
하지만 위처럼 컨트롤러에서 매번 뷰를 생성하는 것은 비효율적이므로, 스프링에서는 이 작업을 적절히 분리하였다.
컨트롤러는 뷰의 논리적인 이름만을 리턴한 뒤 역할을 종료하고, 이를 DispatcherServlet의 뷰 리졸버가 받아 사용할 뷰 오브젝트를 찾고 생성하는 작업을 진행해준다.
게다가 뷰 리졸버는 보통 뷰 오브젝트를 캐싱하므로 같은 URL의 뷰가 반복적으로 만들어지지 않는 장점도 있다.
뷰 리졸버도 하나 이상 등록해서 사용할 수 있는데, 이때는 핸들러 매핑처럼 order 프로퍼티를 이용해 적용 순서를 적용해주는 것이 좋다.
뷰 리졸버는 ViewResolver 인터페이스를 구현해서 생성한다.

public interface ViewResolver{
    View resolveViewName(String viewName, Locale locale) throws Exception;
}

 

InternalResourceViewResolver

주로 JSP를 사용할 때 쓰이는 뷰 리졸버이다.
뷰를 생성할 필요없이 논리적인 이름만을 리턴해주면 되는데, 그대로 사용할 경우 풀 패스를 써줘야 하므로 그대로 사용하는 것은 피해야 한다.
prefix, suffix 프로퍼티를 이용하면 앞뒤에 붙는 내용을 생략할 수 있다.

컨트롤러에서는 hello 만을 리턴해주면 된다. 이는 나중에 변경에도 용이하다.

JSTL 라이브러리가 클래스패스에 존재할 경우 JstlView를 사용하고, 존재하지 않으면 InternalResourceView를 사용한다.

VelocityViewResolver, FreeMarkerViewResolver

Velocity와 FreeMarker를 사용하게 해주는 뷰 리졸버이다.
InternalResourceViewResolver와 같이 prefix, suffix를 사용가능하다.

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/view" />
    <property name="suffix" value=".jsp" />
</bean>

ResourceBundleViewResolver

컨트롤러가 아닌 외부에서 뷰를 결정할 때, 한가지 뷰 만이 아니라 컨트롤러마다 뷰가 달라질 수 있을 때 사용하면 괜찮은 방식이다.
ResourceBundleViewResolver를 사용하면 클래스패스의 views.properties 파일에 논리적 이름과 뷰 정보를 정의하여 작성하고, 이를 사용하여 뷰를 선택하게 할 수 있다.
아래는 views.properties 파일 예시이다.

hello.(class)=org.springframework.web.servlet.view.JstlView
hello.url=/WEB-INF/view/hello.jsp

bye.(class)=org.springframework.web.servlet.view.velocity.VelocityView
bye.url=bye.vm

독립된 파일을 통해 뷰를 자유롭게 매핑할 수 있지만, 모든 뷰를 일일히 매핑해줘야 하는 불편도 뒤따른다.
그래서 단독으로 사용하는 것은 추천되지 않고, 다른 뷰 리졸버와 함께하면 유용하게 사용될 수 있다.

<bean class="org.springframework.web.servlet.view.ResourceBundleViewResolver">
    <property name="order" value="0" />
</bean>

<!-- order 기본값이 Integer.MAX 이므로 굳이 order 프로퍼티를 안줘도 됨 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" />

이렇게 사용하면 view.properties에 뷰가 없을 경우 아래 InternalResourceViewResolver를 사용하게 된다.
이로써 특별한 타입의 뷰가 필요할 때만 view.properties에 작성해주며 사용할 수 있다.

XmlViewResolver

ResourceBundleViewResolver와 용도는 동일하고, views.properties 대신 /WEB-INF/views.xml을 사용한다.
추가로 이 파일은 서블릿 컨텍스트를 부모로 가지므로 DI가 가능하다는 장점이 있다.

BeanNameViewResolver

뷰 이름과 동일한 이름을 가진 빈을 찾아서 뷰로 이용하게 해준다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함