1. 개요는 이렇다.
보통은 하나의 모듈(ex 게시판)은 사용자가 보는 화면(front)와
관리자 화면(backoffice)가 존재한다.
이것을 구현하기 위해 여러가지 방법이 있다.
첫번째로 하나의 view화면(jsp,jsf이건)에 권한을 주어 두 사용자(사용자,관리자)가
해당 view에 접근하는 방법이다.
두 관리자의 view 화면이 달라야 하므로, siteMesh나, 그 권한으로 CRUD기능을 handle 할수 있다.
Spring에서는 테마 기능이란것으로 비쥬얼한것을 처리할수도 있다.
그러나, Biz rule이 좀더 복잡해지거나, 특정기능 때문에 front view가 복잡해지고, 유지보수하면서 해당소스도 점점 지저분해지기 마련이다. 이방법의 장점은 관리하는 view(jsp)화면이 하나이므로 하나만 수정하면되나, 소스가 복잡해 지고, 해당 기능을 위해 3Tier에 좀더 많은 영향을 미친다.
여전히 선호하는 방법이긴 하다.
두번째는 front와 backoffice 뷰 파일을 따로 두는것이다. 이것은 관리파일이 두개 이므로 좀더 신경쓰이긴 하지만, 각각 분리되어 있어 서로의 뷰에 영향을 미치지 않고도 편리하게 수정할수 있다는 장점이 있다.
이 두가지 방법에서 관리자부분은 자동화하면 신속하고, 편리하게 프로젝트를 진행할수 있다.
이것을 보통 빌더 비슷하게 만들어 쓴다는건 이미 오래전부터 있어왔고, 지금도 많이 애용되는듯 하다.
2. 의도는 이렇다.
위의 첫번째 방법은 Spring에서 어렵지 않게 구현된다.
예를 들어 보자.
보통 org.springframework.web.servlet.DispatcherServlet 와 매핑된 xml에서 다음과 같이 ant 스타일 설정이 가능하며, 이는 쉽게 요청URL를 임의적으로 접근할수 있다.
<bean id="handlerMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/*/*/board_list.do">boardController</prop>
<prop key="/*/*/board_view.do">boardController</prop>
<prop key="/**/board_delete.do">boardController</prop>
<prop key="/**/board_form.do">boardFormController</prop>
</props>
</property>
</bean>
이것은 이미 잘 알고 있는 부분이다.
문제는 두번째 방법이다.
두번째 방법을 구현하는데에도 여러가지 방법이 있다. interceptors 속성을 이용하거나, AOP를 이용하거나, 어떤 param값을 이용하거나....
그중 가장 쉽고 편리한 방법을 찾는게 의도이다.
나는 1차적으로 설정파일로 그부분을 해결하는것이였고, 여의치 않으면 AOP를 이용하려고 시도했다.
3. 문제는 이렇다.
예)
1) [요청] /***어떤rul***/board/board_list.do -->
2) [Controller & Model] boardListController와 매핑후 model값 return -->
3) [View] /***어떤rul***/board/board_list.jsp --> 브라우저
1),2)번은 어렵지않게 해결할수 있었다. 3)번은 구현하는 방법이 다양하지만, Best는 찾지 못했다.
즉, 유연한 요청 URL에 따른 요청 Controller를 매핑하고 해당 URL에 따른 뷰(JSP)를 매핑하여 보여주는것이다. 가장 쉽게 생각하는게 interceptor이다 하지만 설정파일이나, Spring에서 제공하는것으로 구현할수는 없는것일까?
아직(진행중....)까진 찾지 못했다.
나름대로 설정파일만으로도 어느정도는 해결할수 있었으나 좀더 검색을 해봐야 겠다.
4. 테스트 구현 1
action-board.xml (DispatcherServlet 과 매핑되는) 파일
<?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:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
<description>action-board</description>
<bean id="viewNameTranslator" class="org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator"/>
<bean id="boardController" class="net.max.board.web.BoardController"
p:boardFacade-ref="boardFacade"
p:methodNameResolver-ref="boardResolver"/>
<bean id="boardResolver" class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver">
<property name="mappings">
<props>
<prop key="/*/*/board_list.do">list</prop>
<prop key="/*/*/board_view.do">view</prop>
<prop key="/*/*/board_delete.do">remove</prop>
</props>
</property>
</bean>
<bean id="handlerMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/*/*/board_list.do">boardController</prop>
<prop key="/*/*/board_view.do">boardController</prop>
<prop key="/*/*/board_delete.do">boardController</prop>
<prop key="/*/*/board_form.do">boardFormController</prop>
</props>
</property>
</bean>
<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
이것은 MultiActionController일때 요청 URL에 따른 각각의 뷰(JSP)파일과 잘 매칭된다.
즉, /web1/board/board_list.do 요청시 /WEB-INF/jsp/web1/board/board_list.jsp파일과 매핑된다.
좀더 구체적으로 구현 의도는 이렇다.
/front/board/board_list.do -> /WEB-INF/jsp/front/board/board_list.jsp
/manager/board/board_list.do -> /WEB-INF/jsp/manager/board/board_list.jsp
여기서 front와 manager 디렉토리는 hard coding 이 아닌 유연함을 유지 해야 한다.
해당 MultiActionController의 view 메서드는 아래와 같다.
public ModelAndView view(HttpServletRequest request,HttpServletResponse response) throws Exception {
int boardId = ServletRequestUtils.getIntParameter(request, "boardId",0);
BoardFacadeResult boardFacadeResult = boardFacade.getBoard(new Integer(boardId));
ModelAndView v = new ModelAndView(request.getPathTranslated());
v.addObject("boardFacadeResult", boardFacadeResult);
return v;
}
SimpleFormController 일때에는 formView 속성값을 유연하게 처리해야만 한다.
다음에 계속.....