본문 바로가기
JAVA/Spring

String MVC - 뷰(ViewResolver) 원칙

by 설총이 2018. 9. 19.

- String MVC - 뷰




1. InternalResourceViewResolver



뷰 이름으로부터 JSP나 Tiles연동을 위한 View객체를 리턴

==> jsp로 화면에뿌릴때에는, 이것을 사용.

==> Internal은 무조건 prefix + suffix가 있기때문에, null은 일어날 수없다. 404만 일어날 뿐.






2. BeanNameViewResolver



뷰 이름과 동일한 이름을 갖는 빈 객체를 View 객체로 사용한다.

==> 클래스로 뷰객체로 만들때 사용한다 ex)화면변하지않는채로 파일다운로드할때


1. new ModelAndView("download") == 첫 매개변수는 viewname으로 사용될것이고

2. dispatcher는 viewResolver를 찾아간다.

3. viewResolver를 찾아왔더니 클래스가 BeanNameResolver라서,

4. 뷰네임으로 가진 빈객체를 찾아간다.

5. download라는 name을 가진 bean을 찾아가서 수행한다.





3. ResourceBundleViewResolver 



뷰 이름과 View 객체간의 Mapping정보를 저장하기위해 Resource파일사용






4. ViewResolver Interface


매개변수로 String viewName, Local locale 두가지 변수를 받는다.

Mapping되는 View객체가 존재하지 않으면, null을 리턴한다.






5. XmlViewResolver 설정


ex)

<bean id="viewResolver" 

class="org.springframework.web.servlet.view.XmlViewResolver" 

p:location="/WEB-INF/nonHtml-view.xml"/>


BeanName과 성능은 똑같지만, 

차이점은 

BeanName은 모든 xml문서를 검색하고,

XmlViewResolver는 별도의 xml 설정파일에서만 빈 객체를 검색한다.

해당 bean객체가 없다면 null값을 리턴한다.





<주의사항>


하나의 dispatcher-servlet은 한개 이상의 viewResolver를 설정할 수 있습니다.

한개 이상의 viewResolver가 있을때에는 dispatcher는 먼저 '선언' 된 순서대로 Resolver에게 view 객체를 요청합니다.

우선순위가 높은 viewResolver가 return값이 null일때 그다음 순위의 viewResolver에게 요청하게됩니다.


그렇기때문에,

우선순위를 결정할때, 주의할점은 Internal은 반드시 맨 마지막으로 선언되어야한다.

Internal이 먼저 선언되고 BeanName을 선언했을때, 내가 원하는건 BeanName인데 

Internal은 무조건 prefix + suffix가 있기때문에, null은 일어날 수없어서

null을 리턴할일이 전혀없다. 그렇기때문에 그다음 순위인 BeanName은 절대 실행될일이 없어진다.