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.jsp
request.getAttribute()
로 데이터를 조회하기 때문에, 모델의 데이터를 꺼내서 request.setAttribute()
로 담아둔다.ModelView
를 반환하지 않고, ViewName
만 반환한다.
어떤 개발자는 ControllerV3
방식으로 개발하고 싶고, 어떤 개발자는 ControllerV4
방식으로 개발하고 싶다면?
어댑터 패턴
지금가지 만든 버전은 한가지 방식의 컨트롤러 인터페이스만 사용할 수 있다. 호환이 불가능한 인터페이스는 어댑터를 통해 처리해야한다.
핸들러 어댑터: 중간에 어댑터 역할을 하는 어댑터가 추가되었는데 이름이 핸들러 어댑터이다. 여기서 어댑터 역할을 해주는 덕분에 다양한 종류의 컨트롤러를 호출할 수 있다.
핸들러: 컨트롤러의 이름을 더 넓은 범위인 핸들러로 변경했다. 그 이유는 이제 어댑터가 있기 때문에 꼭 컨트롤러의 개념 뿐만 아니라 어떠한 것이든 해당하는 종류의 어댑터만 있으면 다 처리할 수가 있기 때문이다.
글이 많은 도움이 되었습니다, 감사합니다.