[Design Pattern] MVC Pattern

Loopy·2022년 4월 12일
0

디자인패턴

목록 보기
9/9
post-thumbnail

1️⃣ MVC 패턴이란?

  • Model, View, Controller
  • 업무 로직(Business Logic) 및 데이터(Model)와 보이는 부분(View)을 분리
    • 뷰와 같은 사용자 인터페이스 로직이 비즈니스 로직보다 더 자주 바뀐다면 MVC를 사용하는 것이 바람직함
  • 🌟 화면을 포함하는 사용자 인터페이스업무 처리 부분을 분리해서 동작할 수 있도록 함

🔗 MVC 패턴 설계

  • 모델(Model) : 응용 프로그램의 데이터를 관리하는 부분 또는 로직
    • 뷰의 모델은 한 개만 존재
  • 뷰(View) : 사용자가 보는 데이터를 화면에 보이는 부분을 관리
    • 모델에 대해서 뷰는 여러 개 존재 가능
  • 컨트롤러(Controller) : 사용자의 입력을 처리하고, Model과 View 사이에서 상호 작용을 할 수 있도록 지원
    • 한 개 이상 존재 가능

🤭 MVC 패턴은, 데이터가 UI로부터 분리되어 따로 검수하거나 사용하는 것이 가능해진다!

🔗 디자인 패턴

  • 이름 : MVC 혹은 Model-View-Controller
  • 문제 : 데이터와 해당 데이터를 보여주는 부분의 코드가 섞여 있음
  • 해결방안 : 데이터와 뷰를 분리하고 이들을 연동시키는 컨트롤러를 추가
  • 결과 : loose coupling(분리), 재사용성

🔗 MVC 패턴의 변형

1)패시브 모델(Passive Model)

  • 컨트롤러만 뷰를 통해 모델을 조작
  • 사용자가 인터페이스를 조작하거나 입력하면 컨트롤러가 모델을 수정함
  • 모델이 수정된 후에 컨트롤러는 뷰를 업데이트 하도록 요청
  • 뷰는 모델에서 데이터를 받아서(요청 후) 화면을 업데이트
  • 여기서 업데이트란, 화면을 업데이트하기 위한 모든 데이터 요청(데이터 변경, 데이터 가져오기 등)

2)액티브 모델(Active Model)

  • 컨트롤러만이 모델을 수정하는 것이 아님
  • 모델에서 뷰를 업데이트하도록 요청하는 것이 가능
    • 모델(subject) 이 서브젝트 인터페이스를 제공하고 뷰(observer/subscriber) 에서 옵저버로 등록
  • 뷰는 모델에서 데이터를 받아서 (요청 후) 화면 업데이트

2️⃣ MVC 패턴과 자바 Swing

  • Model/Delegate 구조를 사용
    • Delegate : 컨트롤러 + 뷰
  • 자바 스윙의 컴포넌트들은 모델과 델리게이트로 구성됌
    • 각 컴포넌트들은 기본적인 기능을 제공하는 디폴트 모델과 델리게이트를 제공(ex) button, list..)
    • setModel()setUI() 메소드를 이용해서 모델 또는 델리게이트를 변경 가능
  • 뷰와 모델은 subject - subscriber의 역할을 함!
    • 뷰는 모델에 변경 통지 알림 등록을 하고, 모델에서는 뷰를 업데이트

3️⃣ MVC 패턴과 웹

image

  • 1) 사용자가 웹사이트에 접속
  • 2) 컨트롤러는 사용자가 요청한 웹페이지를 서비스 하기 위해서 모델을 호출
  • 3) 모델은 데이터베이스나 파일과 같은 데이터 소스를 제어한 후에 그 결과를 반환
  • 4) 컨트롤러는 모델이 반환한 결과를 뷰에 반영
  • 5) 데이터가 반영된 뷰는 사용자에게 보여짐

🔗 모델(1)

  • 기존의 JSP 에서는, 로직 처리를 위한 자바 코드와 뷰를 위한 HTML 코드가 섞여있어서 유지보수가 안좋은 문제 발생

🔗 모델(2)

  • 컨트롤러의 역할을 해주는 Servlet과 뷰를 위한 JSP가 분리가 됌
    • class ExController extends HttpServlet{}

4️⃣ MVC 패턴 단점

장점

  • 클래스간 정보 공유를 최소화시키는 객체 지향 구조
    • 모델과 뷰가 서로에 대해서 잘 몰라도 됨
  • 같은 모델에서 여러 개의 뷰를 지원할 수 있음

단점

  • 비효율적일 수 있음
    • 뷰가 업데이트 되어야 함을 알려주면, 뷰는 모델로부터 정보를 받아서 업데이트함
    • 모델이 뷰가 필요로 하는 것을 직접 전달하는 것이 더 효율적이지만, 객체 지향적이지는 않음
    • 컨트롤러의 역할이 너무 커질 수 있음
profile
개인용으로 공부하는 공간입니다. 잘못된 부분은 피드백 부탁드립니다!

0개의 댓글