호환되지 않는 인터페이스를 사용하는 클라이언트를 그대로 활용할수 있다.
이렇게 함으로써 클라이언트와 구현된 인터페이스를 분리시킬수 있으며, 향후 인터페이스가 바뀌더라도 그 변경 내역
은 어댑터에 캡슐화 되기 때문에 클라이언트는 바뀔 필요가 없어진다.
예를 들어보면 기존 시스템의 서버간 통신은 EJB, Socket(TCP/IP)를 사용중이 었으나 추가된 시스템은 Http통신이 필요하다.
public class HttpTransfer {
public void doProcess() {
System.out.println("doProcess call : " + this.getClass().getName());
}
}
Transfer transfer = new HttpTransferAdapter(new HttpTransfer());
transfer.doProcess();
Transfer transfer1 = new EJBTransfer();
transfer1.doProcess();
>
doProcess call : adapter.HttpTransfer
doProcess call : adapter.EJBTransfer
HandlerAdapter (스프링 MVC)
HandlerAdapter는 스프링 MVC에서 컨트롤러를 처리하기 위해 사용됩니다. 스프링 MVC는 다양한 형태의 컨트롤러(예: Controller, HttpRequestHandler, Annotated Controller)를 지원하기 위해 어댑터 패턴을 사용합니다.
구조
- 클라이언트: DispatcherServlet
- 어댑터: HandlerAdapter 구현체
- 구체적인 컨트롤러: 다양한 형태의 컨트롤러 (@Controller, SimpleControllerHandlerAdapter, 등)
구현 예
public interface HandlerAdapter {
boolean supports(Object handler);
ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
long getLastModified(HttpServletRequest request, Object handler);
}
// HandlerAdapter
HandlerAdapter ha = this.getHandlerAdapter(mappedHandler.getHandler());
...
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
...
스프링 MVC는 다음과 같은 구현체를 제공합니다:
- SimpleControllerHandlerAdapter: Controller 인터페이스를 구현한 컨트롤러를 처리.
- HttpRequestHandlerAdapter: HttpRequestHandler를 구현한 컨트롤러를 처리.
- RequestMappingHandlerAdapter: @RequestMapping 기반의 컨트롤러를 처리.
작동 방식
- DispatcherServlet은 HTTP 요청을 수신합니다.
- 해당 요청에 매핑된 컨트롤러를 확인합니다.
- 컨트롤러를 처리할 수 있는 적절한 HandlerAdapter를 찾습니다.
- 적절한 HandlerAdapter를 통해 컨트롤러를 실행하고 결과를 반환받습니다.
https://jusungpark.tistory.com/22
'WEB개발 > Pattern' 카테고리의 다른 글
Proxy Pattern (0) | 2021.09.24 |
---|---|
[PATTERN] Producer - Consumer (0) | 2021.08.27 |
DelegationPattern (0) | 2021.07.13 |