
FrontController 패턴 특징


서블릿 종속성 제거
컨트롤러 입장에서 HttpServletRequest, HttpServletResponse는 꼭 필요한 것이 아니다. 요청 파라미터 정보는 자바의 Map으로 대신 넘기도록 하면 컨트롤러가 서블릿 기술을 몰라도 동작할 수 있다. 그리고 request 객체를 Model로 사용하는 대신에 별도의 Model 객체를 만들어 반환하면 된다. 구현 컨트롤러가 서블릿 기술을 전혀 사용하지 않도록 변경해본다.
뷰 이름 중복 제거
컨트롤러에서 지정하는 뷰 이름에 중복이 있으므로 컨트롤러는 뷰의 논리 이름을 반환하고, 실제 물리 위치의 이름은 프론트 컨트롤러에서 처리화 하도록 단순화한다.
/WEB-INF/views/new-form.jsp -> new-form/WEB-INF/views/save-result.jsp -> **save-result/WEB-INF/views/members.jsp -> membersModelView
지금까지 컨트롤러에서 서블릿에 종속적인 HttpServletRequest를 사용했다. 서블릿의 종속성을 제거하기 위해 Model을 직접 만들고, 추가로 View 이름까지 전달하는 객체를 만들어본다.
뷰 리졸버
MyView view = viewResolver(viewName)
컨트롤러가 반환한 논리 뷰 이름을 실제 물리 뷰 경로로 변경한다. 그리고 실제 물리 경로가 있는 MyView 객체를 반환한다.
members/WEB-INF/views/members.jsprequest.getAttribute()로 데이터를 조회하기 때문에, 모델의 데이터를 꺼내서 request.setAttribute()로 담아둔다.
ModelView를 반환하지 않고, ViewName만 반환한다.
어떤 개발자는 ControllerV3 방식으로 개발하고 싶고, 어떤 개발자는 ControllerV4 방식으로 개발하고 싶다면?
어댑터 패턴
지금가지 만든 버전은 한가지 방식의 컨트롤러 인터페이스만 사용할 수 있다. 호환이 불가능한 인터페이스는 어댑터를 통해 처리해야한다.
핸들러 어댑터: 중간에 어댑터 역할을 하는 어댑터가 추가되었는데 이름이 핸들러 어댑터이다. 여기서 어댑터 역할을 해주는 덕분에 다양한 종류의 컨트롤러를 호출할 수 있다.
핸들러: 컨트롤러의 이름을 더 넓은 범위인 핸들러로 변경했다. 그 이유는 이제 어댑터가 있기 때문에 꼭 컨트롤러의 개념 뿐만 아니라 어떠한 것이든 해당하는 종류의 어댑터만 있으면 다 처리할 수가 있기 때문이다.
글이 많은 도움이 되었습니다, 감사합니다.