본문 바로가기
Framework & Library/Spring Boot

[Spring Boot] : Controller를 여러 방식으로 구현하기 위해 사용한 Adapter pattern

by 오주현 2022. 1. 23.
반응형

컨트롤러를 여러 방식으로 구현하고 싶을 떄 활용하는 방버에 대해 공부했다.

 

컨트롤러를 여러 방식으로 구현하기 위해 어댑터 패턴을 활용한다. 지금까지 강의를 통해 공부한 내용은 한 가지 방식의 컨트롤러 인터페이스만 사용할 수 있었는데 어댑터 패턴을 통해 다양한 방식의 컨트롤러를 처리할 수 있도록 변경해 줄 수 있다.

public interface MyHandlerAdapter {

    boolean supports(Object handler);

    ModelView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException, IOException;
}

인터페이스 어댑터 예시 코드이다. supports 에서 handler는 컨트롤러를 말하고 supports 는 어댑터가 해당 컨트롤러를처리할 수 있는지 판단하는 메서드이다.

 

실제 어댑터를 구현해 본다.

public boolean supports(Object handler) {
        return (handler instanceof ControllerV3);
    }

ControllerV3를 처리할 수 있는 어댑터이다.

ControllerV3 controller = (ControllerV3) handler;
Map<String, String> paramMap = createParamMap(request);
ModelView mv = controller.process(paramMap);
return mv;

handler를 컨트롤러 V3로 변환해 형식에 맞게 호출하고 위에 있는 supports()를 통해 ControllerV3만 지원하기 때문에 타입 변환은 걱정하지 않아도 된다.

 

ControllerV3는 ModelView를 반환하므로 그대로 ModelView를 반환하면 된다.

// 생성자 생성
    public FrontControllerServletV5() {
        initHandlerMappingMap();
        initHandlerAdapters();
    }

생성자는 핸들러 매핑과 어댑터를 초기화하게끔 만들어 주었다.

private final Map<String, Object> handlerMappingMap = new HashMap<>();

조금 더 다양한 컨트롤러를 편하게 사용하기 위해 매핑 정보도 바꿔주었다. 기존에는 컨트롤러 인터페이스를 넣어주었는데 이제는 아무 값이나 받을 수 있는 더 상위 개념인 Object로 바꾸었다.

Object handler = getHandler(request);
private Object getHandler(HttpServletRequest request) {
        String requestURI = request.getRequestURI();
        return handlerMappingMap.get(requestURI);
    }

handlerMappingMap에서 URL에 매핑된 핸들러(컨트롤러) 객체를 찾아 반환한다.

MyHandlerAdapter adapter = getHandlerAdapter(handler);
private MyHandlerAdapter getHandlerAdapter(Object handler) {
        for (MyHandlerAdapter adapter : handlerAdapters) {
            if (adapter.supports(handler)) {
                return adapter;
            }
        }

핸들러를 처리할 수 있는 어댑터를 for문을 통해 찾아준다. 만약 핸들러가 Controller3 인터페이스를 구현했다면 ControllerV3HandlerAdapter 객체가 반환되게끔 강의에서는 코딩했다.

ModelView mv = adapter.handle(request, response, handler);

어댑터의 handle()메서드를 통해 실제 어댑터가 호출되고 그 결과를 어댑터에 맞추어 변환한다.


스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술을 참고하여 공부하였습니다.

반응형

댓글