[Spring] Spring MVC 패턴과 MVC1 vs MVC2

정은영·2022년 12월 13일
0

CS

목록 보기
17/18

스프링 프레임워크는 MVC 패턴을 준수합니다.

MVC 패턴

  • M(Model) : 어플리케이션의 정보나 데이터, DB 등을 말합니다.
  • V(View) : 사용자에게 보여지는 화면, UI를 말합니다. Model로부터 정보를 얻고 표시합니다.
  • C(Controller) : 사용자의 요청을 처리하고, 그 요청에 따른 전체적인 흐름을 제어합니다.
  1. 사용자는 얻고자 하는 정보나 기능을 컨트롤러에 요청합니다.

  2. 컨트롤러는 사용자의 요청을 수신하고 그에 맞는 비즈니스 로직을 수행합니다.

  3. 비즈니스 로직을 수행하면서 컨트롤러는 필요에 따라 모델을 호출하여 데이터를 요청합니다.

  4. 요청을 모두 처리하면 뷰를 통해 사용자가 원하는 정보를 시각적으로 보여줍니다.

MVC 패턴은 크게 MVC1 패턴과 스프링이 채택한 MVC2 패턴으로 나눌 수 있습니다.

MVC1

MVC1 패턴의 경우 Jsp가 뷰와 컨트롤러 역할을 모두 수행하기 때문에 Jsp에 Java 코드와 Html, css 등의 코드가 섞여 있어, 소스가 복잡해지고 읽기가 어려워져 유지보수가 힘들어집니다.

하지만 상대적으로 설계가 간단하여 개발 속도가 빠르고 작은 프로젝트에 알맞습니다.

  • 위 코드는 MVC1의 예제입니다.
  • HTML(View)부분과 Java(Controller) 부분이 하나의 jsp 파일에 존재하는 것을 볼 수 있습니다.

MVC2

MVC2 모델은 모델 1에서 유지보수가 힘들다는 단점을 보완하기 위해 나온 모델입니다.

기존에 뷰와 컨트롤러의 역할을 모두 수행하던 JSP는 뷰의 역할만 하게 되고, 대신 컨트롤러의 역할을 Servlet이 수행합니다.

MVC1에서는 JSP가 사용자의 호출을 받아줬지만 MVC2에서는 컨트롤러 역할을 수행하는 Servlet이 요청을 받게 됩니다.

Servlet이 비즈니스 로직을 수행하며 모델을 호출하여 데이터를 요청하고 최종적으로 뷰 역할인 JSP를 제어하여 화면을 출력합니다. JSP는 Java 코드를 안쓰는 대신 JSTL을 사용하여 결과 화면을 보여줍니다.

MVC2로 개발하게 되면 html과 Java 코드가 분리되어 확장에 용이하고 유지보수가 수월해집니다. 하지만 초기 설계단계에서 비용이 많이 들어 개발 시간이 오래 걸린다는 단점이 있습니다.

  • 좌측 코드는 MVC2 Servlet이고 우측 코드는 MVC2 JSP 코드입니다.
  • 위 코드는 result 문자열을 result라는 곳에 저장시켜 mvc2.jsp로 forwarding을 하는 방식입니다. JSP에서는 간단히 request에서 원하는 정보를 불러오면 됩니다.

Spring Framework의 MVC2

  1. 클라이언트가 서버에 요청을 하면. Front Controller인 DispatcherServlet 클래스가 요청을 받습니다.

  2. HTTP Request가 왔을 때 DispatcherServlet이라 불리는 서블릿이 HTTP Request를 처리할 Controller을 지정합니다.

    • DispatcherServlet은 프로젝트 파일 내의 servlet-context.xml 파일의 @Controller 인자를 통해 등록한 요청 위임 컨트롤러를 찾아 매핑된 컨트롤러가 존재하면 @RequestMapping을 통해 요청을 처리할 메소드로 이동합니다.

    • 이렇게 앞쪽에서 처리하는 컨트롤러를 두는 패턴을 Front Controller 패턴이라고 합니다.

  3. DispatcherServlet에 의해 배정된 Controller(Handler)는 해당 요청을 처리할 Service를 받아 비즈니스 로직을 Service에게 위임합니다.

  4. Service는 요청에 필요한 작업을 수행하고, 요청에 대해 DB에 접근해야 한다면 DAO에 요청하여 처리를 위임합니다.

  5. DAO는 DB정보를 DTO를 통해 받아 Service에게 전달합니다.

  6. Service는 전달받은 데이터를 Controller에게 전달합니다.

  7. Controller는 받은 데이터를 Model에 넣고 모델을 넣을 View name을 배정합니다.

  • Model: Map<String, Value> 형태의 데이터 저장소
  1. Controller는 Model 과 View를 감싼 ModelAndViewDispatcherServlet에게 전송합니다.

    • public ModelAndView(String viewName, @Nullable Map<String, ?> model) {
         this.view = viewName;
         if (model != null) {
            getModelMap().addAllAttributes(model);
         }
      }
  2. DispatcherServletViewResolver에게 전달받은 ModelAndView를 전달합니다.

  3. ViewResolver는 응답할 VIew에 대한 JSP를 찾아 DispatcherServlet에게 전달합니다.

  4. DispatcherServlet은 응답할 뷰의 Render를 지시하고 ViewModel에 저장된 데이터를 사용해 View를 그립니다.

  5. DispatcherServlet은 클라이언트에게 Rending된 View를 응답하며 요청을 마칩니다.

Spring MVC의 의의

Spring MVC는 HTTP Request를 처리하는 부분인 Controller, 데이터를 처리해 정제된 데이터를 넣는 Model, 정제된 데이터를 활용해 사용자에게 보여지는 View에 대한 역할 분리가 잘 되어있다. Spring MVC를 사용하면 Model, View, Controller 모두를 인터페이스를 사용해 규격화 해놓았기 때문에 유연하고 확장성 있게 웹 어플리케이션을 설계할 수 잇습니다.

Reference

0개의 댓글