프론트 컨트롤러 (Front Controller)
프론트 컨트롤러 패턴 특징
- 프론트 컨트롤러 서블릿 하나로 클라이언트의 요청을 받음
- 프론트 컨트롤러가 요청에 맞는 컨트롤러를 찾아서 호출
- 입구가 하나, 공통 처리 가능
- 프론트 컨트롤러를 제외한 나머지 컨트롤러는 서블릿을 사용하지 않아도 됨
- DispatcherServlet이 Front Controller 패턴으로 구현되어 있음
뷰 리졸버 (View Resolver)
- MyView view = viewResolver(viewName): 컨트롤러가 반환한 논리 뷰 이름을 실제 물리 뷰 경로로 변경한다. 실제 물리 경로가 있는 MyView 객체를 반환한다.
- 뷰 객체를 통해 HTML 화면을 렌더링 한다.
- 뷰 객체의 render()는 모델 정보도 함께 받는다.
- JSP는 request.getAttribute()로 데이터를 조회하기 때문에, 모델의 데이터를 꺼내 request.setAttribute()로 담아둔다.
- JSP로 포워드해서 JSP를 렌더링한다.
어댑터 패턴 (Adapter Pattern)
프론트 컨트롤러가 다양한 방식의 컨트롤러를 처리할 수 있도록 해준다.
- 핸들러 어댑터: 중간에서 어댑터 역할을 하고, 다양한 종류의 컨트롤러를 호출할 수 있게 도와준다.
- 핸들러 (= 컨트롤러): 컨트롤러의 이름을 더 넓은 범위인 핸들러로 변경한 것이다. 핸들러는 컨트롤러 뿐만 아니라 어댑터가 지원하기만 하면, 어떤 것이라도 URL에 매핑해서 사용할 수 있기 때문이다.
핸들러를 처리할 수 있는 어댑터 조회
MyHandlerAdapter adapter = getHandlerAdapter(handler)
어댑터 호출
ModelView mv = adapter.handler(request, response, handler);
- 어댑터의 handler(request, response, handler) 메서드를 통해 실제 어댑터가 호출된다.
- 어댑터는 handler(컨트롤러)를 호출하고 그 결과를 어댑터에 맞추어 반환한다.
어댑터 변환
ModelView mv = new ModelView(viewName);
mv.setModel(model);
return mv;
어댑터가 호출하는 Controller는 뷰의 이름을 반환한다. 하지만 어댑터는 뷰의 이름이 아니라 ModelView를 만들어서 반환해야 한다. Controller는 뷰의 이름을 반환했지만, 어댑터는 이것을 ModelView로 만들어서 형식을 맞추어 반환한다.
여기에 애노테이션(@Annotation)을 사용해서 더 편리하게 컨트롤러를 발전시킬 수 있다. 이는 어노테이션을 지원하는 어댑터를 추가하면 가능하다. 다형성과 어댑터 덕분에 기존 구조를 유지하면서, 프레임워크의 기능을 확장할 수 있다.
'Spring Study > MVC 패턴' 카테고리의 다른 글
[MVC 패턴] 타임리프 (Thymeleaf) (0) | 2023.08.16 |
---|---|
[MVC 패턴] MVC 기본 기능 (0) | 2023.08.15 |
[MVC 패턴] MVC 구조 (0) | 2023.08.14 |
[MVC 패턴] JSP / MVC 패턴 (0) | 2023.08.09 |
[MVC 패턴] 서블릿 (Servlet) (0) | 2023.08.08 |
댓글