디자인 패턴 vs 아키텍처 패턴 차이
갑자기 문득 궁금한 게 생겼다. 안드로이드에서 MVVM 패턴을 말할 때 MVVM 패턴을 디자인 패턴이라고 말하는 사람과 아키텍처 패턴이라고 말하는 사람들이 있다.
그런데 용어가 2개로 나뉘어졌는데 디자인 패턴과 아키텍처 패턴은 서로 다른 개념일 수 있지 않을까? 그럼 MVVM 패턴은 둘 중 어떤 것에 속하는 패턴일까? 하는 궁금증에서 확인해 봤다.
먼저 디자인 패턴과 아키텍처 패턴의 통상적인 정의를 먼저 확인한다. 각 정의는 모두 영문 위키백과에서 확인한 내용이다.
디자인 패턴
- 소프트웨어 디자인의 주어진 컨텍스트 안에서 일반적으로 발생하는 문제에 대한 일반적이고 재사용 가능한 솔루션
- 여러 상황에서 사용할 수 있는 문제 해결법에 대한 설명 or 템플릿
- 애플리케이션 또는 시스템 디자인 시 일반적인 문제를 해결하기 위해 사용할 수 있는 형식화된 모범사례
아키텍처 패턴
- 주어진 컨텍스트 안에서 소프트웨어 아키텍처에서 일반적으로 발생하는 문제에 대한 일반적이고 재사용 가능한 솔루션
- 컴퓨터 하드웨어 성능 제한, 고가용성 및 비즈니스 위험 최소화 같은 소프트웨어 엔지니어링의 여러 문제 해결
- 소프트웨어 디자인 패턴과 유사하지만 범위가 더 넓음
아키텍처 패턴은 디자인 패턴보다 범위가 더 넓다고 한다. 사실 두 정의가 다 비슷해서 헷갈리는데 아키텍처 패턴의 범위가 더 넓다는 말을 보면, 아키텍처 패턴은 좀 더 넓은 범위를 아울러 말하는 워딩 같고 디자인 패턴은 아키텍처 패턴보다 조금 더 좁은 범위를 말하는 워딩 같다.
이제 두 패턴의 비교를 설명하는 포스팅들을 확인해 봤다.
https://www.linkedin.com/pulse/architectural-pattern-vs-design-praveen-kumar-kushwaha/
아키텍처 패턴은 디자인 패턴보다 범위가 넓다. 디자인 패턴은 아키텍처 패턴이 비즈니스 문제에 대한 솔루션인 경우 매우 구체적인 소프트웨어 관련 작업을 제공한다. 즉 아키텍처 패턴은 아이디어의 추상적 관점에 더 초점을 맞추고 디자인 패턴은 아이디어 구현 관점에 초점을 맞춘다
디자인 패턴의 구현은 세분화된 수준에서 정의되며 아키텍처 패턴은 상위 수준에서 정의된다. 예를 들어 팩토리, 빌더 패턴의 다른 구현은 다른 프로젝트에서 매우 유사하게 보일 수 있다. 그러나 동일한 아키텍처 패턴은 프로젝트마다 많이 다를 수 있다. 많은 디자인 패턴을 사용해서 하나의 아키텍처 패턴을 구현할 수 있다. 아키텍처 패턴, 디자인 패턴 사이에는 일대다 관계가 있다
예를 들어 MVP의 구현 시 팩토리, 빌더 패턴으로 Model을 구현할 수 있고 옵저버, 파사드 패턴으로 Presenter를 구현할 수 있다. View는 팩토리, 싱글톤으로 구현할 수 있다
아키텍처 패턴은 앱 아키텍처가 아니다. 아키텍처 패턴은 프로젝트, 솔루션 수준에서 응용 프로그램을 유지보수하기 더 쉽게 하고 느슨하게 결합, 확장할 수 있게 하는 지침, 규칙을 제공한다. 앱 아키텍처는 다른 디자인 패턴, 인터페이스와 함께 아키텍처 패턴을 사용하게 될 앱의 완전한 아키텍처다. 몇 가지 인기 있는 아키텍처 패턴은 아래와 같다
- MVC/P/VM
- VIPER
- Three-tier / Multi-tier
- 의존성 주입 아키텍처 패턴
요약하면 아키텍처 패턴은 소프트웨어 디자인의 상위 수준 추상화고, 디자인 패턴은 특정 모듈 수준 문제에 대한 솔루션을 제공한다고 할 수 있다
https://singhdivesh.medium.com/according-to-wikipedia-b1afa6de08c
1. 아키텍처 패턴은 설계 단계에서 제공되고 디자인 패턴은 구축 단계에서 제공된다
2. 아키텍처 패턴은 청사진과 같고 디자인 패턴은 실제 구현이다
3. 아키텍처 패턴은 다른 모든 것들이 준수하는 기본이며, 디자인 패턴은 일반적인 문제를 해결하기 위해 클래스를 구성하는 방법이다
4. 모든 아키텍처 패턴은 디자인 패턴이지만 모든 디자인 패턴이 아키텍처 패턴일 수는 없다. MVC와 마찬가지로 둘 모두에 속할 수 있다. 그러나 싱글톤 패턴은 아키텍처 패턴이 될 수 없다. MVC / VM 모두 아래에 있다
아키텍처 : 구성요소가 시스템에서 작동하고 통신하는 방법. 구성 요소의 물리적 위치를 설정하고 마지막으로 구성요소를 만들기 위한 도구를 선택한다
디자인 : 아키텍처가 더 넓은 그림을 다루는 반면 디자인은 특정 구성요소 구현과 관련된 세부 사항으로 드릴다운해야 한다
안드로이드 프로젝트가 Model - ViewModel - View 형태를 지키면 MVVM 패턴이라고 하며, Model과 ViewModel 사이에 Repository를 추가해도 똑같이 MVVM 패턴이라고 한다.
이렇게 모듈별로 추상화해서 어떤 모듈들이 어떻게 존재해야 하는지 추상화한 것을 아키텍처 패턴, 각 모듈 안의 구체적인 소스코드들이 어떤 형태로 존재해야 일반적으로 발생할 수 있는 문제를 해결할 수 있는지 정의한 것이 디자인 패턴이라고 이해했다.
즉 MVVM 패턴은 디자인 패턴이 아니고 아키텍처 패턴인 것이다.
참고한 사이트)
https://en.wikipedia.org/wiki/Software_design_pattern
https://en.wikipedia.org/wiki/Architectural_pattern