본문 바로가기

About my life/Development Studies

[MVC] Model-View-Controller 디자인 패턴이란 ?

728x90
반응형

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 패턴을 사용한다. 

 

728x90
반응형