컨트롤러를 여러 방식으로 구현하고 싶을 떄 활용하는 방버에 대해 공부했다.
컨트롤러를 여러 방식으로 구현하기 위해 어댑터 패턴을 활용한다. 지금까지 강의를 통해 공부한 내용은 한 가지 방식의 컨트롤러 인터페이스만 사용할 수 있었는데 어댑터 패턴을 통해 다양한 방식의 컨트롤러를 처리할 수 있도록 변경해 줄 수 있다.
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편 - 백엔드 웹 개발 핵심 기술을 참고하여 공부하였습니다.
'Framework & Library > Spring Boot' 카테고리의 다른 글
[Spring Boot] : 스프링이 제공하는 핸들러 매핑과 어댑터 (0) | 2022.01.24 |
---|---|
[Spring Boot] : Spring MVC 구조 확인하기 (0) | 2022.01.24 |
[Spring Boot] : 단순하고 실용적은 ModelView 객체의 중복을 제거한 컨트롤러 코딩 (0) | 2022.01.23 |
[Spring Boot] : Model 추가해서 Front Controller에서만 Servlet 사용하기 (0) | 2022.01.22 |
[Spring Boot] : Controller에서 View 이동 시 중복되는 부분 리펙터링하기 (0) | 2022.01.22 |
댓글