아키텍처 패턴
개요
주문 화면에서 수량 입력 칸의 변경 처리기가 입력 문자열을 숫자로 바꾸고, 재고보다 많으면 오류 라벨을 채우고, 아니면 합계를 계산해 합계 라벨에 쓰고 주문 버튼을 켠다고 하자. 주문 버튼의 클릭 처리기는 같은 재고 검사를 한 번 더 하고 DB에 주문을 저장한다. "재고보다 많이 주문할 수 없다"는 규칙 하나를 확인하려 해도 창을 띄우고 DB를 연결한 뒤 칸에 숫자를 넣어 봐야 한다. 입력 해석, 화면 갱신, 업무 규칙, 저장이 처리기 두 개에 섞여 있어서 어느 하나만 따로 실행하거나 바꿀 수 없다.
이 문서에서 아키텍처 패턴은 이런 코드를 화면 단위나 애플리케이션 단위로 나누는 방식에 붙은 이름이다. 각 패턴은 어떤 역할을 둘지, 사용자 입력과 화면 갱신이 어느 역할을 거쳐 흐를지, 소스 코드의 의존이 어느 방향을 향할지를 정한다. 프로그래밍 패턴 문서가 소개하는 GoF 디자인 패턴은 객체를 만들고 조립하고 협력시키는 방식을 다루므로 범위가 더 작다. 두 수준은 함께 쓰인다. 예를 들어 MVC에서 모델이 뷰에 변경을 알리는 부분은 옵서버 패턴이다.
아키텍처 패턴이 답하는 질문은 두 갈래다. 화면 하나 안에서 입력, 표시, 화면 규칙을 어떻게 나눌지는 UI 아키텍처 패턴이 다룬다. MVC, MVP, MVVM, MVU가 여기에 속하고 각각 별도 문서가 있다. 업무 규칙과 DB, 웹 프레임워크, 외부 서비스 같은 바깥 기술 사이의 경계와 의존 방향은 애플리케이션 구조 패턴이 다룬다. 계층형, 헥사고날, 오니언, 클린 아키텍처는 이 문서에서 짧게만 소개한다. 위 주문 화면이라면 재고 규칙을 처리기에서 떼어 내는 일은 앞의 질문이고, 그 규칙이 DB 코드를 직접 부르지 않게 하는 일은 뒤의 질문이다.
두 갈래는 한 프로그램 안에서 겹친다. Robert C. Martin은 클린 아키텍처 글에서 GUI의 MVC 구조 전체가 동심원의 안쪽에서 세 번째인 인터페이스 어댑터(interface adapters) 계층에 들어간다고 적었다.1
UI 아키텍처 패턴 비교
네 패턴은 모두 화면 코드와 그 밖의 로직을 나누어 일부를 창 없이 시험할 수 있게 하는데, 시험할 수 있는 부분은 패턴마다 다르다. 패턴끼리는 사용자 입력을 누가 먼저 받는지, 바뀐 값이 어떤 경로로 화면에 도착하는지도 다르다.
패턴 | 사용자 입력을 받는 쪽 | 뷰가 갱신되는 방식 | UI 없이 시험할 수 있는 것 | 쓰이는 곳 |
|---|---|---|---|---|
컨트롤러. 입력을 모델 호출로 바꾼다. | 모델이 변경을 알리면 등록된 뷰가 모델을 다시 읽어 그린다. 웹 MVC에서는 알림 없이 컨트롤러가 요청마다 뷰를 고르고 데이터를 넘긴다. | 모델(데이터와 규칙) | Smalltalk-80, 서버 쪽 웹 프레임워크(JSP Model 2, Ruby on Rails, ASP.NET MVC) | |
뷰. 받은 입력을 프레젠터에 넘기고, 어떻게 반응할지는 프레젠터가 정한다. | Passive View에서는 프레젠터가 보여 줄 값을 뷰 인터페이스로 넣는다. 원래 MVP와 Supervising Controller에서는 뷰가 모델을 관찰하거나 데이터 바인딩으로 맞춘다. | 프레젠터(가짜 뷰를 넣어서), 모델 | Taligent(C++, Java), Dolphin Smalltalk, Windows Forms와 ASP.NET Web Forms | |
뷰. 버튼 같은 명령 소스가 바인딩된 명령( | ViewModel이 | ViewModel과 Model | WPF, Silverlight, .NET MAUI, JavaScript의 Knockout | |
뷰 함수가 만든 화면 요소. 입력을 메시지로 바꿔 런타임에 보낸다. | 런타임이 업데이트에서 새 모델을 받고, 그 모델로 뷰 함수를 다시 불러 화면을 새로 만든다. | 업데이트와 뷰(순수 함수) | Elm, Redux(리듀서가 업데이트 역할), F#의 Fabulous |
- 패턴
- 사용자 입력을 받는 쪽
컨트롤러. 입력을 모델 호출로 바꾼다.
- 뷰가 갱신되는 방식
모델이 변경을 알리면 등록된 뷰가 모델을 다시 읽어 그린다. 웹 MVC에서는 알림 없이 컨트롤러가 요청마다 뷰를 고르고 데이터를 넘긴다.
- UI 없이 시험할 수 있는 것
모델(데이터와 규칙)
- 쓰이는 곳
Smalltalk-80, 서버 쪽 웹 프레임워크(JSP Model 2, Ruby on Rails, ASP.NET MVC)
- 패턴
- 사용자 입력을 받는 쪽
뷰. 받은 입력을 프레젠터에 넘기고, 어떻게 반응할지는 프레젠터가 정한다.
- 뷰가 갱신되는 방식
Passive View에서는 프레젠터가 보여 줄 값을 뷰 인터페이스로 넣는다. 원래 MVP와 Supervising Controller에서는 뷰가 모델을 관찰하거나 데이터 바인딩으로 맞춘다.
- UI 없이 시험할 수 있는 것
프레젠터(가짜 뷰를 넣어서), 모델
- 쓰이는 곳
Taligent(C++, Java), Dolphin Smalltalk, Windows Forms와 ASP.NET Web Forms
- 패턴
- 사용자 입력을 받는 쪽
뷰. 버튼 같은 명령 소스가 바인딩된 명령(
ICommand)의Execute를 부르고, 입력 칸의 값은 데이터 바인딩이 ViewModel로 옮긴다.- 뷰가 갱신되는 방식
ViewModel이
PropertyChanged로 변경을 알리면 바인딩 엔진이 값을 읽어 뷰에 넣는다.- UI 없이 시험할 수 있는 것
ViewModel과 Model
- 쓰이는 곳
WPF, Silverlight, .NET MAUI, JavaScript의 Knockout
- 패턴
- 사용자 입력을 받는 쪽
뷰 함수가 만든 화면 요소. 입력을 메시지로 바꿔 런타임에 보낸다.
- 뷰가 갱신되는 방식
런타임이 업데이트에서 새 모델을 받고, 그 모델로 뷰 함수를 다시 불러 화면을 새로 만든다.
- UI 없이 시험할 수 있는 것
업데이트와 뷰(순수 함수)
- 쓰이는 곳
Elm, Redux(리듀서가 업데이트 역할), F#의 Fabulous
그림은 UML 커뮤니케이션 다이어그램 네 개다. 각 패널은 사용자 입력 하나가 화면 갱신에 이르기까지 일으키는 메시지에 번호를 붙여 순서대로 보여 준다. 번호의 점은 호출 중첩을 나타내서, 1.1.2는 1.1을 처리하는 중에 보낸 두 번째 메시지다. 참여 객체 이름은 각 패턴 문서의 예제에서 가져왔고, Button, TextBlock, BindingExpression(WPF)과 Html(Elm)은 프레임워크 타입이다. MVVM 패널은 예제의 콘솔 Binder 대신 WPF처럼 바인딩 엔진이 있는 경우를 그렸다. 버튼은 명령 소스로서 바인딩된 명령의 Execute를 직접 부르고,2 바인딩(BindingExpression)은 PropertyChanged를 받아 화면 값을 고칠 때만 등장한다. MVU 패널의 Render(html)는 런타임이 새 화면을 반영하는 단계에 붙인 이름이다. 각 패턴의 클래스 다이어그램과 시퀀스 다이어그램은 개별 문서에 있다.
MVC와 MVVM은 둘 다 변경 알림으로 화면을 고치지만 알림을 받는 쪽이 다르다. Smalltalk-80 MVC에서는 뷰가 모델의 의존 객체로 등록되어 모델이 바뀌면 update 메시지를 받는다.3 MVVM에서는 ViewModel이 보내는 PropertyChanged를 바인딩 엔진이 받아 뷰를 고친다.4 MVP의 Passive View는 알림 대신 프레젠터의 명시적 호출로 화면을 고치므로, 뷰와 모델 사이에 어느 방향으로도 의존이 없다.5 MVU에서는 모델의 속성 변경을 구독하는 대신, 메시지를 업데이트에 보내 새 모델을 계산한다. 상태가 바뀌는 경로가 업데이트 하나뿐이고, 화면은 새 모델이 나올 때마다 뷰 함수로 다시 계산된다.6
연혁
네 UI 패턴 문서의 연혁과 애플리케이션 구조 패턴의 주요 글을 합쳐 오래된 순서로 놓았다. 출처 열의 링크가 각 행의 근거다.
연도 | 사건 | 출처 |
|---|---|---|
1978 | Reenskaug가 Xerox PARC LRG의 방문 연구원으로 지내며(1978년 여름부터 1979년 여름까지) MVC를 구상했다. | |
1979 | 5월 12일자 노트 "Thing-Model-View-Editor". Thing, Model, View, Editor 네 용어를 예제로 설명한다. | |
1979 | 12월 10일자 노트 "Models-Views-Controllers". 모델, 뷰, 컨트롤러라는 이름이 정해졌다. 뷰의 정보를 수정하게 해 주는 에디터는 보조 요소로 남았다. | |
1988 | Krasner와 Pope가 JOOP 8/9월호에 Smalltalk-80 MVC 설명서를 발표했다. | |
1995 | Dolphin Smalltalk 팀이 위젯 기반 UI 프레임워크를 만든 뒤 그해 말 MVC로 교체하기 시작했다(약 두 달 소요). | |
1996 | Mike Potel이 "MVP: Model-View-Presenter, The Taligent Programming Model for C++ and Java"에서 Taligent의 MVP를 소개했다. | |
1999 | Seshadri가 JSP Model 2 구조를 MVC의 서버 쪽 구현으로 설명했다. | |
2000 | Andy Bower와 Blair McGlashan이 ESUG 2000 튜토리얼 논문 "Twisting the Triad"에서 Dolphin Smalltalk가 MVP를 택한 과정을 적었다. | |
2002 | Michael Feathers가 "The Humble Dialog Box"에서 로직 객체가 뷰 인터페이스를 거쳐 대화 상자에 값을 밀어 넣는 방식을 설명했다. | |
2002 | Fowler의 Patterns of Enterprise Application Architecture가 나왔다. 엔터프라이즈 애플리케이션을 계층으로 나누는 법이 주요 주제 가운데 하나다. | |
2004 | Martin Fowler가 Model View Presenter 패턴 초안과 Presentation Model 글을 공개했다(7월 19일). | |
2005 | Alistair Cockburn이 Ports and Adapters(다른 이름 헥사고날 아키텍처) 패턴을 정리했다. 글의 날짜는 9월 4일, 0.9판이다. | |
2005 | John Gossman이 블로그에 Model/View/ViewModel 소개 글을 올렸다(10월 8일). | |
2005 | Ruby on Rails 1.0이 공개되었다. Rails 가이드는 Action Controller를 MVC 패턴의 C로 설명한다. | |
2006 | Gossman이 M-V-VM의 장점과 단점을 정리한 글을 올렸다. | |
2006 | Fowler가 MVP 항목을 Supervising Controller와 Passive View로 나누고 은퇴시켰다(7월 11일). 이어 "GUI Architectures"에서 MVC와 그 변형을 정리했다(7월 18일). | |
2008 | Jeffrey Palermo가 연재 "The Onion Architecture"의 첫 글을 올렸다(7월 29일). | |
2009 | Josh Smith의 WPF MVVM 글이 MSDN Magazine 2월호에 실렸다. | |
2009 | Microsoft가 자사 행사 MIX에서 ASP.NET MVC 1.0을 공개했다. | |
2010 | Dino Esposito가 MSDN Magazine에서 Web Forms와 Windows Forms용 MVP 구현을 소개했다. | |
2012 | Evan Czaplicki의 논문 "Elm: Concurrent FRP for Functional GUIs"(3월 30일). | |
2012 | Robert C. Martin이 블로그 글 "The Clean Architecture"를 올렸다(8월 13일). | |
2015 | elm-architecture-tutorial README가 Elm 프로그램을 model, update, view로 나누는 골격을 제시했다(1월). | |
2015 | Redux 1.0.0이 공개되었다(8월 14일). | |
2016 | Elm 0.17이 구독을 도입하고 시그널 개념을 대체했다("A Farewell to FRP", 5월 10일). | |
2016 | Elm 0.18 발표 글이 디버그 모드에서 이벤트 순서를 내보내고 다시 가져오는 기능을 소개했다(11월 14일). | |
2017 | Martin의 책 Clean Architecture가 Prentice Hall에서 나왔다. | |
2020 | .NET MAUI 발표 글이 C# MVU를 앞으로의 기능으로 언급했다(5월 19일). |
- 연도
1978
- 사건
Reenskaug가 Xerox PARC LRG의 방문 연구원으로 지내며(1978년 여름부터 1979년 여름까지) MVC를 구상했다.
- 연도
1979
- 사건
5월 12일자 노트 "Thing-Model-View-Editor". Thing, Model, View, Editor 네 용어를 예제로 설명한다.
- 출처
- 연도
1979
- 사건
12월 10일자 노트 "Models-Views-Controllers". 모델, 뷰, 컨트롤러라는 이름이 정해졌다. 뷰의 정보를 수정하게 해 주는 에디터는 보조 요소로 남았다.
- 출처
- 연도
1988
- 사건
Krasner와 Pope가 JOOP 8/9월호에 Smalltalk-80 MVC 설명서를 발표했다.
- 출처
- 연도
1995
- 사건
Dolphin Smalltalk 팀이 위젯 기반 UI 프레임워크를 만든 뒤 그해 말 MVC로 교체하기 시작했다(약 두 달 소요).
- 연도
1996
- 사건
Mike Potel이 "MVP: Model-View-Presenter, The Taligent Programming Model for C++ and Java"에서 Taligent의 MVP를 소개했다.
- 연도
1999
- 사건
Seshadri가 JSP Model 2 구조를 MVC의 서버 쪽 구현으로 설명했다.
- 연도
2000
- 사건
Andy Bower와 Blair McGlashan이 ESUG 2000 튜토리얼 논문 "Twisting the Triad"에서 Dolphin Smalltalk가 MVP를 택한 과정을 적었다.
- 연도
2002
- 사건
Michael Feathers가 "The Humble Dialog Box"에서 로직 객체가 뷰 인터페이스를 거쳐 대화 상자에 값을 밀어 넣는 방식을 설명했다.
- 연도
2002
- 사건
Fowler의 Patterns of Enterprise Application Architecture가 나왔다. 엔터프라이즈 애플리케이션을 계층으로 나누는 법이 주요 주제 가운데 하나다.
- 연도
2004
- 사건
Martin Fowler가 Model View Presenter 패턴 초안과 Presentation Model 글을 공개했다(7월 19일).
- 연도
2005
- 사건
Alistair Cockburn이 Ports and Adapters(다른 이름 헥사고날 아키텍처) 패턴을 정리했다. 글의 날짜는 9월 4일, 0.9판이다.
- 연도
2005
- 사건
John Gossman이 블로그에 Model/View/ViewModel 소개 글을 올렸다(10월 8일).
- 연도
2005
- 사건
Ruby on Rails 1.0이 공개되었다. Rails 가이드는 Action Controller를 MVC 패턴의 C로 설명한다.
- 연도
2006
- 사건
Gossman이 M-V-VM의 장점과 단점을 정리한 글을 올렸다.
- 연도
2006
- 사건
Fowler가 MVP 항목을 Supervising Controller와 Passive View로 나누고 은퇴시켰다(7월 11일). 이어 "GUI Architectures"에서 MVC와 그 변형을 정리했다(7월 18일).
- 연도
2008
- 사건
Jeffrey Palermo가 연재 "The Onion Architecture"의 첫 글을 올렸다(7월 29일).
- 연도
2009
- 사건
Josh Smith의 WPF MVVM 글이 MSDN Magazine 2월호에 실렸다.
RelayCommand와ViewModelBase를 소개했다.
- 연도
2009
- 사건
Microsoft가 자사 행사 MIX에서 ASP.NET MVC 1.0을 공개했다.
- 연도
2010
- 사건
Dino Esposito가 MSDN Magazine에서 Web Forms와 Windows Forms용 MVP 구현을 소개했다.
- 연도
2012
- 사건
Evan Czaplicki의 논문 "Elm: Concurrent FRP for Functional GUIs"(3월 30일).
foldp를 "fold from the past"로 설명했다.- 출처
- 연도
2012
- 사건
Robert C. Martin이 블로그 글 "The Clean Architecture"를 올렸다(8월 13일).
- 연도
2015
- 사건
elm-architecture-tutorial README가 Elm 프로그램을 model, update, view로 나누는 골격을 제시했다(1월).
- 연도
2015
- 사건
Redux 1.0.0이 공개되었다(8월 14일).
- 연도
2016
- 사건
Elm 0.17이 구독을 도입하고 시그널 개념을 대체했다("A Farewell to FRP", 5월 10일).
- 연도
2016
- 사건
Elm 0.18 발표 글이 디버그 모드에서 이벤트 순서를 내보내고 다시 가져오는 기능을 소개했다(11월 14일).
- 연도
2017
- 사건
Martin의 책 Clean Architecture가 Prentice Hall에서 나왔다.
- 연도
2020
- 사건
.NET MAUI 발표 글이 C# MVU를 앞으로의 기능으로 언급했다(5월 19일).
MVP와 MVVM은 앞선 패턴을 고치거나 특수화하며 나왔다. Potel은 MVP를 Smalltalk MVC를 일반화한 프로그래밍 모델로 소개했고, 프레젠터를 고전 Smalltalk 컨트롤러의 기능을 애플리케이션 수준으로 끌어올린 것으로 설명했다.7 Dolphin Smalltalk 팀이 보기에 MVC는 애플리케이션 모델과 뷰를 간접적으로만 연결했고, Windows 기본 컨트롤은 이미 컨트롤러 기능 대부분을 갖고 있었다. 그래서 팀은 동료가 알려 준 Taligent의 MVP를 채택했다.8 Fowler는 Presentation Model이 VisualWorks Smalltalk 사용자에게 Application Model로 알려져 있다고 적었고, 나중에 덧붙인 주에서 이 패턴이 점점 MVVM이라는 이름으로 알려지고 있다고 했다.9 Gossman은 MVVM을 디자이너가 XAML 같은 선언형 언어로 뷰를 만드는 환경에 맞춘 MVC의 변형으로 설명했고,10 Smith는 MVVM을 WPF와 Silverlight에 맞춘 Presentation Model의 특수화로 보았다.11 MVU 쪽에서는 Redux 문서가 Elm의 updater가 Redux의 리듀서와 같은 역할을 한다고 설명하고,12 Elm 가이드는 Redux 같은 프로젝트가 The Elm Architecture에서 영감을 받았다고 적는다.6
애플리케이션 구조 패턴도 서로를 언급한다. Palermo는 헥사고날 아키텍처와 오니언 아키텍처가 인프라를 바깥으로 빼고 어댑터 코드를 써서 인프라와 강하게 결합하지 않게 한다는 전제를 공유한다고 썼다.13 Martin의 2012년 글은 헥사고날, 오니언을 비롯한 여러 아키텍처를 나열하고, 세부는 달라도 모두 관심사 분리라는 같은 목적을 가지며 소프트웨어를 계층으로 나눠 이를 이룬다고 정리했다.1
애플리케이션 구조 패턴
아래 네 패턴은 화면 하나보다 큰 애플리케이션 전체를 나누며, 모두 업무 규칙(도메인)이 DB, 웹 프레임워크, UI 같은 바깥 기술에 의존하는지를 묻는다.
계층형 아키텍처
계층형 아키텍처(layered architecture)는 프로그램을 표현(UI), 도메인 로직, 데이터 접근 같은 계층으로 나눈다. Fowler의 설명으로는 의존이 대체로 위에서 아래로 흘러, 표현 계층은 도메인에, 도메인은 데이터 원본에 의존한다. 그가 꼽은 이 분리의 가장 큰 이점은 세 주제를 비교적 따로 생각할 수 있어 주의의 범위가 줄어드는 데 있다. 그는 도메인이 데이터 원본에 의존하지 않도록 둘 사이에 매퍼를 두는 변형을 흔히 헥사고날 아키텍처라고 부른다고 덧붙였다.14 그의 2002년 책 Patterns of Enterprise Application Architecture도 엔터프라이즈 애플리케이션을 계층으로 나누는 법을 주요 주제로 다룬다.15
헥사고날 아키텍처 (포트와 어댑터)
Alistair Cockburn의 Ports and Adapters 패턴(다른 이름 Hexagonal Architecture)은 애플리케이션을 사용자, 다른 프로그램, 자동 테스트, 배치 스크립트 어느 쪽에서든 똑같이 구동할 수 있게 하고, 실제 장치와 DB 없이도 개발하고 시험할 수 있게 하는 것을 목적으로 한다. 애플리케이션은 포트(port, 대화의 목적에 따라 정한 API)로 바깥과 통신하고, 바깥 장치마다 있는 어댑터가 그 API와 장치의 신호를 서로 바꾼다. 애플리케이션은 입력 장치의 성격을 모르며, Cockburn은 안쪽에 속한 코드가 바깥쪽으로 새어 나가지 않아야 한다는 규칙을 둔다. 그는 이 패턴을 어댑터 패턴의 특정한 쓰임이라고 설명했다.16
오니언 아키텍처
Jeffrey Palermo는 2008년 연재 글에서 오니언 아키텍처(Onion Architecture)를 제안했다. 가운데에 도메인 모델이 있고, 그 바로 바깥 층에 객체를 저장하고 꺼내는 리포지토리 인터페이스가 있으며(리포지토리 패턴), 가장 바깥에 UI, 인프라, 테스트가 있다. 코드는 더 안쪽 층에만 의존할 수 있고 바깥 층에는 의존할 수 없다. 즉 모든 결합이 중심을 향한다.13 Palermo는 각 층이 아래층과 인프라에 결합하는 전통적인 계층형과의 차이를 이 방향으로 설명했고, 안쪽 층이 인터페이스를 정의하고 바깥 층이 구현한다는 점을 주요 원칙으로 꼽았다.1317
클린 아키텍처
Robert C. Martin의 2012년 글 "The Clean Architecture"는 헥사고날, 오니언 등 여러 아키텍처를 하나의 실행 가능한 생각으로 합치려 한 그림을 제시했다. 동심원은 안쪽부터 엔티티(entities), 유스케이스(use cases), 인터페이스 어댑터, 프레임워크와 드라이버이고, 의존 규칙(Dependency Rule)은 소스 코드 의존이 안쪽으로만 향할 수 있다는 것이다. 유스케이스가 바깥의 프레젠터에 결과를 넘겨야 할 때는 안쪽 원에 둔 인터페이스(출력 포트)를 부르고 프레젠터가 그것을 구현하게 해, 제어 흐름과 반대 방향으로 의존을 둔다.1 같은 제목의 책은 2017년 Prentice Hall에서 나왔다.18
고르는 기준
UI 패턴은 쓰는 UI 기술이 먼저 정해 주는 경우가 많다. WPF처럼 데이터 바인딩을 중심으로 만든 프레임워크에서는 MVVM이 도구 지원을 받기 쉽고,19 Elm의 표준 브라우저 프로그램 API는 모델·뷰·업데이트를 연결하는 구조를 제공한다.12 아래 표는 문제가 보일 때 먼저 읽을 문서를 고르는 안내다.
문제가 보일 때 | 먼저 볼 패턴 |
|---|---|
한 모델의 상태를 여러 화면이 함께 보여 줘야 한다 | |
서버에서 요청마다 응답 화면을 만든다 | MVC 패턴(웹 프레임워크의 MVC) |
바인딩 엔진이 없는 UI에서 폼의 화면 규칙을 폼 없이 시험하고 싶다 | MVP 패턴(Passive View) |
WPF, .NET MAUI처럼 바인딩을 갖춘 UI에서 화면 상태와 버튼 활성 조건을 시험하고 싶다 | |
상태를 바꾸는 처리기가 여러 개라 상태와 화면이 어긋난다 | |
잘못된 화면을 받은 메시지 순서대로 다시 만들어 보고 싶다 | |
업무 규칙이 HTTP 처리 코드나 SQL 사이에 흩어져 있다 | 계층형 아키텍처 |
같은 업무 기능을 UI, 자동 테스트, 배치 스크립트가 함께 호출해야 한다 | 헥사고날 아키텍처 |
도메인 코드가 DB 접근 코드를 직접 참조해 DB 없이 시험할 수 없다 | 오니언 아키텍처, 클린 아키텍처, 리포지토리 패턴 |
외부 SDK의 호출 방식이 업무 코드에 퍼진다 | 어댑터 패턴, 헥사고날 아키텍처 |
- 문제가 보일 때
한 모델의 상태를 여러 화면이 함께 보여 줘야 한다
- 먼저 볼 패턴
- 문제가 보일 때
서버에서 요청마다 응답 화면을 만든다
- 먼저 볼 패턴
MVC 패턴(웹 프레임워크의 MVC)
- 문제가 보일 때
바인딩 엔진이 없는 UI에서 폼의 화면 규칙을 폼 없이 시험하고 싶다
- 먼저 볼 패턴
MVP 패턴(Passive View)
- 문제가 보일 때
WPF, .NET MAUI처럼 바인딩을 갖춘 UI에서 화면 상태와 버튼 활성 조건을 시험하고 싶다
- 먼저 볼 패턴
- 문제가 보일 때
상태를 바꾸는 처리기가 여러 개라 상태와 화면이 어긋난다
- 먼저 볼 패턴
- 문제가 보일 때
잘못된 화면을 받은 메시지 순서대로 다시 만들어 보고 싶다
- 먼저 볼 패턴
- 문제가 보일 때
업무 규칙이 HTTP 처리 코드나 SQL 사이에 흩어져 있다
- 먼저 볼 패턴
계층형 아키텍처
- 문제가 보일 때
같은 업무 기능을 UI, 자동 테스트, 배치 스크립트가 함께 호출해야 한다
- 먼저 볼 패턴
헥사고날 아키텍처
- 문제가 보일 때
도메인 코드가 DB 접근 코드를 직접 참조해 DB 없이 시험할 수 없다
- 먼저 볼 패턴
오니언 아키텍처, 클린 아키텍처, 리포지토리 패턴
- 문제가 보일 때
외부 SDK의 호출 방식이 업무 코드에 퍼진다
- 먼저 볼 패턴
어댑터 패턴, 헥사고날 아키텍처
남용 신호
입력 칸 두 개짜리 폼에 MVVM을 얹고 ViewModel, 명령 클래스, 바인딩 설정을 모두 만든다. Gossman도 단순한 UI에는 MVVM이 과할 수 있다고 적었다.20
규칙이 거의 없는 화면마다 뷰 인터페이스, 뷰 구현, 프레젠터를 만든다. Esposito는 MVP가 애플리케이션 코드의 복잡도를 높인다고 적었다.21
입력 하나, 출력 하나인 화면을 모델, 뷰, 컨트롤러 세 클래스로 나눈다.
상태가 거의 없는 화면에 메시지 목록과 런타임 루프를 만든다.
CRUD 화면 몇 개짜리 프로그램에 엔티티, 유스케이스, 인터페이스 어댑터, 프레임워크 네 겹을 그대로 쌓는다. Palermo는 오니언 아키텍처가 작은 웹사이트에는 맞지 않는다고 했고,13 Martin도 원이 꼭 네 개일 필요는 없다고 적었다.1
DB를 바꿀 계획이 없는데 교체를 이유로 저장소 앞에 포트와 어댑터를 여러 겹 둔다. Fowler는 데이터 접근 교체가 데이터 계층을 나누는 이유로 자주 거론되지만 실제로 교체했다는 이야기는 드물게 듣는다고 적었다.14
같이 보기
각주
- Robert C. Martin. The Clean Architecture. The Clean Code Blog (2012년 8월 13일). ↩
- Microsoft Learn. Commanding Overview (WPF). Command Sources. ↩
- Glenn E. Krasner, Stephen T. Pope. "A Cookbook for Using the Model-View-Controller User Interface Paradigm in Smalltalk-80". Journal of Object-Oriented Programming, 1988년 8/9월호, pp. 26-49. PDF. ↩
- Microsoft Learn. INotifyPropertyChanged Interface. Remarks. ↩
- Martin Fowler. "Passive View". martinfowler.com (2006년 7월 18일). 원문. ↩
- Elm Guide. The Elm Architecture. ↩
- Mike Potel. "MVP: Model-View-Presenter, The Taligent Programming Model for C++ and Java". Taligent, Inc. (1996). PDF. 도입 문단, Summary 절, Three User Interface Questions 절. ↩
- Andy Bower, Blair McGlashan. "Twisting the Triad: The evolution of the Dolphin Smalltalk MVP application framework". ESUG 2000 Tutorial Paper (2000). Internet Archive 사본. Model-View-Controller, Twisting the triad 절. ↩
- Martin Fowler. Presentation Model (2004). Also Known as, 도입부의 Note. ↩
- John Gossman. Introduction to Model/View/ViewModel pattern for building WPF apps (2005). 본문 전체. ↩
- Josh Smith. WPF Apps With The Model-View-ViewModel Design Pattern. MSDN Magazine, February 2009. The Evolution of Model-View-ViewModel. ↩
- Redux. Prior Art. Elm. ↩
- Jeffrey Palermo. The Onion Architecture : part 1 (2008년 7월 29일). ↩
- Martin Fowler. Presentation Domain Data Layering. martinfowler.com (2015년 8월 26일). ↩
- Martin Fowler. *Patterns of Enterprise Application Architecture*. Addison-Wesley Professional, 2002. 저자의 책 소개 페이지; 출판사와 출간일은 InformIT. ↩
- Alistair Cockburn. Hexagonal (Ports & Adapters) Architecture. 2005년 9월 4일자 0.9판. Intent, The Pattern 절, Related Patterns의 Adapter 항목. ↩
- Jeffrey Palermo. The Onion Architecture : part 3 (2008년 8월 4일). Key tenets of Onion Architecture. ↩
- Robert C. Martin. Clean Architecture: A Craftsman's Guide to Software Structure and Design. Prentice Hall, 2017. Google Books. ↩
- Dino Esposito. "Cutting Edge: Better Web Forms with the MVP Pattern". MSDN Magazine 25(9) (2010년 9월). Microsoft Learn 보관본. MVP and MVVM 절. ↩
- John Gossman. Advantages and disadvantages of M-V-VM (2006). 본문 전체. ↩
- Dino Esposito. "Cutting Edge: Better Web Forms with the MVP Pattern". MSDN Magazine 25(9) (2010년 9월). Microsoft Learn 보관본. Postback 절. ↩