아키텍처 패턴은 소프트웨어 시스템의 구성 요소와 그 요소들 간의 관계를 정의하는 설계 원칙으로 소프트웨어의 구조와 동작을 정의하기 위한 고수준의 설계 청사진이다.
-> 단점이 기술적인 부분이 아닌 단순 사용자의 역량에 달려있다는 점에서 디자인 패턴의 유의미한 단점이 없다고 생각한다.
아키텍처 패턴은 시스템의 전체적인 설계를 담당하고, 디자인 패턴은 코드의 세부적인 구현을 담당한다.
| 구분 | 아키텍처 패턴 | 디자인 패턴 |
|---|---|---|
| 수준 | 시스템 전체 | 코드의 특정 부분 |
| 목적 | 시스템 구조 정의 | 코드 품질 향상 |
| 예시 | 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
왜 이렇게 GPT가 작성한 것 같죠