프리코스 과제를 하며 초기 설계 단계에서 가장 많이 하는 고민이 클래스를 어떻게 분리할까? 이다.
한 객체당 기능을 최소화하고, 책임을 분리하는데 초점을 맞추고 싶었지만 생각보다 어려웠다.~~
지금까지는 MVC 패턴과 유사한.. 흉내만 낸 패턴을 적용했는데, 의미를 제대로 인지하지 않고 흉내만 내니 한 메서드가 하나의 역할을 하지 못한다거나, 객체의 역할의 불명확하다는 등 문제를 안은 코드를 개발하는 것 같았다.
한 번 MVC 패턴에 대해 정리하고자 한다.
우선, 디자인 패턴에 관한 정의부터 하면 다음과 같다.
디자인 패턴이란?
특정 문맥과 상황에서 반복해서 일어나는 문제에 대한 해결방안을 정리한 것을 의미함. 특별한 문제가 아니라, 보편적인 문제상황에서의 해결방안을 이야기한다.
느낌으로 정리하면 반복되는 문제 상황에 대한 적절한 해답, 유형화된 오답노트와 유사하다.
그렇다면 MVC패턴은 무엇일까?
우선, MVC란 Model, View, Controller의 약어로 각각의 역할을 보자.
Model: 데이터와 비즈니스 로직을 관리함
Model의 역할은 다음과 같다.
- 데이터 저장 및 관리 : 어떤 프로젝트, 앱의 객체가 있으면 해당 객체가 포함해야할 데이터가 무엇인지를 정의하고 이를 관리한다.
- 데이터 변경 알림 : 자신이 가지고 있는 데이터가 변경되면 이를 자신의 정보를 보여주는 View와 Controller에게 변경 사실을 알린다.
View: 레이아웃과 화면을 처리함
데이터를 보여주는 방식을 정의함. 모델로부터 데이터를 받고 이를 사용자에게 보여줌.
- Model 변경 사항 업데이트 : Model이 자신의 데이터가 변경되었음을 알리면 해당 데이터를 가져와서 Update함.
- Controller와 쌍을 이룸. Model과 Controller는 1대1
- 사용자의 변경(Event) Controller에 전달 : 사용자가 View에서 특정 값을 변경하는 이벤트를 발생시키면 해당 내용을 Controller에 알린다.
Controller: 모델과 뷰로 명령을 전달함
앱의 사용자의 입력에 대한 응답으로 모델과 뷰를 업데이트함.
Ex: 사용자 입력(쇼핑리스트 업데이트 or Game Count Update) → 모델에서의 값을 Update
사용자의 입력에 대한 처리를 여기서 다하는 듯
모델과 View에 대해 알고 있어야함.
변경 내용을 통지해야함
- 이벤트 캐치 : 자신과 연결된 View에서 변화에 대한 이벤트를 캐치한다.
- View에서의 변경 사항 전달 : View에서 변화된 수정 내역을 Model에게 알려준다.
- View → Controller → Model 구조
전파 메커니즘
특정 View → View와 관련된Controller가 이벤트 캐치 후 Model에 알림 → Model 데이터 변경 + 변경내역 알림(notify)
→ View, Controller들 변경된 Data를 get 및 Update함
MVC의 연관관계
모델 : 뷰 = 1 : *
모델 : Controller 1: *
뷰 : Controller , 1 : 1
장점이 뭘까?
- View - Model(Data) 사이의 중간자 역할을 Controller가 함
- 인터페이스와 비즈니스 로직에 대한 분리 → 맡은 바에 집중할 수 있음
- EX: Model에서 입출력을 하는일이 없음.
즉, 객체의 역할을 분리할 수 있다.
디자인 패턴은 위에서 보편적인 문제상황에 대한 해결방안이라고 이야기하였다. MVC는 어떤 문제 상황을 해결했을까?
MVC는 어떤 문제를 어떻게 해결했지?
MVC의 본질은 관심사의 분리 이다. 객체를 구분할 때 어떤 객체가 어떤 역할을 하는게 좋을까? 책임을 어떻게 나눌까? 에 대한 고민에 대해 사용자의 인터페이스와 비즈니스 로직을 구분하여 역할 분리를 가능하게 한 패턴이다.
따라서, MVC패턴은 요구사항을 보고 프로젝트를 시작할 때 객체의 책임과 역할을 어떻게 나눌 것인가에 대한 해답 중 하나라고 한다. 객체 설계를 할 때 클래스를 어떻게 나누지?에 대한 고민을 하는 사람들은 해당 패턴을 한 번 공부하면 좋을 듯 하다.
참고자료
https://velog.io/@eddy_song/mvc
https://ko.wikipedia.org/wiki/모델-뷰-컨트롤러
https://m.blog.naver.com/jhc9639/220967034588
https://noguen.com/software-engineering/software-architecture
'CS > 소공' 카테고리의 다른 글
Requirements Analysis (0) | 2023.06.09 |
---|---|
Object-Orientation (0) | 2023.04.20 |
Use Case Diagram / Description (0) | 2023.04.18 |
Requirements Capture (0) | 2023.04.14 |
Modeling Concepts (0) | 2023.04.12 |