🔸 프론트 컨트롤러가 맵핑 정보를 확인하고 컨트롤러를 호출하면 컨트롤러는 로직을 수행하고 그 값을 MyView 객체에 담아서 반환
🔸 프론트 컨트롤러는 MyView객체의 render() -> forward로직을 통해서 뷰를 렌더링(해당 jsp실행)한다.
🔸 프론트 컨트롤러의 도입으로 MyView객체의 render()를 일관되게 호출, 처리할 수 있다.( 각 컨트롤러들은 MyView객체를 생성해서 반환하기만 하면된다.)
물론, MyView도 인터페이스로 만들어도 된다.
🔸 컨트롤러의 입장에서 꼭 HttpServletRequest, HttpServletResponse객체가 필요한 것이 아니라 요청 파라미터만 받으면 된다. 그래서 request객체 대신 ModelView라는 객체를 만들어서 사용
➡️ 컨트롤러(구현체)가 서블릿이라는 기술을 전혀 몰라도 프로그램이 동작하도록..
ModelView는 viewName과 model로 구성되어있으며 model은 Map<String, Object>
🔹 "new-form"이라는 논리이름만 ModelView객체에 담아서 반환하면 프론트 컨트롤러에서 viewResolver를 통해서 절대경로로 변환한다.
‼️좋은 프레임워크는 멋진 설계도 중요하지만, 개발자가 쉽고 간편하게 사용할 수 있는 실용성이 있어야 한다.
🔹 프론트 컨트롤러가 컨트롤러의 process()를 호출할 때, 기존의 paramMap + model을 같이 넘겨주고 컨트롤러는 처리한 데이터를 model에 담아서 ModelView가 아닌 viewName("new-form")만 반환한다.
🔹 다시 프론트 컨트롤러는 viewName을 viewResolver를 통해서 절대경로로 변환 후 render()를 호출해서 jsp를 실행한다.
➡️ 어댑터 패턴을 사용해서 다양한 타입의 컨트롤러를 사용할 수 있도록 할 수 있다.🔸핸들러 어댑터 : 중간에서 다양한 종류의 컨트롤러를 호출할 수 있도록 어댑터 역할
🔸 핸들러 : 컨트롤러와 동일한 역할
- gethandler를 통해서 매핑정보를 찾는다.(예. MemberFormControllerV4)
- 반환된 컨트롤러(핸들러)를 가지고 어댑터를 찾는다.
(adapter.supports(handler) -> V3는 instanceof : false -> V4는 instanceof : true - > ControllerV4adapter가 반환됨)- adapter.handle(request, response, handler) : model에 값을 담고 ModelView를 반환한다.
🔸 컨트롤러는 viewName을 반환하고 어댑터가 중간에서 ModelView로 바꿔서 프론트컨트롤러로 반환한다.
➡️다형성과 어댑터로 인해서 기본 구조는 유지하면서 기능을 확장할 수 있다.