MultiactionController

AbstractController를 상속받아서 간단하게 구현하는 Controller들이 많이 있습니다. 그러한 것들 중에는 서로 관련이 있는 컨트롤러들도 있습니다. 예를 들어 검색결과 리스트를 가져오는 컨트롤러, 전체 목록을 가져오는 컨트롤러, 목록에서 한 개의 아이템에 대한 정보를 가져오는 컨트롤러가 있을 수 있습니다. 이러한 것들을 하나의 컨트롤러에서 처리할 수 있습니다.

MultiactionController의 장점
– 컨트롤러의 갯수가 줄어듭니다.
– 여러 처리를 논리적인 그룹으로 묶어서 하나의 클래스에 담을 수 있습니다.
– 액션 메소드의 유동적인 맵핑이 가능합니다.

MultiactionController의 단점
– 바인딩과 Valitor를 사용할 수 있지만 폼 처리 work flow가 정의되어 있지 않습니다.
    – 따라서 바인딩과 Validation을 요청을 처리할 메소드 내부에서 하기(?)를 권하고 있습니다.
– 쉽게 커질 우려가 있습니다.
– 리플렉션을 사용하기 때문에 컴파일 에러를 확인할 수 없습니다.

사용하는 방법
1. MultiActionController  상속받기
public class IssueController extends MultiActionController {

}

2. 요청을 처리할 액션 메소드 구현
– ModelAndView 객체를 반환해야 합니다.
– HttpServletRequest와 HttpServletResponse 파라미터를 가지고 있어야 합니다.
– 옵션으로 HttpSession 또는 Command 객체를 파라미터로 가질 수 있습니다.
    public ModelAndView list(HttpServletRequest request, HttpServletResponse response){
       return new ModelAndView(“issue/list”);
   }

3. 등록하기
– MethodNameResolver bean 등록합니다. 참조
    – InternalPathMethodNameResolver를 default로 사용합니다. 따라서 이 녀석을 사용할 때는 굳이 등록하거나 DI하지 않아도 됩니다.
– 위에서 구현한 컨트롤러 baen 등록하기
    <bean name=”/issue/*”  class=”net.agilejava.nayoung.controller.IssueController” />
– 이 때 *을 사용하여 /issue/list.html, /issue/find.html 과 같은 요청들을 모두 위의 컨트롤러에서 처리하도록 합니다.

궁금한 점
– Binding과 Validation을 할 수는 있는데 화면에 바인딩 하거나 Validation할 때 발생한 Error를 못 보여 주는 것이 단점인 것 같은데 이 걸 어떻게 해결 할 수 있을지…