1. MVC디자인 패턴의 정의:
소프트웨어 공학에서 사용되는 구조적 디자인 패턴 중 하나. 이 패턴은 소프트웨어를 모델, 뷰, 컨트롤러 세 가지 주요 구성 요소로 분리하여 설계하고, 각각의 역할을 정의함으로써 소프트웨어의 유지보수성, 확장성, 재사용성을 향상시키기 위한 목적으로 등장했음.
2. MVC디자인 패턴의 역사:
1970년대에 Dennis Ritchie와 Ken Thompson이 개발한 Smalltalk 언어의 GUI 프레임워크에서 처음으로 도입되었다. 이후 GUI를 위한 설계 패턴으로 큰 인기를 얻어 오늘날에도 널리 사용되고 있음.
- 기존 GUI 프로그래밍에서는 UI 와 비지니스 로직이 강하게 결합되어있었음. 따라서 코드가 엄청 복잡하고 유지보수가 어려웠음. 이 문제를 개선하기 위해 UI 를 분리하였고 이로인해 각각 독립적으로 관리하는 것이 가능해짐.
- 독립적으로 관리가 가능하기 때문에 재사용성 및 확작성이 강화되었음.
- 또한 테스트를 하는데도 용이하게 되었음. 단위별로 테스트할 수 있게 되었음.
- 마지막으로 코드의 가독성도 좋아졌음.
- 결과적으로 MVC 패턴은 소프트웨어의 설계를 논리적으로 분리하고 간소화하는 데 도움이 되었음.
그렇다면 왜 하필 GUI 프레임워크에서 MVC 디자인 패턴이 사용되는 거지 ?
- 주로 UI가 상태 변화와 사용자 입력에 반응해야 하는 복잡한 동작을 가지고 있기 때문이라고 한다.
- 이러한 이유로 복잡성을 관리하고 유지보수하기 위해서는 MVC 패턴이 적합하다고 여겨지는 것이다.
결론: GUI와 같이 복잡한 동작을 소프트웨어로 구현할 때 설계 단위를 모델, 뷰, 컨트롤러 세 가지로 나누어서 구현하게 되면 가독성, 확장성, 재사용성을 개선할 수 있기 때문에 오늘 날에도 널리 적용되고 있음.
3. MVC디자인의 구성 요소:
Model(모델):
- 데이터와 비지니스 로직을 담당
- 데이터의 변화에 대한 로직을 처리하고, 데이터의 현재 상태를 관리
- 애플리케이션의 핵심 기능 수행
- Ex) 주문 처리, 결제 로직, 예약 처리, 할인 규칙, 회원 등급, 혜택 부여, 입출금 등등
View(뷰):
- 사용자의 인터페이스를 담당
- 모델의 데이터를 시각적으로 나타내어 사용자에게 표시해줌
Controller(컨트롤러):
- 사용자의 입력을 받아 모델 또는 뷰를 업데이트
- 모델과 뷰 사이의 상호 작용을 관리
4. MVC디자인의 간단한 예시:
TO DO Apllication
# 모델
class TodoModel:
def __init__(self):
self.todos = []
def add_todo(self, task):
self.todos.append({"task": task, "completed": False})
def mark_complete(self, index):
if 0 <= index < len(self.todos):
self.todos[index]["completed"] = True
def get_todos(self):
return self.todos
모델에서는 위에서 언급했던 것처럼 데이터 및 비지니스 로직을 처리한다.
ToDo Apllication 에서 사용자의 리스트를 추가하거나 삭제하는 등의 관리를 한다.
# 뷰
class TodoView:
def display_todos(self, todos):
for index, todo in enumerate(todos):
status = "Done" if todo["completed"] else "Not Done"
print(f"{index + 1}. {todo['task']} - {status}")
def get_user_input(self):
return input("Enter the task: ")
뷰에서는 사용자에게 필요한 데이터를 시각화해서 보여주는 작업을 처리한다.
# 컨트롤러
class TodoController:
def __init__(self, model, view):
self.model = model
self.view = view
def add_todo(self):
task = self.view.get_user_input()
self.model.add_todo(task)
def mark_complete(self):
index = int(self.view.get_user_input()) - 1
self.model.mark_complete(index)
def show_todos(self):
todos = self.model.get_todos()
self.view.display_todos(todos)
컨트롤러는 모델과 뷰 사이의 상호작용을 관리한다.
# 작업 실행
model = TodoModel()
view = TodoView()
controller = TodoController(model, view)
# 사용자 입력을 받아 모델을 업데이트하거나 뷰를 업데이트하는 등의 작업 수행
controller.add_todo()
controller.show_todos()
controller.mark_complete()
controller.show_todos()
간단한 예시로 논리적인 세 구성 요소로 나누어서 애플리케이션이 동작되는 과정을 한눈에 볼 수 있다.
5. MVC디자인의 실제 활용되고 있는 예시:
웹 개발 - Django(파이썬 웹 프레임워크):
- Django는 파이썬으로 작성된 웹 프레임 워크로, MVC 패턴을 사용한다. 모델은 데이터베이스와 연결된 부분, 뷰는 사용자에게 표시되는 부분, 템플릿은 뷰에서 사용되는 표현 방법을 정의하는 부분이다.
웹 개발 - Ruby on Rails(루비 웹 프레임워크):
- Ruby on Rails는 루비로 작성된 웹 프레임워크로, MVC 패턴을 사용한다. 모델은 데이터를 다루는 부분, 뷰는 사용자에게 보여지는 부분, 컨트롤러는 사용자 입력을 처리하고 모델과 뷰를 관리하는 부분.
안드로이드 앱 개발:
- 안드로이드 앱의 개발에서도 MVC 패턴 또는 이를 확장한 MVP(Model-View-Presenter)패턴이 사용된다고 한다.
데스크톱 앱 개발 - Java Swing:
- Java Swing은 데스크톱 애플리케이션을 개발하기 위한 GUI 툴킷으로, MVC 패턴을 사용한다.
'About my life > Development Studies' 카테고리의 다른 글
[IT] 효과적인 프로젝트 기획: 주요 단계와 고려 사항 (98) | 2023.11.28 |
---|---|
[WEB] 웹 프레임워크 장단점 (Django, Flask, Express.js, Spring Boot, Ruby on Rails) (142) | 2023.11.27 |
[Server] Post 요청 튜토리얼 (21) | 2023.11.27 |
[Server] GET 요청 튜토리얼 (39) | 2023.11.26 |
[Network] 네트워크란 무엇인가? (219) | 2023.11.25 |