목표
1. 본 글을 통해 핸들러 어댑터 패턴의 동작 방식을 이해한다.
2. 도식화를 통해 정확히 이해 > 장기기억화 한다.

MyHandlerAdapter adapter = getHandlerAdapter(handler);
로 해당 핸들러(MemberFormControllerV4)를 처리 가능한 핸들러어댑터를 조회한다.
private MyHandlerAdapter getHandlerAdapter(Object handler) {
MyHandlerAdapter a;
for (MyHandlerAdapter adapter : handlerAdapters) {
if(adapter.support(handler)){
return adapter;
}
}
throw new IllegalArgumentException("Can't fond handler adapter.handler adapter= " + handler);
}
handlerAdapters 로 가보면 FrontControllerServletV5 클래스의 생성자 initHandlerAdapters()가 호출되고, 해당 생성자는 아래와 같다.
private void initHandlerAdapters() {
handlerAdapters.add(new ControllerV3HandlerAdapter());
handlerAdapters.add(new ControllerV4HandlerAdapter());
}
따라서 ControllerV3HandlerAdapter
를 먼저 호출한다 하지만 아래와 같이

MemberFormControllerV4는 ControllerV3의 인스턴스가 아니므로
if(adapter.support(handler)){ return adapter; }는 false를 리턴한다.
그리고 다른 HandlerAdapter를 찾고 마침내

를 찾는다.
ControllerV4HandlerAdapter 어댑터가 반환이 되고, 해당 클래스를 호출한다.

해당 어댑터에 따르면 handelr를 ControllerV4로 캐스팅하고, Mapping 정보와 model을 생성한 뒤 viewName와 ModelView를 반환하고 Model값을 세팅후 mv를 반환한다.
이후 반환된 mv에 담긴 논리 뷰 이름과 model(data)를 사용하여 viewResolver가 물리 뷰 경로로 반환(MyView)한뒤 FrontController가 render(model)을 통해 MyView로 전달하여 클라이언트에게 응답으로 HTML을 전송한다.
느낀점
상당히 길고 복잡한 코드 구조이지만 도식화를 통해 먼저 구조를 한눈에 보기 쉽게 이해하고, 각 컴포넌트의 역할과 동작 순서를 파악하면 코드 이해도 쉬워진다는 사실을 또 한 번 깨달았다.