MVC Architecture
이번 포스트에서는 MVC Architecture Pattern에 대해 다룬다.
MVC Architecture
MVC란?
-
MVC (Model - View - Control)는 복합 패턴 ( compound pattern) 으로 여러 디자인 패턴을 결합하여 사용
-
주요 구성 요소:
- Model: 애플리케이션의 핵심 데이터 및 로직
- View: 사용자 인터페이스(UI), 화면에 모델 데이터 표시
- Controller: 사용자 입력을 해석하고 모델/뷰에 전달

MVC Structure
- Model
- Non-UI Layer
- 응용 프로그램의 상태와 기능을 캡슐화
- 애플리케이션 기능을 제공하고 변경 발생시 View에 알림
- UI에 의존하지 않고 재사용이 가능하며 테스트에 용이
- View
- UI Layer : 사용자에게 보여지는 화면 담당
- Model의 데이터를 받아 시각적으로 표현하고, 상태 업데이트 요청
- 사용자 동작을 Controller에 전달하고, Controller가 선택한 View를 반영
- Controller
- 사용자 입력을 받아서 Model을 갱신하거나 View를 선택
- 앱 동작을 정의
- 사용자 액션을 통해 Model을 업데이트하고, 적절한 View 선택
흐름 요약:
- 사용자가 View와 상호작용
- Controller가 입력 처리
- Model을 변경
- Model이 View에 변경 알림
- View가 화면 업데이트
MVC motivation & solution
Motivation
- 하나의 데이터를 **다양한 View에서 보여줘야 한다. **
- 하나의 데이터를 다양한 interaciton 방식으로 수정해야한다.
- 이러한 다양한 View나 Interaction이 핵심 기능에 영향을 주면 안된다.
- UI 변경이 핵심 로직에 영향을 주면 안됨.
요약
하나의 데이터에 여러 View와 Interaction이 가능해야하며, 이것이 핵심 로직을 건드리지 않도록 해야한다.
Solution : 책임 분리 (Separating responsibilities)
- Core bussiness logic (model), 화면 표현 (view), 제어 흐름 (controller)
MVC Patterns
1. Observer Pattern : View와 Model의 분리
- Model의 상태 변경을 다수의 View에 알리기 위한 패턴
- Model이 상태가 바뀌면 View에 통지 후 자동으로 갱신
- Model은 View의 구체적인 구현을 몰라도 된다.
2. Composite Pattern : 중첩된 View의 구성
- 여러 View를 트리 구조로 묶어서 하나처럼 다룰 수 있게 함.
- 복합 위젯을 하나의 단위 처럼 처리하고
- 단일 인터페이스로 복합객체와 단일 객체를 동일하게 취급
3. Strategy Patern : View -> Controller 위임
- View가 사용자 입력 해석을 Controller에 위임하고, Controller 교체가 가능함.
- 컨트롤러는 전략처럼 다양하게 교체가 가능
- 입력 방식마다 다르게 부착 가능
- View는 단지 입력을 전달하고, 해석은 Controller가 전담
+ Factory, Decorator Pattern도 존재
- Factory Pattern : 객체 생성 로직을 추상화
- Decorator Pattern : View or Controller에 기능을 덧붙이는 방식
Observer Pattern 만족 하기 위함
Observer Pattern
- 어떤 객체의 상태 변화가 발생했을 때, 이를 관심 있는 다른 객체들이 자동으로 알리는 상태 패턴
- 즉, 한 객체의 상태가 바뀌면 그 객체에 의존하는 모든 객체들이 자동으로 통지를 받고 갱신된다는 뜻
-
1대 다 (One-to-Many) 관계이며 자동 업데이트가 핵심
- 특징
- Observer 수는 제한 없이 다수가 가능
- Model은 View의 내부를 알 필요가 없음. -> loose coupling
- 동적으로 Observer를 붙였다가 뗏다가 가능함.
- 예시 ) 신문의 구독 모델 (Publisher & Subscriber Model)
Bouncing Ball Applet (Java)
Model
- 상태: 공의 위치, 방향, 창 크기
- 기능: 한 스텝씩 움직이기 (
makeOneStep()), Observer 알림 포함
class Model extends Observable {
void makeOneStep() {
// 위치 이동, 경계 충돌 처리
setChanged();
notifyObservers();
}
}
View
- Mdoel을 구독
- 위치를 기반으로 화면 그리기
class View extends Canvas implements Observer {
public void update(Observable obs, Object arg) {
repaint(); // 공 위치 다시 그림
}
}
Controller
- UI 이벤트 처리 ( 버튼 클릭과 같음)
- Model, View를 연결하고, Observer 등록
class Controller extends JApplet {
model.addObserver(view);
stepButton.addActionListener(e -> model.makeOneStep());
}
Test (Notes)
- Litmus Test : UI를 바꿔도 Model이 동작하는가?
가능 : Model이 잘 분리되어있고, MVC 원칙을 지켰다는 증거
- JUnit : Model은 단독으로 테스트가 가능해야한다.
View 나 Controller 없이 테스트가 가능해야 진짜 Model
- Model 동작은 빠르게 처리되어야 한다.
- GUI가 멈춰버림.