728x90

1. 학습 목표

더보기

Model/View 기본 관계 이해

  • Model = 데이터 저장소
  • View = 데이터를 화면에 보여주는 역할
  • (참고) 4.2 의존성 문제 

 

2. 문제 파악

: 6.11 QScrollArea 예제에서 문제 파악

더보기

1. 지난 포스트(6.11 QScrollArea)에서 문제 확인

 

6.11 QScrollArea

다양한 스크롤 UI 위젯(QScrollArea, QListWidget, QTextEdit)을 사용해 보고,이를 하나의 창에서 QTabWidget 으로 탭 구조로 통합해 보기 1. QScrollArea더보기# tab_scroll_area.pyfrom PySide6.QtWidgets import ( QWidget, QVBoxLayo

basiclike.tistory.com

1.1 QScrollArea 기반 탭
라벨을 직접 content_layout.addWidget(label) 형태로 추가
→ 데이터가 GUI 위젯 안에 저장됨
→ 다른 View와 데이터 공유 불가


1.2 QListWidget 기반 탭
self.list_widget.addItem 데이터  ("항목")
→ 아이템 데이터는 QListWidget 내부에 별도의 ListModel로 저장됨
→ 다른 View와 데이터 공유 불가

1.3 QTextEdit 기반 탭
self.log_textedit.append("로그")
→ 텍스트는 QTextEdit 내부 문서(Document)에 바로 저장됨
→ 역시 다른 View와 데이터 공유 불가능

 

1.4 공통된 근본적 문제

다양한 스크롤 UI(View)는 결국 “표시 방식만 다를 뿐, 데이터는 동일할 수 있다”

QScrollArea, QListWidget, QTextEdit은 각각 자체적으로 데이터를 내부에 저장한다
→ 즉 “뷰(View)에 데이터가 저장되는 구조”


 

3. 문제 파악 을 위한 추가 예시

: Model - View 와 같은 아키텍처 패턴으로 구현하는 이유

더보기

3.1 공유 Data

User = {
    "name": "홍길동",
    "email": "hong@example.com",
    "role": "관리자"
}
  • 사용자가 로그인하면 다음과 같은 정보가 있다고 가정

 

3.2 여러 View

 

앱에는 다음과 같은 여러 화면(View)이 로그인한 사용자 정보를 표시해야 한다.

즉, 같은 데이터를 여러 View에서 공유해야 하는 상황.

  • 메인 화면
  • 설정 화면
  • 프로필 화면
  • 알림 화면 

 

 

3.3 문제 구조

class MainView(QWidget):
    def __init__(self, userInfo):
        self.userInfo = userInfo # ← ← ← 각 화면마다 userInfo를 복사해서 들고 있는 구조
        label.setText(f"{self.userInfo['name']} 님 환영합니다")
class ProfileView(QWidget):
    def __init__(self, userInfo):
        self.userInfo = userInfo # ← ← ← 각 화면마다 userInfo를 복사해서 들고 있는 구조
        label.setText(self.userInfo['email'])
  • 뷰(View)가 데이터(userInfo)를 직접 독립적으로 각각 저장하는 방식
  • userInfo가 변경되면, 다른 View는 절대 알 수 없다

 

4. 해결 구조

더보기

4. 해결 구조

하나의 모델(Model)을 만들어 데이터 중앙 관리

view_1      ←──     data  # 데이터가 View에 종속
view_2      ←──     data 
view_3      ←──     data 

view_1 ←─┐
view_2 ←── model ←─ data  # Model이 View에 종속
view_3 ←─┘
  • 데이터(Model)를 따로 만들고
  • 모든 View는 이 Model을 “보기만” 한다.