MVC pattern vs MVVC pattern vs MVP pattern

MVC Pattern vs. MVVC Pattern vs. MVP Pattern MVC, MVP, MVVM 아키텍처 패턴은 모두 관심사 분리(SoC) 원칙에 기반하며, 각기 다른 방식으로 UI 로직과 비즈니스 로직을 분리한다. MVC (Model-View-Controller) ▫ 구조 구성 요소 역할 Model 데이터 저장/비즈니스 로직 처리 View UI 표시 (사용자 입력 수신) Controller 입력 처리 → Model 업데이트 → View 갱신 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 # Model: 데이터와 비즈니스 로직 class UserModel: def get_user_data(self): return {"name": "홍길동", "age": 30} # View: 사용자 인터페이스 class UserView: def show_user(self, user_data): print(f"사용자 정보: {user_data}") # Controller: Model과 View 사이의 중재자 class UserController: def __init__(self, model, view): self.model = model self.view = view def display_user(self): user = self.model.get_user_data() self.view.show_user(user) ▫ 데이터 흐름 1 2 사용자 → View → Controller → Model Model → Controller → View 특징: View가 Model 직접 참조 가능 장점: 구조 단순, 학습 곡선 낮음 단점: View-Model 강결합 → 대규모 프로젝트 시 복잡성 증가 ▫ 사용 사례 웹 프레임워크(Spring MVC, Ruby on Rails) 간단한 데스크톱 애플리케이션 MVP (Model-View-Presenter) ▫ 구조 구성 요소 역할 Model 데이터 및 비즈니스 로직 View UI 표시 (수동적, Presenter에 이벤트 전달) Presenter View-Model 중재, UI 로직 처리 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 # Model: 데이터와 비즈니스 로직 class UserModel: def get_user_data(self): return {"name": "홍길동", "age": 30} # View: 사용자 인터페이스와 이벤트 처리 class UserView: def __init__(self, presenter): self.presenter = presenter def show_user(self, user_data): print(f"사용자 정보: {user_data}") # Presenter: View와 Model 사이의 중재자 class UserPresenter: def __init__(self, view, model): self.view = view self.model = model def load_user(self): user = self.model.get_user_data() self.view.show_user(user) ▫ 데이터 흐름 1 2 사용자 → View → Presenter ↔ Model Model → Presenter → View 특징: View-Model 완전 분리 장점: 테스트 용이성 ↑ (Presenter 단독 테스트 가능) 단점: View-Presenter 1:1 관계 → 코드량 증가 ▫ 사용 사례 Windows Forms, Android 앱 복잡한 UI 로직이 필요한 프로젝트 MVVM (Model-View-ViewModel) ▫ 구조 구성 요소 역할 Model 데이터 소스 관리 View UI 및 데이터 바인딩 ViewModel View 상태 추상화, 데이터 변환 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 # Model: 데이터와 비즈니스 로직 class UserModel: def get_user_data(self): return {"name": "홍길동", "age": 30} # ViewModel: View를 위한 Model의 데이터 변환과 상태 관리 class UserViewModel: def __init__(self, model): self.model = model self.user_data = None def fetch_user(self): self.user_data = self.model.get_user_data() # 데이터 바인딩을 통해 View가 자동으로 업데이트됨 # View: 사용자 인터페이스 class UserView: def __init__(self, view_model): self.view_model = view_model # 데이터 바인딩 설정 ▫ 데이터 흐름 1 2 사용자 → View → ViewModel ↔ Model Model → ViewModel → View (자동 갱신) 특징: 데이터 바인딩으로 자동 동기화 장점: 재사용성 ↑, 양방향 데이터 흐름 단점: 초기 설정 복잡, 과도한 추상화 가능성 ▫ 사용 사례 WPF, Angular, React, Vue.js 실시간 데이터 업데이트 필요 애플리케이션 패턴 비교 특성 MVC MVVM MVP 데이터 흐름 Controller → Model ↔ View ViewModel ↔ Model, View ↔ ViewModel Presenter → Model, View ↔ Presenter View와 Model의 관계 직접 참조 가능 완전 분리 완전 분리 중간 계층의 역할 Controller가 입력 처리 ViewModel이 상태와 데이터 변환 관리 Presenter가 View 상태와 이벤트 처리 테스트 용이성 보통 좋음 매우 좋음 코드 복잡도 낮음 높음 중간 주요 사용처 웹 애플리케이션 데스크톱/모바일 앱 복잡한 UI 애플리케이션 데이터 바인딩 수동 자동 수동 UI 의존성 높음 낮음 매우 낮음 패턴 선택 가이드 MVC: 빠른 프로토타이핑, 간단한 웹 앱 MVP: Android 앱, UI 테스트 강조 환경 MVVM: 복잡한 데이터 플로우, 재사용성 요구 시 참고 및 출처

September 27, 2024 · 3 min · Me

Decompose by Business Capability vs Decompose by Subdomain

Decompose by Business Capability vs. Decompose by Subdomain Decompose by Business Capability 정의: 비즈니스의 기능적 역량을 중심으로 시스템을 분해하는 방식으로, 조직의 주요 기능(예: 판매, 마케팅, 고객 서비스 등)에 따라 모듈을 나누는 방법. 특징: 비즈니스의 주요 역량을 중심으로 서비스나 모듈을 설계. 시스템의 경계가 기능적인 책임(Functional Responsibility)에 맞춰 설정됨. 기술적으로 독립적이고 명확한 책임 분리가 가능. 조직 구조와 자연스럽게 연계되므로 비즈니스와 IT의 연계성이 높아짐. 비즈니스의 장기적 확장성과 변화를 쉽게 수용할 수 있음. 예시: 주문 관리 시스템(Order Management System), 재고 관리 시스템(Inventory Management System) 등으로 분할. Decompose by Subdomain ...

November 13, 2024 · 2 min · Me

Event-Driven Pattern

Event-Driven Pattern 이 패턴은 시스템의 상태 변화를 이벤트로 표현하고, 이를 기반으로 서비스 간 통신을 구현하는 방식이다. Event-Driven Pattern은 시스템에서 발생하는 중요한 변화나 행동을 이벤트로 정의하고, 이를 중심으로 시스템을 설계하는 아키텍처 패턴이다. 이 패턴에서는 이벤트의 생성, 전파, 처리가 시스템의 핵심 동작이 된다. 주요 특징: 비동기 통신을 기반으로 함 서비스 간 느슨한 결합 제공 실시간 데이터 처리와 반응성 향상 확장성과 유연성 증대 주요 구성 요소 Event-Driven Pattern의 주요 구성 요소는 다음과 같다: ...

December 28, 2024 · 6 min · Me

Self-contained Service

Self-contained Service 마이크로서비스 아키텍처(MSA)에서 “self-contained service” 패턴은 서비스의 자율성과 독립성을 극대화하는 중요한 개념이다. Self-contained Service는 단일 비즈니스 기능을 완전히 독립적으로 구현한 서비스를 의미한다. 이 서비스는 자체적으로 데이터를 저장하고, 비즈니스 로직을 처리하며, 사용자 인터페이스를 제공할 수 있다. Self-contained Service 패턴은 MSA의 핵심 원칙을 구현하는 방법 중 하나로, 서비스의 자율성과 독립성을 극대화하여 시스템의 유연성과 확장성을 높이는 데 기여한다. 하지만 이 패턴을 적용할 때는 시스템의 복잡성 증가와 데이터 일관성 관리 등의 도전 과제를 고려해야 한다. ...

November 13, 2024 · 2 min · Me

Service per team

Service per Team Service per team 패턴은 각 마이크로서비스를 개별 팀이 소유하고 관리하는 방식이다. 이 패턴에서는 각 팀이 특정 비즈니스 기능을 담당하며, 해당 기능의 코드베이스를 소유한다. Service per team 패턴은 팀의 자율성과 책임감을 높이는 동시에 마이크로서비스 아키텍처의 이점을 최대화할 수 있는 효과적인 접근 방식이다. 그러나 이 패턴을 성공적으로 구현하기 위해서는 조직 문화, 팀 구조, 그리고 기술적 인프라 등 여러 측면에서의 신중한 고려가 필요하다. 주요 특징 팀 자율성: 각 팀은 자신의 서비스를 독립적으로 개발, 테스트, 배포, 확장할 수 있다. API 중심 협업: 팀들은 주로 API를 통해 상호작용하며, 다른 팀과의 협업을 최소화한다. 소규모 팀: 일반적으로 “two-pizza team” 크기의 소규모 팀이 각 서비스를 담당한다. 인지 부하 감소: 팀원들이 전체 시스템이 아닌 특정 서비스에만 집중할 수 있어 인지 부하가 감소한다. 장점 팀 자율성 강화: 각 팀이 독립적으로 의사 결정을 내릴 수 있다. 느슨한 결합: 팀 간의 의존성이 줄어들어 더 유연한 개발이 가능하다. 코드 품질 향상: 장기적인 코드 소유권으로 인해 코드 품질이 개선된다. 빠른 개발 및 배포: 작은 팀이 독립적으로 개발하고 배포할 수 있어 시장 변화에 빠르게 대응할 수 있다. 단점 복잡한 프로젝트 조정: 여러 서비스에 걸친 복잡한 프로젝트의 경우 팀 간 조정이 어려워질 수 있다. 높은 WIP (Work in Progress): 각 팀이 항상 바쁘게 유지되어야 하므로 진행 중인 작업이 많아질 수 있다. 좁은 가치 흐름: 이상적인 구현에서는 팀들이 완전히 분리되어 있어, 조직 전체의 가치 흐름이 좁아질 수 있다. 최적화되지 않은 우선순위 지정: 팀의 가용성이 프로젝트 우선순위 결정의 주요 요인이 될 수 있다. 구현 시 고려사항 팀 구성: 각 서비스를 담당할 수 있는 cross-functional 팀을 구성해야 한다. 서비스 경계 정의: 비즈니스 기능과 하위 도메인을 기반으로 서비스 경계를 명확히 정의해야 한다. 팀 간 커뮤니케이션: API 설계와 변경에 대한 팀 간 효과적인 커뮤니케이션 채널을 구축해야 한다. 확장성 고려: 새로운 팀을 추가하거나 기존 서비스를 분할할 때의 전략을 미리 수립해야 한다. 예시: 대규모 전자상거래 플랫폼을 운영하는 기업을 예로 들어보자. 이 기업은 다음과 같은 주요 비즈니스 기능을 가지고 있다: ...

November 13, 2024 · 2 min · Me

Decompose by Business Capability

Decompose by Business Capability “Decompose by Business Capability” 패턴은 마이크로서비스 아키텍처(MSA)에서 중요한 분해 패턴이다. 이 패턴은 비즈니스 능력을 기반으로 애플리케이션을 마이크로서비스로 분해하는 방법을 제시한다. 이 패턴은 조직의 비즈니스 능력을 기반으로 마이크로서비스를 정의한다. 비즈니스 능력은 조직이 가치를 창출하기 위해 수행하는 특정 기능이나 프로세스를 의미한다. 주요 목적은 다음과 같다: 비즈니스 목표와 소프트웨어 개발의 정렬 독립적으로 개발 및 유지보수 가능한 서비스 생성 조직 구조와 시스템 아키텍처의 일치 이 패턴을 효과적으로 적용하려면 조직의 비즈니스 도메인에 대한 깊은 이해가 필요하며, 지속적인 비즈니스 분석과 서비스 경계의 조정이 필요하다. ...

November 13, 2024 · 3 min · Me

Decompose by Subdomain

Decompose by Subdomain “Decompose by Subdomain” 패턴은 마이크로서비스 아키텍처(MSA)에서 중요한 분해 패턴 중 하나이다. 이 패턴은 도메인 주도 설계(DDD)의 개념을 기반으로 하며, 비즈니스 도메인을 여러 하위 도메인으로 나누어 마이크로서비스를 설계하는 방법이다. 이 패턴을 효과적으로 적용하려면 비즈니스 도메인에 대한 깊은 이해와 지속적인 분석이 필요하다. 또한, 하위 도메인 간의 상호작용을 고려하여 서비스 간 통신을 설계해야 한다. 주요 특징 비즈니스 중심 접근: 기술적 세부사항보다 비즈니스 기능에 초점을 맞춘다. 하위 도메인 분류: 핵심(Core): 비즈니스의 핵심 차별화 요소 지원(Supporting): 비즈니스 관련이지만 차별화 요소는 아님 일반(Generic): 비즈니스 특화되지 않은 일반적 기능 경계 설정: 각 하위 도메인은 명확한 경계(Bounded Context)를 가진다. ...

November 13, 2024 · 2 min · Me

Client-Server Pattern

Client-Server Pattern 분산 시스템에서 널리 사용되는 소프트웨어 아키텍처 패턴. 이 패턴은 시스템을 두 가지 주요 구성 요소로 나눈다: 서비스를 제공하는 서버 서비스를 요청하는 클라이언트. 이들은 네트워크를 통해 서로 통신하며, 각자 명확한 역할과 책임을 가지고 있다. 클라이언트-서버 패턴 (Client-Server Pattern) 클라이언트-서버 패턴은 분산 시스템에서 널리 사용되는 소프트웨어 아키텍처 패턴이다. 이 패턴은 시스템을 두 가지 주요 구성 요소로 나뉜다: 서비스를 제공하는 서버와 서비스를 요청하는 클라이언트이다. 주요 구성 요소 https://apptraitsolutions.com/different-software-architectural-patterns-and-how-to-choose-the-right-one-for-your-app/ 클라이언트 (Client): ...

September 26, 2024 · 2 min · Me