2. 어댑터 구현체를 만든다. - Controller32를 처리할 수 있는 어댑터라고 하면 될 것 같다.
1) 첫번째로 들어온 객체가 ControllerV32인지 판단하는 supports를 구현한다.
인터페이스 ControllerV32의 인스턴스라면 true를 반환한다.
Front Controller에서 supports로 ControllerV32만 걸러서 handle메서드를 실행할 것이기 때문에 아handle메서드는 handler가 ControllerV32라고 확정하고 생각해도 된다.
2) handle 메서드는 컨트롤러를 호출해서 실행하고, ModelView를 반환한다(ControllerV32와 동일)
service()
getHandler(req) : 요청 URI에 따른 컨트롤러를 반환한다!
예를 들어 req가 v5/v3/new-form이면 handlerMappingMap에따라 MemberFormControllerV32가 리턴된다!(handler = MemberFormControllerV32)
❤️⭐️getHandlerAdapter(handler) : MyHandlerAdapter 리스트인 handlerAdapters를 다 뒤진다. (참고로 handlerAdapters에는 ControllerV32HandlerAdapter()가 있다) MyHandlerAdapter 인터페이스 변수 adapter는 리스트를 돌면서 ControllerV32HandlerAdapter를 받는다.
=>조건문 검사 : adapter.supports(handler) => handler가 ControllerV32인터페이스 인스턴스인지 검사해서 맞다면 true가 리턴된다. (그렇지 않으면 IllegalArgumentException으로 예외처리) true이면 이 ControllerV32HandlerAdapter()가 adapter로 리턴된다!
이까지 정리가 되면 이제 끝났다!
다시 돌아와서 adapter의 handle메서드로 컨트롤러 호출, 실행하고 ModelView를 반환한다.
뷰리졸버로 뷰 매칭하고, 랜더링한다.
//import문 생략@WebServlet(name="frontControllerServletV5", urlPatterns ="/front-controller/v5/*")publicclassFrontControllerServletV5extendsHttpServlet {privatefinalMap<String,Object> handlerMappingMap =newHashMap<>();privatefinalList<MyHandlerAdapter> handlerAdapters =newArrayList<>();//생성자publicFrontControllerServletV5(){initHandlerMappingMap();//맵핑 정보 넣는다!Object기 때문에 인터페이스 종료 상관없이 다 들어감.initHandlerAdapters(); }privatevoidinitHandlerMappingMap() {handlerMappingMap.put("/front-controller/v5/v32/members/new-form",newMemberFormControllerV32());handlerMappingMap.put("/front-controller/v5/v32/members/save",newMemberSaveControllerV32());handlerMappingMap.put("/front-controller/v5/v32/members",newMemberListControllerV32()); }privatevoidinitHandlerAdapters() {handlerAdapters.add(newControllerV32HandlerAdapter());//MyHandlerAdapter 구현체 } @Overrideprotectedvoidservice(HttpServletRequest req,HttpServletResponse res) throwsServletException,IOException {//URI 맵핑하고 그에 따른 객체 리턴하는 함수로 구현!//코드가 깔끔해진다! 아 handler를 찾는구나!Object handler =getHandler(req);//핸들러 찾아와.MemberFormControllerV32반환.if(handler ==null){res.setStatus(HttpServletResponse.SC_NOT_FOUND);return; }MyHandlerAdapter adapter =getHandlerAdapter(handler);//핸들러 어댑터 찾아와.ModelView mv =adapter.handle(req, res, handler);//실제 컨트롤러 호출해서 ModelView 반환.String viewName =mv.getViewName();MyView view =viewResolver(viewName);view.render(mv.getModel(),req,res); }privateMyHandlerAdaptergetHandlerAdapter(Object handler) {//핸들러로 V32가 들어오면//handler = MemberFormControllerV32for (MyHandlerAdapter adapter : handlerAdapters) {//리스트 다 뒤진다.if(adapter.supports(handler)){//V32가 있으면 support는 지원할 수 있으므로 true리턴return adapter;//MyHandlerAdapter adapter를 리턴한다! } }thrownewIllegalArgumentException("Handler Adapter를 찾을 수 없습니다.handler"+handler); }privateObjectgetHandler(HttpServletRequest req) {//URI가 들어오면 handlerMappingMap에서 찾는다!//다양한 URL이 들어올 수 있고, 이에 따라 다양한 인터페이스가 실행되야하기 때문에 Object로 받는다!String requestURI =req.getRequestURI();// 이것은 /front-controller/v2/members/new-form와 같다returnhandlerMappingMap.get(requestURI); }privateMyViewviewResolver(String viewName) {returnnewMyView("/WEB-INF/views/"+ viewName +".jsp"); }}