ppt로 정리하다보니 그림이 작으니 화면확대를 통해서 자세히 보기
앞서 배웠던 MVC 패턴의 한계점을 기억해보자
공통으로 처리해야 하는 부분이 있었다.
- ViewPath의 prefix와 suffix 중복
- RequestDispatcher의 중복
- HttpServletResquest와 HttpServletResponse를 매개변수로 갖는 service()함수의 오버라이딩 -> HttpServlet은 HTTP호출과 응답으로 인해 테스트케이스르 만들기 어려움
이를 따로 빼서 만든다고 해도 결국 클래스의 메소드를 다시 호출해야 하므로 중복적으로 발생하는 것은 매한가지
따라서 등장한 것이 FrontController이다.
- 서블릿 하나로 클라이언트 요청을 받는다.
- 프런트 컨트롤러가 요청에 맞는 컨트롤러를 찾아서 호출
- 입구 하나
- 공통 처리 가능
- 프런트 컨트롤러를 제외한 나머지 컨트롤러는 서블릿 사용하지 않음-> 테스트 케이스를 만드는데 용이하다.
이번 시간에는 스프링 웹 MVC의 FrontController를 구현한 DispatcherServlet이 어떤 과정을 통해서 등장하게 되었는지 그걸 알아본다.
따라서 나는 각 버전마다 무엇인 개선되었는지 정리하도록 하겠다.
Version 1
- HTTP 요청은 무조건 처음에 FrontController로 간다.
그 이유는 여기서 WebServlet의 urlPatterns를 /front-controller/v1/*로 설정했기 때문이다.
- ControllerV1이라는 인터페이스를 만든 이유는 프런트 컨트롤러가 이 인터페이스를 호출하도록 하는 것 즉 내부에 있는 3개의 컨트롤러 등록, 저장, 목록에 대한 구체적인 컨트롤러명 없이 인터페이스를 호출하는 것으로
유지보수를 간편하게 하는 것이다.
- 하지만 이 Version1의 문제점은 아직도 Dispatcher의 중복(빨간색 표시)
Version 2
- Version2에서는 RequestDispatcher의 중복을 피하기 위해서 MyView라는 클래스를 만들어서 따로 분리했다.
- ControllerV2에서 눈여겨 봐야할 것은 process라는 메소드가 MyView를 return값으로 가지고 있다는 것 즉 FrontController에서 컨트롤러를 호출하고 이에 대한 반환값으로 MyView객체를 받을 것이며 이 객체를 통해서 render()함수를 호출하도록 바꾸었다.
- MyView의 객체를 생성자를 통해서 viewPath라는 .jsp파일 경로를 받도록 설정해놓았다.
- render라는 메소드는 HttpServlet을 상속받기 때문에 Http의 request와 response를 모두 받을 수 있다. 따라서 JSP로 forward가 가능하다.
Version 3
Version2에서
- Controller가 Http에 종속되지 않도록
즉 FrontController가 HttpServlet에 정보를 담아 주지 않고 Map을 만들어 그곳에 요청 파라미터 정보를 넣어 주기로 한다.
- viewPath의 중복을 제거해보자
prefix인 /WEB-INF/views/와 suffix인 .jsp를 제거해보자
-
여기서 두개의 Map을 사용한다.
하나는 praramMap인데 Map<String,String>의 구조를 가지고 있으며
Http요청에 들어있는 data를 담는 그릇이다. 이제 우리는 Frontcontroller가 HttpServletRequest에 데이터를 담아 컨트롤러 보내는 것이 아니다.
이제는 저 paramMap이라는 그릇에 담아서 컨트롤레 보낼 것이다.
그 기능은 createParamMap이라는 메서드가 담당한다.
->따라서 이제 컨트롤러는 Http에 의존하지 않는다. 따라서 테스트코드를 만드는게 자유롭다
나머지 하나는 model인데 Map<String,Object>의 구조를 가지고 있으며 이는 서버 내부에 저장될 형태인 Object로 바꾸어진 데이터를 JSP에 보내기 위한 그릇으로 이용된다.
이 두개의 Map을 헷갈려하지 말자. 나는 헷갈려서 정리해둔다.
-
앞서 이야기 한 model이 HttpServlet의 request에 저장되지 않고 우리가 별도로 만들 ModelView의 model로 저장된다.
-
따라서 MyView에서 데이터를 JSP에 보내는 Dispatcher 과정에서 model로 받은 데이터를 request.setAttribute과정을 거치게 된다.
Version 4
Version 3에서는 ControllerV3라는 인터페이스가 ModelView라는 값을 반환하도록 구성하였는데 이는 개발자 입장에서 process라는 메서드를 구현하기에 조금 번거롭다.
따라서 ModelView를 없애고 직접 model를 옮기도록 바꿔보자.
- ControllerV4 인터페이스를 보면 model이 그냥 파라미터 자체로 전달되고 있다.
Version 5
앞서 배웠던 버전들을 생각해보면 개발자들마다 원하는 버전들이 있을것이다.
따라서 개발자마다 원하는 것을 선택할 수 있는 유연한 컨트롤러를 만들고 싶다면?
어댑터 패턴을 이용하자
Version 5에서는 어댑터 패턴에 대해서 배운다.
프런터 컨트롤러에서 원하는 컨트롤러 방식으로 선택이 가능하도록 하는 것이다.
- HandlerAdapter는 어댑터의 역할을 해준다.
- handler는 앞서 말했던 컨트롤러를 어댑터 패턴에서는 컨트롤러 혹은 핸들러라고 부른다.