⭐️유연한 컨트롤러1 - v5(어댑터 도입, 인터페이스3 처리)
인터페이스 3 뿐만 아니라 4 그리고 확장해서 인터페이스 종류와 상관없이 들어오는 모든 요청 URL과 이에 따른 인터페이스를 처리하기 위해 어댑터라는 개념을 도입한다.

어댑터 인터페이스를 구현한다. - supports : 들어오는 요청 지원 가능한지 판단 - ModelView handle : 처리 가능한 컨트롤러 호출하고 실행 (컨트롤러는 ModelView를 반환하는 컨트롤러)
package hello.servlet.web.frontcontroller.v5;
import hello.servlet.web.frontcontroller.ModelView;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
//shift F6 : Rename
public interface MyHandlerAdapter {
//들어오는 컨트롤러를 지원할 수 있는지 판단
boolean supports(Object handler);
ModelView handle(HttpServletRequest req, HttpServletResponse res,Object handler) throws ServletException, IOException;
}
2. 어댑터 구현체를 만든다. - Controller32를 처리할 수 있는 어댑터라고 하면 될 것 같다. 1) 첫번째로 들어온 객체가 ControllerV32인지 판단하는 supports를 구현한다. 인터페이스 ControllerV32의 인스턴스라면 true를 반환한다. Front Controller에서 supports로 ControllerV32만 걸러서 handle메서드를 실행할 것이기 때문에 아handle메서드는 handler가 ControllerV32라고 확정하고 생각해도 된다. 2) handle 메서드는 컨트롤러를 호출해서 실행하고, ModelView를 반환한다(ControllerV32와 동일)
3. Front Controller 새로 구성 기존에는 private Map<String,ControllerV4> controllerMap 으로 해서 특정 인터페이스만 받았지만, 이 부분의 value를 Object로 받음으로써 다양한 인터페이스들을 받을 수 있다!!!
initHandlerMappingMap() : URI에 따른 컨트롤러를 맵핑한다!
initHandlerAdapters() : MyHandlerAdapter 리스트인 handlerAdapters에 MyHandlerAdapter 구현체인 ControllerV32HandlerAdapter()를 넣는다!⭐️⭐️⭐️⭐️⭐️
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를 반환한다. 뷰리졸버로 뷰 매칭하고, 랜더링한다.
Last updated
Was this helpful?