|
| 1 | +## MVC 패턴 |
| 2 | + |
| 3 | +> 애플리케이션 구조를 개선하기 위해 관심사의 분리를 활용하는 아키텍처 디자인 패턴 |
| 4 | +
|
| 5 | +- 모델(Model), 뷰(View), 컨트롤러(Controller)로 구성 |
| 6 | +- 모델을 애플리케이션의 다른 인터페이스에서도 사용할 수 있다. |
| 7 | + |
| 8 | + |
| 9 | + |
| 10 | + |
| 11 | +### 모델(Model) |
| 12 | + |
| 13 | +- 애플리케이션의 데이터를 관리하는 역할 |
| 14 | +- 비즈니스 데이터와 주로 관련 |
| 15 | +- **변경 시 자신의 관찰자 객체에게 알림을 보냄** |
| 16 | +- **관찰자가 변경된 내용에 알맞게 능동적으로 대응 가능** |
| 17 | +- 보통은 모델의 속성을 검증하는 기능 지원 |
| 18 | + |
| 19 | + |
| 20 | +### 뷰(View) |
| 21 | + |
| 22 | +- 사용자 인터페이스를 담당 |
| 23 | +- 모델의 현재 상태를 표현 |
| 24 | +- 관찰자 패턴을 사용해 모델이 변경되었을 때 업데이트 |
| 25 | +- **JS의 뷰는 여러 DOM 요소의 집합을 생성/정리** |
| 26 | + |
| 27 | + |
| 28 | +### 컨트롤러(Controller) |
| 29 | + |
| 30 | +- 모델과 뷰를 연결하는 중재자 역할 |
| 31 | +- 사용자가 뷰를 조작할 때 모델을 업데이트 |
| 32 | + |
| 33 | + |
| 34 | +### MVC 패턴의 장점 |
| 35 | + |
| 36 | +- **전반적인 유지보수의 단순화** : 변경사항이 데이터 중심인지, 아니면 단순히 시각적인 변경인지 명확히 구분 가능 |
| 37 | +- **모델과 뷰의 분리** : 단위테스트의 작성이 훨씬 간편 |
| 38 | +- **모듈화** : 코어 로직 작업과 UI 작업의 분리로 개발자들이 독립적으로 작업 가능 |
| 39 | + |
| 40 | + |
| 41 | +### MVC 패턴의 단점 |
| 42 | + |
| 43 | +- **뷰와 컨트롤러 간의 강결합** : 한 곳의 수정이 필요할 때 수정이 동반 |
| 44 | +- **내재된 복잡성** : 모델, 뷰, 컨트롤러 각각을 별도로 관리해야 함 |
| 45 | + |
| 46 | + |
| 47 | +## MVP 패턴 |
| 48 | + |
| 49 | +> 프레젠테이션 로직의 개선에 초점을 맞춘 MVC 패턴의 변형 |
| 50 | +
|
| 51 | + |
| 52 | + |
| 53 | + |
| 54 | +### 프레젠터(Presenter) |
| 55 | + |
| 56 | +- 뷰에 대한 UI 비즈니스 로직을 담당 |
| 57 | +- 뷰에서의 이벤트 호출은 프리젠터로 **위임** (MVC 패턴과 달리) |
| 58 | +- 뷰와 분리되어 있으며 인터페이스를 통해 뷰와 통신 |
| 59 | + |
| 60 | + |
| 61 | +### MVC와 달리? |
| 62 | + |
| 63 | +#### 나의 생각 |
| 64 | + |
| 65 | +MVC 패턴도 컨트롤러가 사용자가 뷰를 조작할 때 모델을 변경하는 중재자 역할을 하기 때문에 뷰에서의 이벤트 호출이 위임된다는 개념으로 생각했어요. 그런데 MVP는 'MVC와 달리' 이벤트 호출을 프레젠터로 위임한다고 하니 무슨 차이인지 잘 모르겠더라고요. |
| 66 | + |
| 67 | + |
| 68 | +#### '둔한' 수동형 뷰 |
| 69 | + |
| 70 | +- MVP 패턴에서는 뷰를 주로 '둔한' 수동형 뷰로 만든다. |
| 71 | +- 수동형 뷰는 로직을 거의 가지고 있지 않는다. |
| 72 | +- 직접적인 데이터 바인딩의 개념이 없다. |
| 73 | +- 이벤트를 구독하여 뷰를 업데이트할 수 있도록 하는 것이 프레젠터의 역할 |
| 74 | + |
| 75 | + |
| 76 | +### MVC에서 MVP로의 변화 |
| 77 | + |
| 78 | +- 애플리케이션의 테스트 용이성 향상 |
| 79 | +- 뷰와 모델간의 분리를 더욱 명확하게 구분 |
| 80 | +- 데이터 바인딩이 지원되지 않아 작업을 별도로 처리해야 하는 비용이 발생 |
| 81 | + |
| 82 | + |
| 83 | +### MVP를 활용하면 좋은 경우 |
| 84 | + |
| 85 | +- 프레젠테이션 로직을 최대한 재사용해야 하는 엔터프라이즈 수준의 애플리케이션 |
| 86 | +- 뷰가 매우 복잡하고 사용자와의 상호작용이 많은 애플리케이션 |
| 87 | +- MVC가 해결하려면 여러 컨트롤러에 크게 의존해야 한다. |
| 88 | +- **MVP에서는 모든 복잡한 로직을 프레젠터 안에 캡슐화**할 수 있어 유지보수가 훨씬 간단 |
| 89 | +- 단, **MVC와 MVP 간의 차이점은 대부분 의미론적인 수준** |
| 90 | + |
| 91 | + |
| 92 | +## MVVM 패턴 |
| 93 | + |
| 94 | +> MVC와 MVP를 기반으로 하는 아키텍처 디자인 패턴 |
| 95 | +
|
| 96 | +- 선언적 데이터 바인딩을 활용하여 뷰에 대한 작업을 다른 계층과 분리 |
| 97 | +- 동일한 코드베이스 내에서 UI와 비즈니스 로직을 분리 |
| 98 | + |
| 99 | + |
| 100 | + |
| 101 | + |
| 102 | +### 뷰(View) |
| 103 | + |
| 104 | +> MVVM의 뷰는 MVC와 MVP의 뷰와 달리 능동적 뷰로 구성 |
| 105 | +
|
| 106 | + |
| 107 | +#### 수동적 뷰 |
| 108 | + |
| 109 | +- 단순히 화면을 출력할 뿐 사용자의 입력을 받아들이지 않음 |
| 110 | +- 애플리케이션의 모델에 대한 구체적인 정보를 가지고 있지 않을 수 있다. |
| 111 | +- 프레젠터에 의해 조작되는 뷰 |
| 112 | + |
| 113 | + |
| 114 | +#### 능동적 뷰 |
| 115 | + |
| 116 | +- 데이터 바인딩, 이벤트, 동작들을 포함하기 때문에 뷰모델에 대한 이해를 필요로 한다. |
| 117 | +- 뷰모델로부터 발생한 이벤트를 처리하는 책임은 여전히 뷰에 있다. |
| 118 | +- **뷰는 상태를 관리할 책임이 없다.** : 뷰는 뷰모델과 정보 또는 상태를 항상 동기화된 상태로 유지하기 때문 |
| 119 | + |
| 120 | + |
| 121 | +### 뷰모델(ViewModel) |
| 122 | + |
| 123 | +> 뷰모델은 UI 계층의 뒤쪽에 위치한다. |
| 124 | +
|
| 125 | +- **데이터 변환** : 모델의 정보를 뷰가 사용할 수 있는 형태로 변환 |
| 126 | +- **데이터 바인딩** : 뷰와 모델 사이의 데이터 동기화 |
| 127 | +- **이벤트 처리** : 뷰에서 발생한 명령을 모델로 전달 |
| 128 | +- 뷰의 디스플레이 로직 대부분을 처리 |
| 129 | +- 뷰의 상태를 유지하고, 뷰에서 발생한 동작에 기반해 모델을 업데이트 |
| 130 | +- 뷰에 이벤트를 발생시키는 등의 기능을 수행하기 위한 메서드를 제공 |
| 131 | + |
| 132 | + |
| 133 | +### 뷰와 뷰모델 |
| 134 | + |
| 135 | +- 뷰와 뷰모델은 데이터 바인딩과 이벤트를 통해 소통 |
| 136 | +- 뷰는 자체 UI 이벤트를 처리 |
| 137 | +- 필요에 따라 뷰모델에 연결 |
| 138 | +- 모델과 뷰모델의 속성은 양방향 데이터 바인딩을 통해 동기화 및 업데이트 |
| 139 | + |
| 140 | + |
| 141 | +### 뷰모델 vs 모델 |
| 142 | + |
| 143 | +- 뷰모델은 모델에 대해 전적인 책임을 진다. |
| 144 | +- 뷰모델은 데이터 바인딩을 위해 모델 또는 모델의 속성을 가져올 수 있다. |
| 145 | +- 뷰에 제공되는 속성을 가져오거나 조작하기 위한 인터페이스를 포함할 수 있다. |
| 146 | + |
| 147 | + |
| 148 | +### MVVM 패턴의 장점 |
| 149 | + |
| 150 | +- **뷰와 뷰모델의 분리** : 뷰와 뷰모델은 서로 독립적으로 테스트 가능 |
| 151 | +- **뷰의 추상화** : 뷰의 뒤에 작성되는 비즈니스 로직의 양 감소 |
| 152 | +- **테스트 용이성** : 뷰모델은 모델에 가까워 UI 고려 없이 테스트 가능 |
| 153 | + |
| 154 | + |
| 155 | +### MVVM 패턴의 단점 |
| 156 | + |
| 157 | +- **과도한 코드량** : 단순한 UI의 경우, 과도한 구현이 될 가능성 높음 |
| 158 | +- **데이터 바인딩과 테스트** : 단순히 중단점을 설정하는 명령형 코드에 비해 디버깅이 어려울 수 있음 |
| 159 | +- **데이터 바인딩의 복잡성** : 데이터 바인딩이 상당한 관리 부담을 만들어낼 수 있음 |
| 160 | + |
| 161 | + |
| 162 | +## MVC vs MVP vs MVVM |
| 163 | + |
| 164 | +> MVC와 두 파생 패턴들 사이의 핵심 차이 : 계층간 의존성과 연결 강도 |
| 165 | +
|
| 166 | + |
| 167 | +### MVC |
| 168 | + |
| 169 | +- 뷰가 아키텍처의 최상단에 위치하고 그 옆에 컨트롤러가 위치 |
| 170 | +- 뷰가 모델에 직접 접근할 수 있다. |
| 171 | +- 전체 모델을 뷰에 노출시키면 애플리케이션의 복잡도가 증가할 수 있다. |
| 172 | +- 심하면 보안 및 성능 문제가 발생할 수 있다. |
| 173 | +- MVVM은 이를 해결하기 위한 패턴 |
| 174 | + |
| 175 | + |
| 176 | +### MVP |
| 177 | + |
| 178 | +- 컨트롤러의 역할이 프레젠터로 대체 |
| 179 | +- 프레젠터는 뷰와 동일한 계층에 존재 |
| 180 | +- 뷰와 모델 양쪽에서 발생하는 이벤트를 수신하고 양측의 동작을 조정 |
| 181 | +- 뷰와 뷰모델을 바인딩하는 메커니즘을 제공하지 않음 |
| 182 | + - 각 뷰는 프레젠터가 뷰와 상호작용할 수 있도록 인터페이스 구현 |
| 183 | + |
| 184 | + |
| 185 | +### MVVM |
| 186 | + |
| 187 | +- 상태와 로직 정보를 포함할 수 있는 뷰와 관련된 모델 일부를 생성 가능 |
| 188 | +- 전체 모델을 뷰에 노출하는 것을 방지 가능 |
| 189 | +- 뷰모델이 뷰를 참조할 필요가 없음 |
| 190 | +- 뷰는 뷰모델의 속성을 바인딩하여 모델과 동기화 |
| 191 | +- 뷰가 추상화되어 뷰에 필요한 로직의 양이 줄어듦 |
| 192 | + |
| 193 | + |
| 194 | +## 최신 MV* 패턴 |
| 195 | + |
| 196 | +### Vue.js |
| 197 | + |
| 198 | +> **MVVM 패턴**을 기반으로 하는 프레임워크 |
| 199 | +
|
| 200 | +- **Vue 인스턴스** : 뷰와 뷰모델을 생성 |
| 201 | +- **데이터 바인딩** : 뷰와 뷰모델 사이의 데이터 동기화 |
| 202 | +- **이벤트 처리** : 뷰에서 발생한 명령을 뷰모델로 전달 |
| 203 | +- **컴포넌트** : 뷰와 뷰모델을 재사용 가능한 단위로 분리 |
| 204 | + |
| 205 | + |
| 206 | +### React |
| 207 | + |
| 208 | +> 뷰 계층을 원하는대로 구성하게 해주는 렌더링 라이브러리 |
| 209 | +
|
| 210 | +- 선언형 프로그래밍 방식 |
| 211 | +- '뷰'가 아닌 '데이터'를 제공하는 라이브러리 |
| 212 | + - 서버가 브라우저에 '뷰'를 직접 제공하지 않고, '데이터'를 제공 |
| 213 | + - 기존 MVC처럼 중앙 제어 역할을 하는 컨트롤러, 혹은 라우터가 없음 |
| 214 | + - 브라우저에서 데이터를 받아 뷰를 생성 |
| 215 | + - 전통적인 MVC로 분류하기 어려움 |
| 216 | +- **수직 분할형 컴포넌트** |
| 217 | + - MVC를 기술에 따른 수평적 분할 하는 것이 아니라, 관심사에 따라 수직적으로 분할 |
| 218 | + - **상태(모델), 렌더링(뷰), 제어 흐름 로직(소규모 지역화 컨트롤러)을 담는 수직 분할형 MVC** |
| 219 | + |
| 220 | + |
| 221 | +## 총평 |
| 222 | + |
| 223 | +그동안 MVC, MVVM 패턴에 대해서 많이 들어봤음에도 각각의 요소들이 뭘 의미하는지 정확히 알지는 못했어요. 그런데 각 구성 요소들을 하나하나 파헤쳐보고 아키텍처 패턴마다 차이점을 시각적 다이어그램과 설명을 통해 파악하니 조금은 머리에 들어온다는 생각이 들었어요. |
| 224 | + |
| 225 | +하지만 구조의 개념적인 부분이어서 코드 레벨로 구현된 예시 코드가 없다보니 실제로 활용한다면 어떻게 활용해야 할 지 조금은 막막하다는 생각이 들어요. 그래서 간단하게 정리해볼 수 있는 예시 코드를 발견한다면 추가해봐도 좋을 것 같네요. |
0 commit comments