핸들러 어댑터 동작원리

스프링

목록 보기
5/6

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

1. Handler 매핑 조회

2. HandlerAdapter 조회

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를 찾고 마침내

를 찾는다.

3. Handler(handler)를 통한 핸들러 호출

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


해당 어댑터에 따르면 handelr를 ControllerV4로 캐스팅하고, Mapping 정보와 model을 생성한 뒤 viewName와 ModelView를 반환하고 Model값을 세팅후 mv를 반환한다.

4. viewResolver 호출 && 물리 뷰 위치 반환

이후 반환된 mv에 담긴 논리 뷰 이름과 model(data)를 사용하여 viewResolver가 물리 뷰 경로로 반환(MyView)한뒤 FrontController가 render(model)을 통해 MyView로 전달하여 클라이언트에게 응답으로 HTML을 전송한다.

느낀점

상당히 길고 복잡한 코드 구조이지만 도식화를 통해 먼저 구조를 한눈에 보기 쉽게 이해하고, 각 컴포넌트의 역할과 동작 순서를 파악하면 코드 이해도 쉬워진다는 사실을 또 한 번 깨달았다.

0개의 댓글