본문 바로가기
코딩취미/Python

파이썬 MVC 패턴 프로젝트 구성 및 예시

by 브링블링 2024. 7. 22.
반응형

파이썬 MVC 패턴 프로젝트 구성 및 예시

MVC (Model-View-Controller) 모델 기반의 프로젝트 구조를 설정하면, 코드의 유지보수성과 확장성을 크게 향상시킬 수 있습니다. controllers 디렉토리는 비즈니스 로직을 처리하고, models 디렉토리는 데이터와 관련된 로직을 포함하며, views 디렉토리는 사용자 인터페이스를 정의합니다. resources 디렉토리는 리소스 파일을 포함하고, config 디렉토리는 설정 파일을 포함합니다. tests 디렉토리는 테스트 코드를 포함하여 각 구성 요소를 테스트합니다.

* 프로젝트 구성

project_root/
├── main.py
├── app/
│   ├── __init__.py
│   ├── controllers/
│   │   ├── __init__.py
│   │   └── main_controller.py
│   ├── models/
│   │   ├── __init__.py
│   │   └── data_model.py
│   ├── views/
│   │   ├── __init__.py
│   │   ├── main_view.py
│   │   └── ribbon_bar.py
│   └── resources/
│       ├── __init__.py
│       └── icons/
│           └── example_icon.png
├── config/
│   ├── __init__.py
│   └── settings.py
├── tests/
│   ├── __init__.py
│   ├── test_models.py
│   ├── test_views.py
│   └── test_controllers.py
└── requirements.txt

 

 

  • main.py
    • 프로그램의 진입점입니다. 애플리케이션을 초기화하고 메인 윈도우를 실행합니다.
  • app/
    • 애플리케이션의 주요 코드가 위치합니다.
    • controllers/: 애플리케이션의 비즈니스 로직과 사용자의 입력을 처리하는 부분입니다.
      • main_controller.py: 애플리케이션의 메인 컨트롤러입니다. 모델과 뷰 사이의 중개 역할을 합니다.
    • models/: 데이터와 관련된 로직을 포함하는 부분입니다.
      • data_model.py: 애플리케이션의 데이터 모델을 정의합니다.
    • views/: 사용자 인터페이스를 정의하는 부분입니다.
      • main_view.py: 메인 윈도우와 관련된 뷰를 정의합니다.
      • ribbon_bar.py: 리본 바를 정의합니다.
    • resources/: 애플리케이션에서 사용하는 리소스를 포함하는 부분입니다.
      • icons/: 아이콘 등의 리소스 파일을 포함합니다.
  • config/
    • 애플리케이션의 설정 파일이 위치합니다.
    • settings.py: 설정과 관련된 변수를 정의합니다.
  • tests/
    • 테스트 코드를 포함하는 부분입니다.
    • test_models.py: 모델에 대한 테스트를 포함합니다.
    • test_views.py: 뷰에 대한 테스트를 포함합니다.
    • test_controllers.py: 컨트롤러에 대한 테스트를 포함합니다.
  • requirements.txt
    • 프로젝트의 의존성을 정의합니다.
반응형

* 예시 코드

1) main.py

import sys
from PyQt5.QtWidgets import QApplication
from app.controllers.main_controller import MainController

def main():
    app = QApplication(sys.argv)
    controller = MainController()
    controller.show_main_view()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

 

2) app/controllers/main_controller.py

from app.models.data_model import DataModel
from app.views.main_view import MainView

class MainController:
    def __init__(self):
        self.model = DataModel()
        self.view = MainView(self)

    def show_main_view(self):
        self.view.show()

    def update_model(self, data):
        self.model.set_data(data)
        self.view.update_view(data)

    def get_data_from_model(self):
        return self.model.get_data()

 

3) app/models/data_model.py

class DataModel:
    def __init__(self):
        self.data = None

    def set_data(self, data):
        self.data = data

    def get_data(self):
        return self.data

 

4) app/views/main_view.py

from PyQt5.QtWidgets import QMainWindow, QLabel, QVBoxLayout, QWidget
from app.views.ribbon_bar import RibbonBar

class MainView(QMainWindow):
    def __init__(self, controller):
        super().__init__()
        self.controller = controller
        self.initUI()

    def initUI(self):
        self.setWindowTitle("MVC Application")
        self.setGeometry(300, 300, 800, 600)

        self.ribbonBar = RibbonBar(self)
        self.setMenuBar(self.ribbonBar)

        self.label = QLabel("Welcome to MVC Application", self)
        layout = QVBoxLayout()
        layout.addWidget(self.label)

        central_widget = QWidget()
        central_widget.setLayout(layout)
        self.setCentralWidget(central_widget)

    def update_view(self, data):
        self.label.setText(data)

 

5) app/views/ribbon_bar.py

from PyQt5.QtWidgets import QMenuBar, QAction, QMessageBox

class RibbonBar(QMenuBar):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.initUI()

    def initUI(self):
        menu1 = self.addMenu("Category 1")
        action1 = QAction("Option 1-1", self)
        action1.triggered.connect(lambda: self.showMessage("Option 1-1"))
        menu1.addAction(action1)

    def showMessage(self, message):
        QMessageBox.information(self, "Menu Selected", f"Selected Menu Option: {message}")

 

6) config/settings.py

APP_NAME = "MVC Application"
VERSION = "1.0.0"

 

* 기타 예시

Application/
│
├── Main/  # 설정 파일과 상수
│   └── main.py # 프로그램 진입점
│
├── Config/  # 설정 파일과 상수
│   ├── __init__.py
│   └── settings.py
│
├── Controller/  # 애플리케이션 로직과 이벤트 핸들링
│   ├── __init__.py
│   ├── main_controller.py
│   └── document_controller.py
│
├── Model/  # 데이터 모델
│   ├── __init__.py
│   └── document.py
│
├── Service/  # 외부 서비스와의 통신, 데이터베이스 관리 등
│   ├── __init__.py
│   └── database_service.py
│
└── Util/  # 유틸리티 함수
│   ├── __init__.py
│   ├── logger.py
│   └── file_utils.py
│
└── View/  # UI 뷰와 관련 컴포넌트
    ├── __init__.py
    ├── main_window.py
    ├── SubView/
    │   ├── __init__.py
    │   └── pin_view.py 
    └── Dialog/
        ├── __init__.py
        └── project_dialog.py

 

반응형