CS 개념 정리

MVC 프레임 워크란?

Squidward 2023. 2. 12. 14:25

MVC 프레임 워크란?

MVC 프레임워크에 대해 알려면 먼저 MVC의 개념에 대해 알아야합니다.

 

1. MVC 패턴이란?

디자인 패턴 중 하나로 사용자가 보는 화면인 View, 데이터를 처리하는 Model, 이 둘을 중재하는 Controller 세가지 역할로 분업합니다. 이 패턴을 사용해 애플리케이션을 만들면 유지보수, 확장성, 유연성이 증가하고 중복코드도 사라집니다.

 

[실전에서 MVC를 지키며 코딩하는 법 5가지]

  1. Model은 Controller와 View에 의존하면 안된다.
    > Model 내부에 Controller와 View에 관련된 코드가 없어야한다. (Import 금지)
  2. View는 Model에만 의존하고 Controller엔 의존하면 안된다.
    > View내부에 Model의 코드만 있을 수 있고, Controller코드는 있으면 안된다.
  3. View가 Model로 부터 데이터를 받을때는 사용자마다 다르게 보여줘야하는 데이터만 받아야한다.
    > ex) 배달주소, 사용자 이름 O , 홈페이지 이름, 공통 메세지 X
  4. Controller는 Model과 View에 의존 가능하다.
    > Controller내부에는 Model과 View의 코드가 있을 수 있다.
  5. View가 Model로 부터 데이터를 받을때, 반드시 Controller에서 받아야한다.
    > Controller가 두 코드를 중개한다. (1번과 2번을 잘 지키면 5번도 잘지켜진다)

https://www.youtube.com/watch?v=ogaXW6KPc8I 

MVC 지키며 코딩하는 법 5가지, 영상 3:00분~

2.MVC 프레임워크란?

앞서 소개한 MVC를 기반으로 하는 웹사이트를 만들면 코드로 기본 골격을 한번 구성하면 그 코드를 기반으로 개발이 수월해지지만,

이런 구조를 개발하는 데 시간이 꽤 걸립니다. → 따라서 MVC 구조의 기본 설계가 갖춰진 상태인 MVC 프레임워크를 제공함

 

* 여기서 프레임워크란? (남이 이미 짜놓은 코드라는 점에서 라이브러리와 유사함)

1) 프레임워크 : 원하는 기능 구현에 집중하여 개발할 수 있도록 필요한 기능을 갖추고 있는 것, 일정한 형태를 가지고 다양한 형태의 결과물을 만드는 것(내 코드를 프레임워크가 가져다 씀)

2) 라이브러리 : 소프트웨어를 개발할 때 프로그래밍 사용하는 비휘발성 자원의 모임, 공통으로 사용될 수 있는 특정한 기능들을 모듈화한 것 (내 코드가 라이브러리를 가져다 씀)

 

https://www.youtube.com/watch?v=AERY1ZGoYc8

MVC 프레임워크란

3. MVC 패턴 2가지

MVC1

  • MVC1 패턴의 경우 View와 Controller를 모두 JSP가 담당하는 형태를 가집니다.
  • 즉 JSP 하나로 유저의 요청을 받고 응답을 처리하므로 구현 난이도는 쉽습니다.
  • 단순한 프로젝트에는 괜찮겠지만 내용이 복잡하고 거대해질수록 이 패턴은 힘을 잃습니다.
  • JSP 하나에서 MVC 가 모두 이루어지다보니 재사용성도 떨어지고, 읽기도 힘들어집니다. > 유지보수에 있어 문제가 발생!

MVC2

  • MVC2 패턴은 널리 표준으로 사용되는 패턴입니다. 요청을 하나의 컨트롤러(Servlet)가 먼저 받습니다.
  • 즉 MVC1과는 다르게 Controller, View가 분리되어 있습니다.
  • 따라서 역할이 분리되어 MVC1 패턴에서의 단점을 보완할 수 있습니다.
  • 그러므로 개발자는 M, V, C 중에서 수정해야 할 부분이 있다면, 그것만 꺼내어 수정하면 됩니다. > 유지보수에 있어 큰 이점!
  • MV2는 MVC1 패턴보다 구조가 복잡해질 수 있지만, 개발자가 이러한 세부적인 구성까지 신경쓰지 않을 수 있도록 각종 프레임워크들이 지금까지 잘 발전되어 왔습니다. 그 중에서 대표적인 것이 바로 스프링 프레임워크입니다.

 

4. Spring Framework의 MVC2 패턴

  • 스프링에서는 유저의 요청을 받는 DispathcerServlet이 핵심입니다. 이것이 Front Controller의 역할을 맡습니다.
  • Front Controller(프런트 컨트롤러)란, 우선적으로 유저(클라이언트)의 모든 요청을 받고, 그 요청을 분석하여 세부 컨트롤러들에게 필요한 작업을 나눠주게 됩니다.
  • 모든 과정은, 스프링 프로젝트를 실행하여 디버깅할 시 로그에서 모두 확인할 수 있습니다.

 

5. Spring MVC 구조

DispatcherServlet

다른 웹 프레임워크들에서 사용되는 Front Controller의 역할을 한다. 즉, 가장 앞단에서 클라이언트의 요청을 처리하는 Controller로써 요청부터 응답까지 전반적인 처리 과정을 통제한다.

Handler(Controller)

Spring MVC에서는 Controller=Handler(핸들러)라고 생각하면 편하다. 핸들러는 DispatcherServlet가 전달해준 HTTP 요청을 처리하고 결과를 Model에 저장한다.

ModelAndView

ModelAndView는 controller에 의해 반환된 Model과 View가 Wrapping 된 객체이다. 말 그대로 Model과 View가 같이 들어있는 객체라고 보면 된다.

ViewResolver

ViewResolver는 ModelAndView를 처리하여 View를 그리는 역할을 한다. Model에 저장된 데이터를 사용해 View를 그리고 사용자는 View를 보게 된다.

 

6. Spring MVC 동작 구조

  1. 핸들러 조회 : 핸들러 매핑을 통해 요청 URL에 매핑된 핸들러(컨트롤러)를 조회
  2. 핸들러 어댑터 조회 : 핸들러를 실행할 수 있는 핸들러 어댑터를 조회한다.
  3. 핸들러 어댑터 실행 : 핸들러 어댑터를 실행한다.
  4. 핸들러 실행 : 핸들러 어댑터가 실제 핸들러를 실행한다.
  5. ModelAndView 반환 : 핸들러 어댑터는 핸들러가 요청을 처리하고 반환하는 정보를 ModelAndView로 변환해서 반환한다.
  6. viewResolver 호출 : viewResolver를 찾고 실행한다.
  7. View반환 : viewResolver는 View의 논리 이름을 물리 이름으로 바꾸고, 렌더링 역할을 담당하는 View 객체를 반환한다.
  8. View 렌더링 : View를 통해서 View를 렌더링한다.

7. 핸들러 매핑과 핸들러 어댑터(Handler Adapter)

- 핸들러 매핑은 DispatcherServlet이 요청에 맞는 핸들러를 찾는 과정입니다.
- 핸들러 어댑터는 핸들러 매핑에서 찾은 핸들러 객체를 다룰 수 있는 어댑터입니다.

 

+ 핸들러 매핑에서 요청에 맞는 핸들러를 찾았으면 바로 핸들러를 호출하면 되는 게 아닌가 하는 의문이 들 수 있습니다.

다양한 핸들러의 return 타입은 String, ModelAndView 등 다양하며, Parameter로 들어오는 값도 HttpServletRequest로 받거나 HttpServletResponse로 받는 등 다양한 형식으로 받을 수 있는데, 이처럼 다양한 핸들러 구현 방식에 맞춰 개발하는 것은 쉽지 않습니다.

 

따라서 이러한 요구 사항을 충족하기 위해 중간에 Adapter를 두는 어댑터 패턴을 사용하는 것입니다. 만약 핸들러 어댑터를 사용하면, 핸들러에서 결괏값을 어떻게 반환하든 이를 처리해 DispatcherServlet에게 ModelAndView객체로 통일하여 응답을 전달해 줄 수 있습니다. 이처럼 핸들러 어댑터를 사용하면 개발자는 좀 더 비즈니스 로직 구현에 집중할 수 있습니다.

 

다행히, Spring은 이미 필요한 핸들러 매핑과 핸들러 어댑터를 대부분 구현해두었기 때문에 개발자가 직접 핸들러 매핑과 핸들러 어댑터를 구현하는 일은 거의 없습니다.

 

728x90