1 분 소요

8.3 MVC 프레임워크 요구사항 2단계

8.3.1 요구사항 분리 및 힌트

  • 뷰를 추상화한 인터페이스를 추가한다.

      public interface View {
      	void render(HttpServletRequest req, HttpServletResponse resp) throws Exception;
      }
    
  • 뷰를 구현하는 JspView 와 JsonView 를 생성해 각 View 성격에 맞도록 구현한다.
  • Controller 인터페이스의 반환 값을 String 에서 View 로 변경한다.
  • 각 Controller 에서 String 대신 JspView 또는 JsonView 중 하나를 사용하도록 변경한다.
  • DispatcherServlet 에서 String 대신 View 인터페이스를 사용하도록 수정한다.

한 단계 더 리팩토링을 한다면?

HttpServletResponse 를 통해 데이터를 전달하지 않고 원하는 데이터만 뷰에 전달할 수 있도록 모델 데이터에 대한 추상화 작업을 진행한다.

모델 데이터 추상화

  • 힌트
    • 모델 데이터를 View 와 같이 전달해야 하기 때문에 ModelAndView 와 같은 이름의 클래스를 만든다.
    • ModelAndView 는 View와 모델 데이터를 Map<String, Object> 형태로 관리하도록 구현한다.
    • View의 render() 메소드에 모델 데이터를 인자로 추가하고 JspView 와 JsonView 를 수정한다.
      • View 의 render() 메소드 인자에 Map 을 추가

          public interface View {
          	void render(Map<String, ?> model, HttpServeletRequest request
          		, HttpServeletResponse response) throws Exception;
          }
        
      • JspView 의 render() 는 모델 데이터를 꺼내 HttpServeletRequest 에 전달한다.
      • JsonView 의 render() 는 HttpServeletRequest 메소드에서 Map 으로 변경하는 부분을 제거한다.
    • 앞 단계와 같이 Controller 의 반환 값을 View 에서 ModelAndView, 각 Controller 구현체는 HttpServeletRequest 대신 ModelAndView 를 통해 데이터를 전달하도록 수정, DispatcherServlet 에서 View 대신 ModelAndView 를 사용하도록 수정한다.