Skip to content

Commit 3881db8

Browse files
authored
Docs: 박승훈 8장 (#80)
1 parent 8ca9a4f commit 3881db8

File tree

1 file changed

+225
-0
lines changed

1 file changed

+225
-0
lines changed

챕터_8/박승훈.md

Lines changed: 225 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,225 @@
1+
## MVC 패턴
2+
3+
> 애플리케이션 구조를 개선하기 위해 관심사의 분리를 활용하는 아키텍처 디자인 패턴
4+
5+
- 모델(Model), 뷰(View), 컨트롤러(Controller)로 구성
6+
- 모델을 애플리케이션의 다른 인터페이스에서도 사용할 수 있다.
7+
8+
![MVC](/imgs/posts/2024/11/16/1.png)
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+
![MVP](/imgs/posts/2024/11/16/2.png)
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+
![MVVM](/imgs/posts/2024/11/16/3.png)
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

Comments
 (0)