아키텍처 패턴은 소프트웨어 시스템의 구성 요소와 그 요소들 간의 관계를 정의하는 설계 원칙으로 소프트웨어의 구조와 동작을 정의하기 위한 고수준의 설계 청사진이다.
-> 단점이 기술적인 부분이 아닌 단순 사용자의 역량에 달려있다는 점에서 디자인 패턴의 유의미한 단점이 없다고 생각한다.
아키텍처 패턴은 시스템의 전체적인 설계를 담당하고, 디자인 패턴은 코드의 세부적인 구현을 담당한다.
구분 | 아키텍처 패턴 | 디자인 패턴 |
---|---|---|
수준 | 시스템 전체 | 코드의 특정 부분 |
목적 | 시스템 구조 정의 | 코드 품질 향상 |
예시 | MVC, MVP, MVVM | Singleton, Observer, Adatper |
MVP 패턴은 Model
, View
, Presenter
로 구성된 아키텍처 패턴으로 MVC 패턴에서 Controller
대신 Presenter
가 존재한다.
View
: 사용자 인터페이스를 담당. 사용자와 직접 상호작용하는 부분이며, 사용자 입력을 받고 결과를 표시
Model
: 애플리케이션의 데이터를 표현하고, 데이터 처리 로직을 담당. 비즈니스 로직을 담당하는 부분
Presenter
: Model
과 View
사이의 중개자 역할. 사용자의 입력을 받아 Model
에 전달하고, Model
에서 처리된 결과를 View
에 전달. View
와 Model
사이의 의존성을 줄여 테스트를 용이하게 만들고, 비즈니스 로직을 View
로부터 분리.
MVC 패턴과의 차이점은 MVC 패턴에서는 View
에서 Model
을 직접 control할 수 있었지만 MVP 패턴에서는 View
가 직접 Model
을 Control할 수 없어 View
와 Model
서로 의존하지 않게 되었으나 여전히 View
와 Presenter
사이의 강한 의존성이 존재한다.
View
에 있는 버튼을 클릭하거나 입력을 하는 등의 이벤트 발생View
에서 Presenter
로 전달Presenter
는 전달받은 이벤트에 따라 Model
에 필요한 작업을 요청Model
은 요청된 작업을 수행하고 결과를 Presenter
에게 반환Presenter
는 Model
에서 받은 결과를 바탕으로 View
를 업데이트View
와 Model
간 결합도가 낮아 각 컴포넌트를 독립적으로 변경하거나 테스트 가능Presenter
가 UI와 독립적이기 때문에 View
를 대체하여 비즈니스 로직을 단위 테스트하기가 쉬움.Presenter
와 Model
은 View
와 독립적이기에 다른 View
에서 동일한 Presente
나 Model
재사용 가능MVVM 패턴은 UI와 비즈니스 로직을 분리하여 애플리케이션의 유지보수성, 테스트 용이성, 확장성을 높이는 높이기 위해 설계된 아키텍처 패턴이다.
특히, 데이터 바인딩을 활용하여 UI와 데이터를 연결하는 방식으로 사용자 인터페이스 개발 생산성을 향상시키는 데 중점을 두고 있다.
View
: 사용자 인터페이스를 담당. 사용자와 직접 상호작용하는 부분이며, 사용자 입력을 받고 결과를 표시
Model
: 애플리케이션의 데이터를 표현하고, 데이터 처리 로직을 담당. 비즈니스 로직을 담당하는 부분
ViewModel
: View
와 Model
사이의 중개자 역할. View
에 노출될 데이터 관리. 사용자의 입력을 Model
에 전달. Model
에서 처리된 결과를 View
에 반영. 데이터 바인딩을 통해 View
와 ViewModel
사이의 데이터를 자동으로 동기화.
MVP 패턴은 View
와 Presenter
가 일대일 관계라면 MVVM은 View
와 ViewModel
간의 관계가 1대 N으로 하나의 ViewModel
을 다양한 View
에 사용할 수 있다.
또한 ViewModel
은 Presenter
에 비해 상대적으로 View
와 느슨하게 결합되어 있다.
ViewModel
은 View
에 표시될 데이터를 준비하고 사용자 입력을 처리하여 Model
에 전달하는 역할을 수행하고 View
의 구체적인 구현에 대한 지식이 필요하지 않다.
그에 비해 Presenter
는 View
의 상태를 관리하고 사용자 입력을 처리하는 등 다양한 책임을 수행하여 View
에 대한 의존도가 높다.
View
에 있는 버튼을 클릭하거나 입력하는 등의 이벤트가 발생View
에서ViewModel
로 전달ViewModel
은 전달받은 이벤트에 따라 Model
에 필요한 작업 요청Model
은 요청된 작업을 수행하고 결과를 ViewModel
에게 반환ViewModel
은 Model
에서 받은 결과를 바탕으로 ViewModel
의 속성을 업데이트하고 데이터 바인딩을 통해 View
가 자동으로 업데이트됨ViewModel
을 독립적으로 테스트할 수 있어 테스트 커버리지를 높이고 버그 조기 발견 가능ViewModel
과 데이터 바인딩 라이브러리를 활용하여 실시간 데이터 업데이트가 필요한 경우
클린 아키텍처는 외부 프레임워크나 UI, 데이터베이스 등의 변화에 유연하게 대응할 수 있도록 시스템의 내부와 외부를 명확하게 분리하는 것을 목표로 하는 아키텍처 패턴이다.
클린 아키텍처는 시스템의 구성을 4가지로 나눈다. 먼저 각 구성에 대해 알아보면
소프트웨어 아키텍처는 선을 긋는 기술이며, 나는 이러한 선을 경계(boundary)라고 부른다.
경계는 소프트웨어 요소를 서로 분리하고, 경계 한편에 있는 요소가 반대편에 있는 요소을 알지 못하도록 막는다. - Robert C. Martin, Clean Architecture
View, UI
: 직접적으로 플랫폼 의존적인 구현으로 UI 화면 표시와 사용자 입력 담당
Presenter가 명령하는 일만 수행
Presenter
: ViewModel
과 유사한 역할, 사용자 입력이 왔을 때 어떤 반응을 해야 하는지에 대한 판단을 하는 영역으로 View
가 단순히 명령만 수행하도록 함
Use Case
: 비즈니스 로직이 들어 있는 영역
Entity
: 앱의 실질적인 데이터
Repository
: 유즈 케이스가 필요로 하는 데이터의 저장 및 수정 등의 기능을 제공하는 영역으로 데이터 소스를 인터페이스로 참조하여, 로컬 DB와 네트워크 통신을 자유롭게 가능
Data Source
: 실제 데이터의 입출력이 실행되는 영역
상위 계층은 기본적으로 하위 계층을 참고하지만 실제로 도메인 계층은 데이터 계층을 참고하고 있지 않다.
-> 리포지터리에서 이루어지는 의존성 역전 법칙
때문
의존성 역전이란?
객체 지향 프로그래밍에서 의존 관계 역전 원칙은 소프트웨어 모듈들을 분리하는 특정 형식을 지칭한다. 이 원칙을 따르면, 상위 계층(정책 결정)이 하위 계층(세부 사항)에 의존하는 전통적인 의존 관계를 반전(역전)시킴으로써 상위 계층이 하위 계층의 구현으로부터 독립되게 할 수 있다.
https://meetup.nhncloud.com/posts/345
https://doosicee.tistory.com/entry/Architecture-%ED%8C%A8%ED%84%B4%EC%9D%B4%EB%9E%80
https://velog.io/@kyeun95/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4-MVP-%ED%8C%A8%ED%84%B4%EC%9D%B4%EB%9E%80
https://velog.io/@kyeun95/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4-MVVM-%ED%8C%A8%ED%84%B4%EC%9D%B4%EB%9E%80
https://velog.io/@toma/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B3%90%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4%EC%9D%98-%EA%B0%9C%EB%85%90%EA%B3%BC-%EC%B0%A8%EC%9D%B4%EC%A0%90
https://meetup.nhncloud.com/posts/345
https://medium.com/@justfaceit/clean-architecture%EB%8A%94-%EB%AA%A8%EB%B0%94%EC%9D%BC-%EA%B0%9C%EB%B0%9C%EC%9D%84-%EC%96%B4%EB%96%BB%EA%B2%8C-%EB%8F%84%EC%99%80%EC%A3%BC%EB%8A%94%EA%B0%80-1-%EA%B2%BD%EA%B3%84%EC%84%A0-%EA%B3%84%EC%B8%B5%EC%9D%84-%EC%A0%95%EC%9D%98%ED%95%B4%EC%A4%80%EB%8B%A4-b77496744616