개발여행
디자인 패턴: MVC, MVP, MVVM 본문
어디선가 누가 멘션하는 걸 들어본 적이 있는 것만 같은 MVC, MVP... 모두 디자인 패턴이라는 프로그래밍을 작성하는 방식에 해당하는 것들이다. 초기에 프로그래밍을 배우기 시작했을 땐 하나도 와닿지 않았는데, 시간이 지나니 이런 디자인 패턴을 적용했을 때와 적용하지 않았을 때의 차이점이 보이기 시작하는 것 같다.
MVC 패턴
Model-View-Controller로 이루어진 MVC 패턴은 비즈니스 로직과 UI를 분리하여 유지보수성과 재사용성을 높인다.
- Model: 데이터 및 비즈니스 로직 관리ㅡ서버에서 데이터를 가져오고 가공하는 역할
- View: 사용자에게 보이는 UI 담당ㅡ사용자가 상호작용할 수 있음
- Controller: Model과 View의 중재자ㅡ사용자 입력 처리 및 Model의 데이터를 View에 전달
이 패턴에서는 모델이 데이터를 갖고 있고, 이 데이터를 렌더링하는게 뷰다. 컨트롤러는 모델의 데이터를 뷰가 렌더링하도록 지시한다.
하이레벨에서 봤을 때 MVC 패턴의 코드는 이렇게 구성할 수 있다:
// 모델
class Model {
constructor() {
this.data = "Hello, MVC!";
}
}
// 뷰
class View {
render(data) {
console.log(data);
}
}
// 컨트롤러
class Controller {
constructor(model, view) {
this.model = model;
this.view = view;
}
updateView() {
this.view.render(this.model.data);
}
}
const model = new Model();
const view = new View();
const controller = new Controller(model, view); // 모델과 뷰를 주입시킨다
controller.updateView(); // 뷰를 업데이트하는 것은 컨트롤러가 제어한다
MVP 패턴
MVC 패턴이랑 비슷하지만 컨트롤러가 프레젠터로 교체됐다. 프레젠터는 컨트롤러만큼 뷰와 강하게 결합돼있진 않지만, 뷰가 프레젠터를 참조하고 있어서 사용자 상호작용을 직접적으로 프레젠터에 알릴 수 있다.
- Model: 데이터 및 비즈니스 로직 관리 (MVC와 동일)
- View: UI 담당ㅡ사용자의 상호작용을 Presenter에게 전달
- Presenter: View와 Model 간의 상호작용 담당ㅡ비즈니스 로직 처리 후 View에 데이터 전달
// 모델
class Model {
constructor() {
this.data = "Hello, MVP!";
}
getData() {
return this.data;
}
}
// 뷰
class View {
constructor() {
this.presenter = null;
}
setPresenter(presenter) {
this.presenter = presenter;
}
display(data) {
console.log(data);
}
onButtonClick() {
this.presenter.onButtonClick();
}
}
// 프레젠터
class Presenter {
constructor(model, view) {
this.model = model;
this.view = view;
this.view.setPresenter(this);
}
onButtonClick() {
const data = this.model.getData();
this.view.display(data);
}
}
const model = new Model();
const view = new View();
const presenter = new Presenter(model, view);
presenter.onButtonClick();
MVVM 패턴
MVVM 패턴에서는 뷰모델이라는 새로운 중재자가 등장한다. 양방향으로 데이터가 결속되도록 뷰모델이 데이터와 렌더링 함수를 직접적으로 들고 실행한다.
- Model: 데이터와 비즈니스 로직 관리
- View: UI 담당
- ViewModel: View와 Model의 중재자ㅡView의 상태를 렌더링에 반영 및 Model의 데이터를 View에 바인딩
MVVM의 특징은 이런 양방향 데이터 바인딩을 통해 뷰와 뷰모델 간의 데이터가 즉시 동기화된다는 점이다.
'CS' 카테고리의 다른 글
인코딩(encoding)과 암호화(encryption)의 차이 (0) | 2024.08.02 |
---|---|
HTTP와 HTTPS의 차이가 뭔가요? (0) | 2024.07.20 |
디자인 패턴: 싱글톤, 팩토리, 옵저버 (1) | 2024.07.13 |
WebAssembly 알아보기 (0) | 2024.07.12 |
인터넷과 데이터 이동 (0) | 2023.08.03 |