![movie](https://img.youtube.com/vi/es1ckjHOzTI/0.jpg)
[10분 테코톡] 🐝범블비의 MVC Pattern
- MVC의 역사
- 1979년 데스크톱 애플리케이션을 위해 만들어진 설계
- 사람과 컴퓨터 사이의 간극을 해결하기 위해 탄생
- 'Small-Talk80(1988)'이라는 논문에서 지금의 MVC 패턴과 유사한 패턴이 발표가 됨. 모델과 뷰가 결합이 되어있다는 점에서 현재의 패턴과 다름
- 당시 html과 java를 섞어 놓은 JSP를 많이 사용
- 로직과 출력 코드가 한 페이지에 삽입되어 코딩은 간단했지만, 유지보수에 어려움이 많았음
- 데스크톱 애플리케이션을 위해 만들어진 MVC 패턴을 JSP에 적용시켜 만든 것이 JSP model 2(1998)
- MVC 패턴을 웹에 적용. 비즈니스/출력 로직의 분리함으로써 유지보수가 용이해지고, 분업이 가능해짐
- 여전히 모델과 뷰가 결합되어 있는 형태
- 현재 Model과 View의 완전한 분리된 MVC 패턴은 애플사가 제시한 Cocoa MVC
- MVC
- 흐름: 클라이언트가 필요한 기능을 컨트롤러에게 요청 -> 컨트롤러가 해당 기능을 수행하는 모델에게 로직을 수행하도록 맡김 -> 컨트롤러가 결과를 받고, 뷰를 클라이언트에게 제공
- Model: 데이터와 행동을 갖는 객체. 비즈니스 로직을 수행(상태 변화 처리, 상태 정보 반환)
- View: 데이터를 시각화. 모델이 처리한 데이터를 컨트롤러를 통해 받아서 처리 -> 데이터, 로직을 포함하지 않음
- Controller: 사용자 요청을 해석하여 처리하고 결과를 반환. 유일하게 다른 컴포넌트(모델과 뷰)의 존재를 알고 있는 요소로, 데이터의 흐름을 제어
- MVC 패턴을 사용하는 이유, 도메인의 재사용(= 중복 코딩 제거). 확장성 증가. 각 요소들에 집중할 수 있음(= 각 요소들이 변경되더라도, 다른 요소들을 수정할 필요 없음)
- Layer
- 단순히 모델, 뷰, 컨트롤러로 분리하여 개발한다면 컨트롤러에 로직이 많이 쌓이게 된다. 컨트롤러가 비대해짐. 중복 코드 발생. DB에 접근하는 컨트롤러의 구분이 애매해짐
- 5-layer: presentation, control, business logic(service, domain), persistance, domain model
- presentation layer = View
- control layer = controller
- service logic: presentation layer와 control layer를 이어주는 역할. 클래스 간 관계를 관리. 상태(흐름)을 저장. 트랜젝션을 가짐
- domain object: 데이터의 행위를 갖는 객체. Model과 동일. persistance layer와 mapping되는 성격을 가짐
- persistance layer: 데이터의 처리(CRUD). DB에 직접 접근하여 데이터를 처리.
- domain model layer: (영상에서 설명이 생략되어 구글링...) 각 계층 사이에 전달되는 실질적인 비즈니스 객체. 데이터 전송 객체(DTO) 형태로 개발자가 직접 제작해서, 리퀘스트나 세션과 같은 콘텍스트에 담아 전달
- 유효성의 검증
- View: 간단한 검증(비어있는 값, 적절하지 않은 타입)
- Controller: 파라미터 존재 유무
- Model: 데이터, 로직에 대한 검증
- MVC 패턴의 문제: View와 Controller가 강하게 결합(변경이 생기면 둘 다 수정해야함)
- 문제에 따른 대안
- MVP: presneter를 사용하여 View의 interface를 주입하는 방식으로 결합도를 낮춤
- MVVM: View가 ViewModel을 구독(영상 발표자의 설명이 애매한 부분이 있어서 구글링...)
View에 입력이 들어오면 ViewModel에게 명령. ViewModel은 필요한 데이터를 Model에게 요청. Model은 ViewModel에게 요청된 데이터를 응답. ViewModel은 응답 받은 데이터를 가공하여 저장. View는 ViewModel과의 Data Binding으로 인해 자동으로 갱신
*참조 사이트:
(도메인 모델 레이어: https://sac4686.tistory.com/15)
(MVVM patter: https://jhtop0419.tistory.com/21)