계층형 아키텍쳐와 MVVM

MVVM은 UI와 비즈니스 로직의 역할 분리를 목적으로 하고, 계층형 아키텍처는 시스템 전체의 역할 분리를 목표로 합니다. 따라서 MVVM과 아키텍처 설계 레이어는 비슷하지만 완전히 동일한 개념은 아닙니다.

MVVM에서의 레이어 분리

MVVM의 구조

  • Model
    • 애플리케이션의 데이터와 비즈니스 로직.
    • 데이터베이스, API 호출, 도메인 로직 처리 등이 포함됩니다.
  • ViewModel
    • View와 Model 사이의 중간자 역할.
    • View에 표시할 데이터를 준비하고, 사용자 입력을 Model로 전달합니다.
    • 데이터 바인딩과 커맨드 처리 로직이 포함됩니다.
  • View
    • 사용자 인터페이스(UI)를 구성.
    • ViewModel에 바인딩된 데이터를 표시하며, 사용자 이벤트를 ViewModel로 전달.

MVVM과 레이어 설계

MVVM 패턴에서는 한 기능(예: Port 관리 기능)이 다음과 같이 분리됩니다:

MVVM 레이어역할
ModelPort 데이터를 정의하고, Port 관련 로직(추가, 삭제, 수정)을 처리.
ViewModelPort 데이터의 상태를 관리하고, View에 표시할 데이터를 가공.
View사용자에게 Port 상태를 보여주고, 사용자 입력을 ViewModel로 전달.

즉, MVVM은 한 기능 안에서도 세부적인 역할을 나누는 구조를 제공합니다.

MVVM과 계층형 아키텍처의 차이점

MVVM은 UI 중심

  • MVVM은 WPF 애플리케이션에서 UI와 비즈니스 로직을 분리하는 데 초점이 맞춰져 있습니다.
  • Model은 비즈니스 로직을 처리하지만, 이는 UI와 관련된 기능에 제한됩니다.
    (예: UI에 표시할 데이터를 정리하거나, UI 이벤트에 반응하는 로직)

계층형 아키텍처 설계는 시스템 전체 관점

  • 아키텍처 설계의 레이어는 전체 시스템의 모듈 간 역할 분리를 다룹니다.
  • 데이터 캡처, 네트워크 통신, 데이터 저장, UI 등 다양한 기능이 포함되며, MVVM과 상관없이 독립적으로 설계됩니다.

MVVM과 아키텍처 레이어의 결합

MVVM을 사용하는 WPF 애플리케이션에서도 전체 아키텍처 설계의 레이어와 결합하여 설계할 수 있습니다.

예시: Port 관리 기능

  • Infrastructure Layer
    • 실제 포트를 열고 닫는 네트워크 통신 로직.
    • 예: SerialPort, TCP/IP 통신 구현.
  • Data Layer
    • 포트 설정 데이터 저장 및 관리.
    • 예: SQLite, 파일 저장 등.
  • Service/Application Layer
    • 포트 로직 처리 (포트 상태 체크, 연결 시도, 타임아웃 등).
    • Port 관리 기능을 ViewModel로 전달.
  • Presentation Layer (MVVM 구조)
    • Model: 포트 데이터를 정의 (예: PortInfo 클래스).
    • ViewModel: 사용자에게 보여줄 포트 리스트를 가공 및 관리.
    • View: 포트 상태를 테이블로 보여주고, 열기/닫기 버튼 구현.

왜 MVVM만으로는 부족한가?

MVVM은 UI 관련 책임을 잘 분리할 수 있지만, 시스템 전반의 로직까지 포괄하지 않습니다. 예를 들어:

데이터 캡처와 분석

  • EtherCAT 데이터를 캡처하는 로직은 MVVM의 Model과는 별개의 책임으로, Infrastructure Layer나 Service Layer로 설계됩니다.

비즈니스 로직의 복잡성 증가

  • 캡처된 데이터를 분석하거나 저장하는 로직은 ViewModel에 넣기에 적합하지 않습니다.
  • ViewModel이 과도한 책임을 지지 않도록 별도의 Service/Application Layer에서 처리해야 합니다.

UI와 무관한 모듈

  • 네트워크 통신, 파일 저장 등 UI와 관련 없는 기능은 MVVM 밖에서 관리해야 유지보수성과 확장성이 좋아집니다.