You are looking for information, articles, knowledge about the topic nail salons open on sunday near me 안드로이드 디자인 패턴 on Google, you do not find the information you need! Here are the best content compiled and compiled by the toplist.Experience-Porthcawl.com team, along with other related topics such as: 안드로이드 디자인 패턴 안드로이드 디자인 패턴 종류, 안드로이드 MVVM, 안드로이드 스튜디오 패턴 잠금, 안드로이드 MVC, 안드로이드 MVP 패턴 예제, 안드로이드 디자인 가이드, 안드로이드 MVP, MVVM, 안드로이드 MVP 구현
[Android] 디자인 패턴 (MVC, MVP, MVVM)
- Article author: ardor-dev.tistory.com
- Reviews from users: 32453 Ratings
- Top rated: 3.1
- Lowest rated: 1
- Summary of article content: Articles about [Android] 디자인 패턴 (MVC, MVP, MVVM) [Andro] 디자인 패턴 (MVC, MVP, MVVM). by tempus 2021. 8. 3. 반응형. 처음 안드로이드 개발을 시작할 때는 단순히 기능 구현에 집중을 했었지만 어느 순간부터 … …
- Most searched keywords: Whether you are looking for [Android] 디자인 패턴 (MVC, MVP, MVVM) [Andro] 디자인 패턴 (MVC, MVP, MVVM). by tempus 2021. 8. 3. 반응형. 처음 안드로이드 개발을 시작할 때는 단순히 기능 구현에 집중을 했었지만 어느 순간부터 … 처음 안드로이드 개발을 시작할 때는 단순히 기능 구현에 집중을 했었지만 어느 순간부터 만드는 앱의 규모가 커지고 다양한 데이터를 다루다 보니 architecture에 대한 관심을 가지게 되었습니다. 그래서 찾아본..
- Table of Contents:
MVC (Model View Controller)
MVP (Model View Presenter)
MVVM (Model View ViewModel)
정리
태그
관련글
댓글0
최근글
인기글
전체 방문자
[Android] 디자인패턴 1 – 디자인패턴이란? :: Just do it.
- Article author: jroomstudio.tistory.com
- Reviews from users: 34237 Ratings
- Top rated: 3.3
- Lowest rated: 1
- Summary of article content: Articles about [Android] 디자인패턴 1 – 디자인패턴이란? :: Just do it. 디자인 패턴. mvc – mvp – mvvm을 사용해보기위해 공부해보니 안드로이드 개발 시 사용하는 디자인패턴이라는 것을 알게되었다. 그렇다면 먼저 디자인 … …
- Most searched keywords: Whether you are looking for [Android] 디자인패턴 1 – 디자인패턴이란? :: Just do it. 디자인 패턴. mvc – mvp – mvvm을 사용해보기위해 공부해보니 안드로이드 개발 시 사용하는 디자인패턴이라는 것을 알게되었다. 그렇다면 먼저 디자인 … 디자인 패턴 mvc – mvp – mvvm을 사용해보기위해 공부해보니 안드로이드 개발 시 사용하는 디자인패턴이라는 것을 알게되었다. 그렇다면 먼저 디자인 패턴에 대해 공부를 해봐야 할 것 같아서 찾아보기 시작했는데..
- Table of Contents:
디자인 패턴
Behavioral patterns
그래서 MVC, MVP, MVVM 디자인패턴 이 뭔데? – 안드로이드 /뿌시레기/
- Article author: blog.crazzero.com
- Reviews from users: 5567 Ratings
- Top rated: 3.0
- Lowest rated: 1
- Summary of article content: Articles about 그래서 MVC, MVP, MVVM 디자인패턴 이 뭔데? – 안드로이드 /뿌시레기/ View : 간단하게 말해서 UI(User Interface) 이다. 다만 각 디자인 패턴에 따라 그 용도에 차이가 있다. 이 부분은 밑에서 자세히 설명하도록 한다. …
- Most searched keywords: Whether you are looking for 그래서 MVC, MVP, MVVM 디자인패턴 이 뭔데? – 안드로이드 /뿌시레기/ View : 간단하게 말해서 UI(User Interface) 이다. 다만 각 디자인 패턴에 따라 그 용도에 차이가 있다. 이 부분은 밑에서 자세히 설명하도록 한다. 대가리 깨지면서 배우는 코딩공부 재밌쥬?
- Table of Contents:
그래서 MVC MVP MVVM 디자인패턴 이 뭔데 – 안드로이드 뿌시레기
tl;dr
서론
공통 용어
MVC ( Model – View – Controller )
MVP ( Model – View – Presenter )
MVVM ( Model – View – View Model )
결론
참조
[안드로이드] 디자인 패턴(Design Pattern) 이란? – 빅토’s 개발 스토리
- Article author: bictoselfdev.blogspot.com
- Reviews from users: 29199 Ratings
- Top rated: 3.2
- Lowest rated: 1
- Summary of article content: Articles about
[안드로이드] 디자인 패턴(Design Pattern) 이란? – 빅토’s 개발 스토리
안드로이드 소프트웨어 디자인 패턴. … (소프트웨어) 디자인 패턴에 대해 간단하게 개념 정리하고. 다양한 패턴들 중에 많이 사용되거나 필요하다고 생각되는 패턴을 … … - Most searched keywords: Whether you are looking for
[안드로이드] 디자인 패턴(Design Pattern) 이란? – 빅토’s 개발 스토리
안드로이드 소프트웨어 디자인 패턴. … (소프트웨어) 디자인 패턴에 대해 간단하게 개념 정리하고. 다양한 패턴들 중에 많이 사용되거나 필요하다고 생각되는 패턴을 … YOUR KEYWORDS HERE안드로이드 소프트웨어 디자인 패턴 - Table of Contents:
Popular Posts
Visitant
[Android] 안드로이드 디자인패턴 3 – 3 MVVM패턴
- Article author: healthcoding.tistory.com
- Reviews from users: 44914 Ratings
- Top rated: 4.5
- Lowest rated: 1
- Summary of article content: Articles about [Android] 안드로이드 디자인패턴 3 – 3 MVVM패턴 [Andro] 안드로이드 디자인패턴 3 – 3 MVVM패턴 … 저번 글에서 살펴보았던 MVP패턴에서는 Presenter가 View에 어떤 일을 요청하는지 명백하게 … …
- Most searched keywords: Whether you are looking for [Android] 안드로이드 디자인패턴 3 – 3 MVVM패턴 [Andro] 안드로이드 디자인패턴 3 – 3 MVVM패턴 … 저번 글에서 살펴보았던 MVP패턴에서는 Presenter가 View에 어떤 일을 요청하는지 명백하게 … 안녕하세요~ 헬창코딩 입니다. 오늘은 MVVM패턴에 대해서 알아보도록 하겠습니다. 저번 글에서 살펴보았던 MVP패턴에서는 Presenter가 View에 어떤 일을 요청하는지 명백하게 확인할 수 있었습니다. 하지만 View와..
- Table of Contents:
세상을 바꾸는 개발자
[Android] 안드로이드 디자인패턴 3 – 3 MVVM패턴 본문티스토리툴바
Android 디자인패턴이 그렇게 중요할까?
- Article author: choi3950.tistory.com
- Reviews from users: 46184 Ratings
- Top rated: 4.0
- Lowest rated: 1
- Summary of article content: Articles about Android 디자인패턴이 그렇게 중요할까? Andro 디자인패턴이 그렇게 중요할까? … 필자는 1년 6개월차 안드로이드 초보개발자입니다. 1년간 블록체인 회사에서 일하고, 개인적인 사정으로 … …
- Most searched keywords: Whether you are looking for Android 디자인패턴이 그렇게 중요할까? Andro 디자인패턴이 그렇게 중요할까? … 필자는 1년 6개월차 안드로이드 초보개발자입니다. 1년간 블록체인 회사에서 일하고, 개인적인 사정으로 … 필자는 1년 6개월차 안드로이드 초보개발자입니다. 1년간 블록체인 회사에서 일하고, 개인적인 사정으로 프리랜서 6개월을 진행했습니다. 출시한 앱은 총 4개이며, 출시후 디테일하게 유지보수까지 한 앱은 2개..
- Table of Contents:
오늘도 삽질중
Android 디자인패턴이 그렇게 중요할까 본문
[Android]안드로이드 애플리케이션 설계패턴
- Article author: heejong0217.tistory.com
- Reviews from users: 4354 Ratings
- Top rated: 4.9
- Lowest rated: 1
- Summary of article content: Articles about [Android]안드로이드 애플리케이션 설계패턴 MVC와 비슷하지만 Activity와 Fragment의 UI 그리고 비지니스 로직을 분리하는데 집중하므로 데이터의 흐름이 약간 다르다. MVP 디자인패턴은 Controller … …
- Most searched keywords: Whether you are looking for [Android]안드로이드 애플리케이션 설계패턴 MVC와 비슷하지만 Activity와 Fragment의 UI 그리고 비지니스 로직을 분리하는데 집중하므로 데이터의 흐름이 약간 다르다. MVP 디자인패턴은 Controller … 일반적으로 안드로이드 애플리케이션을 설계하는 패턴 중 가장 많이 사용되고 비교되는 패턴은 MVC, MVP, MVVP 디자인 패턴이 있다. 1. MVC 디자인 패턴 – 구조를 모델(Model), 뷰(View), 컨트롤러(Controller) 세..
- Table of Contents:
태그
‘Android’ Related Articles
공지사항
최근 포스트
태그
검색
전체 방문자
Android Design Pattern(안드로이드 디자인 패턴) :: 나무’s 블로그
- Article author: wlgusdn700.tistory.com
- Reviews from users: 1227 Ratings
- Top rated: 4.8
- Lowest rated: 1
- Summary of article content: Articles about Android Design Pattern(안드로이드 디자인 패턴) :: 나무’s 블로그 이전까지 내가 사용하던 디자인 패턴은 MVC 의 패턴으로 알고 있었다. 하지만 이번에 MVVM을 공부하면서 좀 더 자세한 MVC MVP MVVM의 특징들을 알고 … …
- Most searched keywords: Whether you are looking for Android Design Pattern(안드로이드 디자인 패턴) :: 나무’s 블로그 이전까지 내가 사용하던 디자인 패턴은 MVC 의 패턴으로 알고 있었다. 하지만 이번에 MVVM을 공부하면서 좀 더 자세한 MVC MVP MVVM의 특징들을 알고 … 이전까지 내가 사용하던 디자인 패턴은 MVC 의 패턴으로 알고 있었다. 하지만 이번에 MVVM을 공부하면서 좀 더 자세한 MVC MVP MVVM의 특징들을 알고 나서는 ‘나는 단지 스파게티를 만드는 요리사였구나’ 싶었다…
- Table of Contents:
안드로이드 아키텍처 패턴 – MVC가 뭘까?
- Article author: velog.io
- Reviews from users: 16399 Ratings
- Top rated: 4.5
- Lowest rated: 1
- Summary of article content: Articles about 안드로이드 아키텍처 패턴 – MVC가 뭘까? 디자인 패턴은 건축으로 치면 건축공법에 해당하는 것으로 소프트웨어의 개발 방법을 문서로 공식화한 것 … …
- Most searched keywords: Whether you are looking for 안드로이드 아키텍처 패턴 – MVC가 뭘까? 디자인 패턴은 건축으로 치면 건축공법에 해당하는 것으로 소프트웨어의 개발 방법을 문서로 공식화한 것 … 이번엔 아키텍쳐 디자인 패턴을 말할때 가장 많이 쓰이면서 기본이 되는 MVC에 대해 간략하게 설명 해보려 합니다.
경험상 제가 막 개발자 커리어를 시작한때에도 스타트업에 안드로이드 개발자 포지션으로 면접을 보러 가면 90%정도는 아키텍쳐 패턴에 대해 질문을 했습니다.
- Table of Contents:
Android
1그런데 디자인 패턴이 뭐고 왜 사용해야 하는데
2그래서 등장한 MVC!
3MVC의 장점
4MVC의 단점
안드로이드의 MVC, MVP, MVVM 종합 안내서
- Article author: academy.realm.io
- Reviews from users: 46478 Ratings
- Top rated: 4.1
- Lowest rated: 1
- Summary of article content: Articles about 안드로이드의 MVC, MVP, MVVM 종합 안내서 안드로이드 앱을 만드는 개발자를 위한 MVC, MVP, MVVM 패턴 사용법과 … 이를 설정하지 않으면 디자인 타임에 일어나는 일을 파악하기 어려울 수 … …
- Most searched keywords: Whether you are looking for 안드로이드의 MVC, MVP, MVVM 종합 안내서 안드로이드 앱을 만드는 개발자를 위한 MVC, MVP, MVVM 패턴 사용법과 … 이를 설정하지 않으면 디자인 타임에 일어나는 일을 파악하기 어려울 수 … 안드로이드 앱을 만드는 개발자를 위한 MVC, MVP, MVVM 패턴 사용법과 장단점에 대한 안내서입니다.
- Table of Contents:
See more articles in the same category here: toplist.Experience-Porthcawl.com/blog.
[Android] 디자인 패턴 (MVC, MVP, MVVM)
처음 안드로이드 개발을 시작할 때는 단순히 기능 구현에 집중을 했었지만 어느 순간부터 만드는 앱의 규모가 커지고 다양한 데이터를 다루다 보니 architecture에 대한 관심을 가지게 되었습니다. 그래서 찾아본 결과 Android에서 유명한 architecture에는 MVC, MVP, MVVM 이렇게 3가지가 있었습니다. 오늘은 이를 공부하고 정리해보려고 합니다.
아래의 글을 공부하며 내 나름대로 정리를 해보았습니다.
academy.realm.io/posts/eric-maxwell-mvc-mvp-and-mvvm-on-android/
MVC ( Model View Controller)
아마 처음 안드로이드 개발을 접하다 보면 위의 구조를 가장 많이 접하게 될 것입니다. 나 또한 지금 MVC의 방법에 Manager를 구성해 데이터를 다루는 방식으로 개발을 해왔습니다.
위의 Architecture는 크게 이름에 나타나듯이 크게 3가지로 구성되어 있습니다.
Model : Application의 두뇌 라고 볼 수 있습니다. 데이터 + 상태 + 비즈니스 로직을 다룹니다 . View나 Controller에 묶여 있지 않아 재사용이 가능합니다.
라고 볼 수 있습니다. . View나 Controller에 묶여 있지 않아 재사용이 가능합니다. View : 모델의 내용들을 표현 해줍니다. 사용자가 application을 사용할 때 Controller와 통신합니다. 하지만 MVC에서 View는 모델에 대한 지식이 없고 사용자와 application이 상호작용을 할 때 수행하는 작업을 이해하지 못합니다.
해줍니다. 사용자가 application을 사용할 때 Controller와 통신합니다. 하지만 MVC에서 View는 모델에 대한 지식이 없고 사용자와 application이 상호작용을 할 때 수행하는 작업을 이해하지 못합니다. Controlloer : Model과 View의 중간에서 데이터 변경이나 상호 작용을 관리하여 View나 Model을 업데이트시켜줍니다.
MVC 구조
하지만 이러한 구조는 Model 자체는 분리되어있기 때문에 단위 테스트가 가능하지만 Controller(Activity, Fragment)에 몇 가지 문제가 생기게 됩니다.
내가 느낀 가장 큰 문제점 2가지는 View의 변경에 따른 Controller 변경이 빈번하게 일어나야 되고 이는 개발자에게 있어서 매우 귀찮은 작업이고 규모가 커지게 되면 많은 코드가 Controller에서 담당하기 때문에 자칫 application이 깨질 수 있습니다. 특히 라이브하고 데이터 변경이 빈번한 application 일수록 치명적일 수 있습니다.
MVP ( Model View Presenter )
이러한 MVC의 문제점을 해결하기 위해 나온 패턴인데 일단 Controller를 분리하여 Controller의 책임을 줄이고 View와 Activity/Fragment가 자연스럽게 결합되도록 만들었습니다.
Model : MVC의 model과 같은 역할 을 합니다.
을 합니다. View : Activity/Fragment가 View의 일부분으로 간주됩니다. Activity가 View Interface를 implements 하여 이를 통해 특정 View에 결합하는 것을 제거하고 View의 모의 구현으로 단위 테스트가 가능해집니다.
Presenter : MVC의 Controller의 역할이지만 View에 전혀 연결되어 있지 않은 인터페이스입니다. 이를 통해 모듈성, 유연성 문제뿐만 아니라 테스트 가능성 문제를 해결합니다.
MVP 구조
MVC와 다른 점은 Controller에 Activity나 Fragment가 들어가는 대신 Presenter라는 Interface가 들어갔습니다. 기존의 Controller에 다루던 함수나 기능들이 Presenter라는 interface에 모여서 사용 시에는 interface 형식으로 가져와서 좀 더 유연성과 모듈화에 초점을 둔 것 같습니다.
그렇다고 단점이 없는 건 아닌 것 같습니다. Presenter도 Controller와 마찬가지로 시간이 지남에 따라 추가 비즈니스 로직을 수집하는 경향이 있습니다. 결국 이는 Presenter의 몸집이 커져 유지보수 관리가 힘들 수 있다는 것을 의미하는 것 같습니다.
MVVM ( Model View ViewModel )
Android 개발을 시작하고 익숙해지면 MVVM이란 말을 가장 많이 들어볼 것입니다. MVVM은 Data-binding을 사용하여 더 쉬운 테스트 및 모듈화의 이점을 동시에 제공하고 View + Model을 연결하기 위해 작성하는 Glue 코드 양을 줄여 줍니다.
흔히 말하는 객체지향 디자인 패턴의 옵져버 패턴을 본떠서 만든 구조 같습니다. “옵져버 패턴의 옵져버 역할은 ViewModel이라는 친구가 한다.”라고 생각하면 쉽게 이해가 될 것입니다.
Model : MVC의 Model과 같습니다.
View : 가변적인 방식으로 ViewModel에 의해 노출되는 관찰 가능한 변수 및 작업에 바인딩됩니다.
ViewModel : Model 을 wrapping 하고 View에 필요한 관찰 가능한 데이터를 준비합니다. 또한 뷰가 이벤트를 모델에 전달하기 위한 hooks를 제공합니다. 하지만 ViewModel은 뷰에 연결되어 있지 않습니다 .
MVVM 구조
MVVM의 단점은 View과 변수나 표현식 모두에 바인딩할 수 있으므로 시간이 지남에 따라 외부 Presentation 논리가 유입되어 XML에 코드를 추가할 수 있습니다. 이는 단위 테스트에 영향을 줄 수 있기 때문에 이를 방지하려면 뷰 바인딩 표현식에서 값을 계산하거나 파생하지 말고 항상 ViewModel에서 직접 값을 가져와야 한다고 말하고 있습니다.
정리
MVP와 MVVM은 모두 앱을 모듈화하고 단일 책임 요소로 분할하는 데 MVC보다 더 나은 작업을 수행하지만 Application에 더 많은 복잡성을 추가됩니다. 오히려 앱이 간단하고 라이브 하지 않다면 MVC에서 더 잘 작동할 것입니다.
결국에 가장 중요하게 생각하는 건 구조에 얽매이지 말고 현재 개발하는 Application에 최적의 구조를 스스로 응용해서 만들 수 있어야 한다는 것입니다. 다음에는 MVVM, MVP에 대해 코드를 작성하면서 더 자세히 알아보겠습니다.
[Android] 디자인패턴 1 – 디자인패턴이란?
디자인 패턴
mvc – mvp – mvvm을 사용해보기위해 공부해보니 안드로이드 개발 시 사용하는 디자인패턴이라는 것을 알게되었다. 그렇다면 먼저 디자인 패턴에 대해 공부를 해봐야 할 것 같아서 찾아보기 시작했는데 공부해야 할 것이 너무 많다… 앞으로 꾸준히 해야 한다고 생각하고 여기서는 간단하게 개념만 정리한 후 예제를 만들고 실제 프로젝트에 적용해보면서 공부해 나가도록 하겠다.
디자인패턴이란 무엇인가?
– 여기서 다루는 디자인패턴이란 ‘소프트웨어 공학’의 개념이다.
– 프로그래밍할 때 다양한 문제 상황에 대한 재사용 가능한 해결책이다.
*일반적인 문제를 해결하기 위해 최선의 방법을 공식화 혹은 정의 하는 것
– 패러다임과 알고리즘과는 다르다.
* 객체지향 패러다임이든 함수형 프로그래밍 패러다임이든 문제상황은 일관되기에 패러다임과 디자인패턴은 동의어가 될 수 없다. 또한 어떠한 알고리즘이라도 마찬가지로 문제상황은 일관되기 때문에 알고리즘과도 동의어가 될 수 없다. 디자인패턴은 일반화된 해결책이다.
– 디자인 패턴은 객체지향 패러다임의 개념이 아니다.
* 디자인 패턴에 대한 내용을 보면 객체지향 패러다임에 국한된 내용들이 많은데 엄밀히 말하면 아니다. 디자인 패턴이 반드시 객체지향에 적합해야 할 필요는 없다. 다만 객체지향이 굉장히 유용한 패러다임이기 때문에 이에 대한 연구가 더 많이 진행되었던 것이다.
– Creational(창조), Structural(구조), Behavioral(행동)으로 구분한다.
* 클래스와 인스턴스에 관한 생성, 구조화, 행동과 관련있다. 여기서 디자인 패턴이 객체지향에 초점을 맞추고 있음을 알 수 있다.
Creational patterns
– ‘Creat’이라는 어미에 맞게 클래스의 인스턴스를 만드는 것과 관련있다.
– Class creation patterns : 상속을 효과적으로 사용하는데 집중
– Object creation patterns : 인스턴스를 효과적으로 생성하는데 집중 (Delegation 활용)
– 대표적으로 Singleton 패턴이 있다.
*싱글톤은 하나의 클래스에 단 하나의 인스턴스를 허용하는 패턴이다. 자주 사용되므로 이 예제를 구현해보면서 이해해보자.
SingletonSample
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 public class SingletonSample { private static SingletonSample instance = null ; private SingletonSample(){} public static SingletonSample getInstance(){ if (instance = = null ){ instance = new SingletonSample(); } return instance; } private Activity activity; public Activity getActivity(){ return activity; } public void setActivity(Activity activity) { this .activity = activity; } }
Singleton
하나의 클래스에 대해 어플리케이션이 시작될 때 최초 한번만 메모리를 할당하고 그 메모리에 인스턴스를 생성한다. 즉, 인스턴스를 단 하나만 생성한다.
장점
– 고정된 메모리영역을 얻어 하나의 인스턴스만 생성하기 때문에 메모리 낭비를 방지한다.
– 인스턴스가 전역적으로 사용될 수 있기에 다른 클래스의 인스턴스들이 데이터를 공유하고 변경할 수 있다.
단점
– 싱글톤 인스턴스에게 많은일을 위임하거나 데이터를 공유시킬 경우 다른 클래스의 인스턴스간에 결합도가 높아져 개방폐쇄원칙에 위배된다.
– 멀티스레드 환경에서 데이터 동기화 문제가 발생할 수 있음 (Synchronized 키워드 활용)
– 너무 많이 사용하지 않도록 한다.
private static SingletonSample instance = null;
static으로 인스턴스의 메모리 할당
private SingletonSample(){}
생성자 앞에 private으로 선언
-> 다른 클래스에서 new 키워드로 해당 인스턴스를 생성할 수 없음
1 2 3 4 5 6 public static SingletonSample getInstance(){ if (instance = = null ){ instance = new SingletonSample(); } return instance; }
return instance;}getInstace()를 통해 다른 클래스에서 해당 인스턴스에 접근할 수 있다.
*위 싱글톤 예제는 해당 인스턴스를 통해 Activity를 얻어온다.
싱글톤 클래스의 인스턴스를 생성한 Activity의 생명주기에따라 영향을 받을 수 있게하기 위함이다. 만약 Activity 생명주기에 영향을 받지 않게 하기 위해선 Application 레벨의 Context를 받는 것으로 대체할 수 있다.
참고
https://limkydev.tistory.com/37
Structural patterns
– 클래스나 인스턴스들의 관계와 관련있다.
– 프로그램의 여러 기능들 간에 인터페이스를 명확히한다.
– 클래스나 인스턴스의 관계를 조정하고 구조를 짜맞추는 패턴들이 포함된다.
– 대표적으로 Adapter 패턴이 있다.
* 외부와 접촉하는 인터페이스가 불일치해 상호 접근이 불가한 객체들 사이에서 연결점이되어 두 객체를 연결해주는 역할을 한다. 마찬가지로 예제를 통해 알아보도록 하자.
안드로이드에서 대표적으로 Adapter를 사용하는 것이 리사이클러뷰다.
리사이클러뷰에 대한 글이 아니기때문에 Adapter위주로 자세히 살펴보도록 하자.
리사이클러뷰 구성요소
리사이클러뷰는 데이터 목록을 아이템 단위의 뷰로 구성하여 화면에 표시하기 위해 Adapter를 사용한다. 또한 아이템뷰가 나열되는 형태를 관리하기 위한 요소를 제공하며 이를 레이아웃 매니저라고 한다. 레이아웃 매니저가 제공하는 레이아웃의 형태로 어댑터를 통해 만들어진 각 아이템뷰는 뷰홀더 객체에 저장되어 화면에 표시되고 필요에 따라 생성 또는 재활용(Recycle)된다.
Adapter
– 리사이클러뷰에 표시될 아이템뷰를 생성하는 역할
– 사용자 데이터 리스트로부터 아이템뷰를 생성
레이아웃 매니저
– 어떤 형태로 아이템뷰를 배치할 것인지를 결정
뷰홀더
– 화면에 표시될 아이템뷰를 저장하는 객체
실행화면
AdapterSample
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 public class AdapterSample extends RecyclerView.Adapter < AdapterSample.ViewHolder > { private ArrayList < String > mData = null ; public class ViewHolder extends RecyclerView.ViewHolder { TextView tv_main; public ViewHolder(@NonNull View itemView) { super (itemView); tv_main = itemView.findViewById(R.id.tv_main); } } public AdapterSample(ArrayList < String > list){ mData = list; } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { Context context = parent.getContext(); LayoutInflater inflater = (LayoutInflater) context.getSystemService( Context.LAYOUT_INFLATER_SERVICE); View view = inflater.inflate(R.layout.rv_item_main, parent, false ); AdapterSample.ViewHolder vh = new AdapterSample.ViewHolder(view); return vh; } @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { String text = mData.get(position); text holder.tv_main.setText(text); } @Override public int getItemCount() { return mData.size(); } }
ViewHolder 클래스
-> 아이템 뷰를 저장한다.
-> 뷰 객체에 대한 참조를 한다.
onCreateViewHolder()
-> 아이템 뷰를 위한 뷰홀더 객체를 생성하여 리턴한다.
onBindViewHolder()
-> position에 해당하는 데이터를 뷰홀더의 아이템뷰에 표시한다.
getItemCount()
-:> 전체 데이터 갯수를 리턴한다.
* 어댑터 내에 뷰홀더를 위한 클래스를 구현한것을 확인할 수 있다.
뷰홀더는 RecyclerView.ViewHolder를 상속받아 구현한다. 해당 뷰홀더는 아이템에 표시될 텍스트뷰에 대한 참조를 가진다.
이렇게 작성한 뷰홀더는 어댑터로부터 onCreateViewHolder()와 onBindViewHolder() 메소드를 오버라이드하여 각각 생성과 데이터 표시를 하여 화면에 출력한다.
MainActivity
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); ArrayList < String > list = new ArrayList < > (); for ( int i = 0 ; i < 100 ; i + + ) { list. add ( String . format ( "TEXT %d" , i)) ; } RecyclerView recyclerView = findViewById(R.id.rv_main) ; recyclerView.setLayoutManager( new LinearLayoutManager( this )) ; AdapterSample adapter = new AdapterSample(list) ; recyclerView.setAdapter(adapter) ; } } 메인 액티비티에서 위에서 구현한 리사이클러뷰를 출력한다. 여기서 다시한번 Adapter의 특징을 생각해보자. * 외부와 접촉하는 인터페이스가 불일치해 상호 접근이 불가한 객체들 사이에서 연결점이되어 두 객체를 연결해주는 역할을 한다. 메인액티비티의 activity_main.xml 에 리사이클러뷰가 셋팅되어있고 해당 리사이클러뷰에는 rv_tiem_main.xml을 사용하는 아이템뷰들이 표시된다. 해당 아이템뷰들은 ViewHolder에서 저장하고 있다. 즉, 메인액티비티의 리사이클러뷰와 뷰홀더의 아이템뷰는 상호 접근이 불가한 객체인 것이다. 이 사이에서 AdpaterSample 클래스에서 Adapter 패턴을 구현해 두 객체를 연결해주는 역할을 하고있다. 참고 https://recipes4dev.tistory.com/154 Behavioral patterns - 클래스와 인스턴스가 동작하는 방식이나 소통하는 방식과 관련있다. - 객체 속 작업이 진행되는 작업 흐름을 정의하고 따라간다. - 알고리즘이나 기능들이 어떻게 흐르는지, 어떤 순서로 소통하는 지에 대해 정의한다. - 대표적으로 Template Method 패턴이 있다. * 어떤 동작의 알고리즘을 단위 기능 모듈로 분류하고 이들간의 동작 순서를 정의한다. 그리고 나서 단위 기능을 바로 구현하는 것이 아니라 몇몇은 그 클래스를 상속할 자식 클래스에 위임한다. 예제를 통해 알아보자. Template Method 예제 AutoCar 1 2 3 4 5 6 7 8 9 public class AutoCar { public void playWithOwenr(){ Log.e( "on" , "시동켜기" ); Log.e( "side_break" , "해제" ); Log.e( "start" , "D" ); Log.e( "operation" , "자동" ); Log.e( "break" , "브레이크" ); } } Manual Car 1 2 3 4 5 6 7 8 9 public class ManualCar { public void playWithOwenr(){ Log.e( "on" , "시동켜기" ); Log.e( "side_break" , "해제" ); Log.e( "start" , "2단" ); Log.e( "operation" , "수동" ); Log.e( "break" , "브레이크" ); } } http://colorscripter.com/info#e " target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
자동 변속하는 자동차 클래스가있고, 수동 변속하는 자동차 클래스가있다.
둘다 playWithOwner() 메소드를 통해 동일하게 구현되있지만 수동기어인지 자동기어인지에 대해서 사로 다르다.
이 경우 Template Method Pattern 을 사용하여 설계할 수 있다.
*한꺼번에 구체적인 클래스를 구현하지 않고 추상클래스의 템플릿 메소드를 구현하여서 구체적인 클래스가 이를 상속받아 자신이 필요한 메소드를 작성해주는 방식이다.
다음과같이 변경이 가능하다.
1 2 3 4 5 6 7 8 9 10 11 12 public abstract class Car { public void playWithOwner(){ Log.e( “on” , “시동켜기” ); Log.e( “side_break” , “해제” ); play(); stopBreak(); } abstract void play(); void stopBreak() { Log.e( “break” , “브레이크” ); } }
추상클래스 안에 추상메소드 선언을 해놓고 일반 메소드를 어느정도 구현해 놓았다.
추상클래스를 상속받은 구체적인 클래스는 추상메소드를 강제로 오버라이딩 시켜 재정의해야한다. 일반 메소드는 재정의 해도되고 안해도 된다. 이러한 메소드는 Hook 메소드라고 한다. stopBreak()이 Hook에 해당된다. 다음과 같이 수정해보자.
AutoCar
1 2 3 4 5 6 7 8 9 10 11 12 public class AutoCar extends Car{ @Override void play() { Log.e( “start” , “2단” ); Log.e( “operation” , “수동” ); } @Override void stopBreak() { super .stopBreak(); Log.e( “break” , “강력한 브레이크” ); } }
ManualCar
1 2 3 4 5 6 7 8 9 10 11 12 public class ManualCar extends Car{ @Override void play() { Log.e( “start” , “2단” ); Log.e( “operation” , “수동” ); } @Override void stopBreak() { super .stopBreak(); Log.e( “break” , “부드러운 브레이크” ); } }
*상위 클래스에게 공통적인 로직은 템플릿 메소드로 두고, 구체적인 클래스에서 스타일에 맞게 구현을 강제하기 위해 추상메소드를 사용하고, Hook 메소드를 두는 패턴을 템플릿 메소드 패턴 (Template Method Pattern) 이라고 한다.
참고
https://limkydev.tistory.com/81
정리 –
mvc – mvp – mvvm에 대해서 구현하기 전에 디자인 패턴에대해서 간단히 정리하고자 글을 작성하였다. 간단한게 하려했는데 이것도 꽤 오래걸린 느낌이다. 어쨋든 …
누군가에게 디자인패턴에 대하여 설명한다고 생각하고 정리해 보겠다.
디자인패턴은 프로그래밍 시 발생하는 다양한 문제상황에 대한 해결책이다.
또한 객체지향과 밀접하지만 객체지향에 속한 개념은 아니다.
생성, 구조, 행동으로 구분하여 설명할 수 있다.
생성이란 클래스의 인스턴스를 만드는것과 관련이있다.
대표적으로 싱글톤 패턴이 이에 속한다. 싱글톤 패턴이란 하나의 클래스에 단 하나의 인스턴스를 허용하는 패턴이다.
싱글톤 패턴을 사용하면 고정된 메모리영역에 하나의 인스턴스만 생성하기 때문에 메모리 낭비를 방지할 수 있다. 또한 인스턴스가 전역으로 사용될 수 있다는 장점이 있다.
메모리 영역을 고정한다는 점에서 너무 많이 사용해서는 않된다는 점을 기억해두어야 한다.
구조란 클래스와 인스턴스의 관계를 조정하고 맞춰가는 것이 목적이다.
대표적으로 어댑터가 이에 속한다. 어댑터는 상호간에 접근이 불가한 객체사이에서 연결해주는 역할을 한다.
안드로이드에서는 대표적으로 리사이클러뷰에서 어댑터 패턴을 발견할 수 있다.
특정 액티비티에 속한 리사이클러뷰에 더해질 아이템뷰를 뷰홀더에서 저장하는데 둘사이에 연관이 없어 접근이 불가함으로 어댑터 패턴을 활용하여 두 객체가 연결된다.
행동이란 클래스와 인스턴스가 동작하는 방식이나 소통하는 방식을 다루는 패턴이다.
대표적으로 템플릿 메소드가 있다. 템플릿 메소드는 특정 기능들을 모듈로 분류하고 몇몇 기능들은 상속할 자식 클래스가 위임하여 구현한다.
많이 들어본 단어들도 있고 생소한 단어들도 있어서 뒤죽박죽이라 아직 완벽히 정리가 되지는 않지만 mvc – mvp – mvvm 를 구현하면서 계속해서 디자인 패턴에 대한 이해를 확장해 나가야 할 것 같다.
디자인패턴에 관련한 내용과 객체지향에 대한 자세한 내용은 아래 링크에서 확인하자.
디자인패턴
https://ko.wikipedia.org/wiki/%EB%94%94%EC%9E%90%EC%9D%B8_%ED%8C%A8%ED%84%B4_(%EC%B1%85)
객체지향 설계
https://ko.wikipedia.org/wiki/SOLID_(%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5_%EC%84%A4%EA%B3%84)
참고
https://shoark7.github.io/programming/knowledge/what-is-design-pattern
https://lktprogrammer.tistory.com/187
그래서 MVC, MVP, MVVM 디자인패턴 이 뭔데?
kwang0
tl;dr
MVC (Model – View – Controller) Model 은 데이터, View 는 XML 파일, Controller 는 Activity MVP (Model – View – Presenter) Model 은 데이터, View 는 Activity, Presenter 는 Model 과 View 를 연결해주는 매개체 MVVM (Model – View – ViewModel) Model 은 데이터, View 는 Activity, ViewModel 은 Model 과 View 를 연결해주는 매개체
이번 블로그 포스팅에 사용한 소스코드는 Github 에서 확인할 수 있다. (tutorialapp/designpattern)
서론
이번에는 디자인 패턴인 MVC, MVP, MVVM 에 대해서 설명해 보려고 한다.
항상 혼자서 개발하다 보면 이런 생각에 빠지곤 한다. “내가 짜고 있는 코드가 적절한 것인가?”, “남들은 어떻게 짜고 어떻게 만들고 있을까?” , “더 나은 방법으로 제품을 만들고 싶은데 잘 모르겠네…” 이런 궁금증들을 풀기 위해 실무에서 디자인 패턴을 어떻게 접목시키고 있는지 알아보려고 한다.
처음 프로그래밍을 접한 사람들은 내가 만든 코드가 빌드되고 내가 원하는 대로 돌아가는 것에 커다란 희열감(?)을 느낀다. 하지만 바로 고통이 뒤따르게 되는데, 만약 내가 만든 코드에 예상치 못한 문제가 생겼을 때 어느 부분이 문제인지 찾기 더럽게 힘들고 힘들게 고친다 하더라도 이후에 다른 이슈가 생기게 되면 이런 X같은 상황이 무한 반복된다.
개인이 하는 프로젝트면 어느정도 예상되는 부분을 찾아서 고쳐나갈 수 있겠지만, 여러 사람과 협업해야 되는 상황, 큰 프로젝트를 관리해야 되는 상황에 맞딱뜨리게 되면 위와 같은 행위를 반복할 수 있을까? 정답은 [아니다] 일 것이다. 그렇다면 현업에서는 이러한 부분을 해결하기 위해 어떤 방식으로 코딩을 짤까?
이런 의문점이 들어 구글링을 하다보면 design pattern, mvc, mvp, mvvm, mvi 와 같은 키워드가 눈에 보일 것이다.
공통 용어
Model : 간단하게 말해서 데이터, 상태, 비즈니스 로직 이다. 프로젝트 내에서 쓰이는 데이터를 저장하고 또는 가공, 처리하는 역할을 한다. View 와 (Controller, Presenter, View Model) 에 의존적이지 않으므로 재사용할 수 있다.
더보기 public class DPModel { private int x, y; private boolean isPlaying; private boolean isFinished; public DPModel() { isPlaying = false; isFinished = true; } public void start() { isPlaying = true; isFinished = false; } public void stop() { isPlaying = false; isFinished = false; } public void reset() { isPlaying = false; isFinished = true; } public void move(int x, int y) { if(!isFinished) { this.x = x; this.y = y; } } public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } public boolean isPlaying() { return isPlaying; } public void setPlaying(boolean playing) { isPlaying = playing; } public boolean isFinished() { return isFinished; } public void setFinished(boolean finished) { isFinished = finished; } }
View : 간단하게 말해서 UI(User Interface) 이다. 다만 각 디자인 패턴에 따라 그 용도에 차이가 있다. 이 부분은 밑에서 자세히 설명하도록 한다.
MVC ( Model – View – Controller )
View : MVC 에서의 View 는 비교적 아무 역할도 없는 느낌이다. 그냥 여기에 이런 뷰가 있다 정도를 표현한다고 생각하면 된다. 뷰를 어떻게 표현하는지에 따라 난이도의 차이가 있긴 하겠지만 단순하게 XML 파일이라고 생각하면 된다.
Controller : 어플리케이션이 실행하게 되면 작동하는 컨트롤러이다. Model 과 View 를 서로 연결해주는 역할을 하고 유저에게 액션을 받아 처리하는 역할까지 맡게 된다. 단순하게 유저의 액션을 받아서 처리할 수 있는 액티비티, 프래그먼트라고 생각하면 된다.
더보기 @SuppressLint(“ClickableViewAccessibility”) public class MvcActivity extends AppCompatActivity implements View.OnClickListener, View.OnTouchListener { public static final String TAG = MvcActivity.class.getSimpleName(); private DPModel model; private TextView tv; private Button start, stop, reset; private RelativeLayout view; private View square_view; private int centerX, centerY; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_mvc); tv = (TextView) findViewById(R.id.d_p_tv); start = (Button) findViewById(R.id.d_p_linear_start); stop = (Button) findViewById(R.id.d_p_linear_stop); reset = (Button) findViewById(R.id.d_p_linear_reset); view = (RelativeLayout) findViewById(R.id.d_p_view); square_view = (View) findViewById(R.id.d_p_square_view); start.setOnClickListener(this); stop.setOnClickListener(this); reset.setOnClickListener(this); view.setOnTouchListener(this); model = new DPModel(); startVISIBLE(); setXYTextInit(); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.d_p_linear_start: start(); break; case R.id.d_p_linear_stop: stop(); break; case R.id.d_p_linear_reset: reset(); break; default: break; } } @Override public boolean onTouch(View v, MotionEvent event) { if(v.getId() == R.id.d_p_view) { if((event.getX() >= 0 && event.getX() <= view.getWidth() - square_view.getWidth()) && (event.getY() >= 0 && event.getY() <= view.getHeight() - square_view.getHeight()) && model.isPlaying()) { move(event); return true; } } return true; } private void start() { getCenter(); model.start(); stopVISIBLE(); } private void stop() { model.stop(); startVISIBLE(); } private void reset() { if(!model.isFinished()) { moveCenter(); setXYTextInit(); model.reset(); startVISIBLE(); } } private void move(MotionEvent event) { model.move((int) event.getX(), (int) event.getY()); moveSquare(); setXYText(model.getX(), model.getY()); } private void moveCenter() { model.move(centerX, centerY); Log.d("work??", "x : " + centerX); Log.d("work??", "y : " + centerY); moveSquare(); } private void moveSquare() { square_view.setX((float) model.getX()); square_view.setY((float) model.getY()); } private void getCenter() { centerX = (int) square_view.getX(); centerY = (int) square_view.getY(); } @SuppressLint("SetTextI18n") private void setXYTextInit() { tv.setText("START를 눌러주세요"); } @SuppressLint("SetTextI18n") private void setXYText(int x, int y) { tv.setText("X : " + x + ", Y : " + y); } private void startVISIBLE() { start.setVisibility(View.VISIBLE); stop.setVisibility(View.GONE); } private void stopVISIBLE() { start.setVisibility(View.GONE); stop.setVisibility(View.VISIBLE); } } MVC 에 대한 생각 생각 보다 기존에 본인이 작성한 코드와 별반 다르게 없다고 생각할 수 있다. MVC 의 이점이라고 하면, 완벽하게 모델과 뷰를 분리해준다는 점, 모델을 쉽게 테스트 할 수 있다는 점을 들 수 있다. (뷰는 단순한 XML 파일이기 때문에 테스트할 것이 거의 없다) 이와 대비해서 문제점도 확연하다. MVC 를 사용하게 되면, 컨트롤러가 안드로이드에 깊게 종속되므로 컨트롤러를 테스트하는데 문제가 있다. 또한 프로젝트를 수정하거나 새로운 기능을 추가할 때, 많은 코드가 전부 컨트롤러 즉 액티비티 및 프래그먼트에 모이게 되고 비대해 지게 되면서 유지보수에 어려움이 따른다. MVP ( Model - View - Presenter ) View : MVP 에서의 View 는 MVC 에서 Controller 에 있던 액티비티와 프래그먼트가 넘어왔다고 생각하면 된다. 또한 뷰를 관리해주는 인터페이스를 추가하여 Presenter 를 독립적으로 만들어준다. 더보기 @SuppressLint("ClickableViewAccessibility") public class MvpActivity extends AppCompatActivity implements MvpView, View.OnClickListener, View.OnTouchListener { public static final String TAG = MvpActivity.class.getSimpleName(); private TextView tv; private Button start, stop, reset; private RelativeLayout view; private View square_view; private int centerX, centerY; private MvpPresenter mvpPresenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_mvp); tv = (TextView) findViewById(R.id.d_p_tv); start = (Button) findViewById(R.id.d_p_linear_start); stop = (Button) findViewById(R.id.d_p_linear_stop); reset = (Button) findViewById(R.id.d_p_linear_reset); view = (RelativeLayout) findViewById(R.id.d_p_view); square_view = (View) findViewById(R.id.d_p_square_view); start.setOnClickListener(this); stop.setOnClickListener(this); reset.setOnClickListener(this); view.setOnTouchListener(this); mvpPresenter = new MvpPresenter(this); mvpPresenter.onCreate(); } @Override protected void onResume() { super.onResume(); mvpPresenter.onResume(); } @Override protected void onPause() { super.onPause(); mvpPresenter.onPause(); } @Override protected void onDestroy() { super.onDestroy(); mvpPresenter.onDestroy(); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.d_p_linear_start: mvpPresenter.start(); break; case R.id.d_p_linear_stop: mvpPresenter.stop(); break; case R.id.d_p_linear_reset: mvpPresenter.reset(centerX, centerY); break; default: break; } } @Override public boolean onTouch(View v, MotionEvent event) { if(v.getId() == R.id.d_p_view) { if((event.getX() >= 0 && event.getX() <= view.getWidth() - square_view.getWidth()) && (event.getY() >= 0 && event.getY() <= view.getHeight() - square_view.getHeight())) { mvpPresenter.move((int) event.getX(), (int) event.getY()); return true; } } return true; } @Override public void getCenter() { centerX = (int) square_view.getX(); centerY = (int) square_view.getY(); } @Override public void setPosition(int x, int y) { square_view.setX((float) x); square_view.setY((float) y); } @SuppressLint("SetTextI18n") @Override public void setXYTextInit() { tv.setText("START를 눌러주세요"); } @SuppressLint("SetTextI18n") @Override public void setXYText(int x, int y) { tv.setText("X : " + x + ", Y : " + y); } @Override public void startVISIBLE() { start.setVisibility(View.VISIBLE); stop.setVisibility(View.GONE); } @Override public void stopVISIBLE() { start.setVisibility(View.GONE); stop.setVisibility(View.VISIBLE); } } public interface MvpView { void getCenter(); void setPosition(int x, int y); void setXYTextInit(); void setXYText(int x, int y); void startVISIBLE(); void stopVISIBLE(); } Presenter : 기본적으로 Controller 와 같은 역할을 한다고 생각하면 된다. Controller 와 다른점이 있다면 뷰에 연결되는 것이 아니라 단순한 인터페이스라는 점이다. 이를통해 테스트 용이성 뿐만 아니라 모듈화/유연성 문제를 해결할 수 있다. 다만 한가지 제약사항이 있는데 그 어떤 안드로이드 API 도 참조해선 안된다. 이를 지키지 않는다고 큰 문제가 있지는 않지만 되도록 해당 제약사항을 따르는 방향으로 구성하는 편이 좋다. 더보기 public class MvpPresenter implements Presenter { public static final String TAG = MvpPresenter.class.getSimpleName(); private MvpView view; private DPModel model; MvpPresenter(MvpView view) { this.view = view; this.model = new DPModel(); } // 라이프 사이클 public void onCreate() { model = new DPModel(); view.startVISIBLE(); view.setXYTextInit(); } public void onPause() { } public void onResume() { } public void onDestroy() { } // 사각형 이동 관련 함수 @Override public void start() { view.getCenter(); model.start(); view.stopVISIBLE(); } @Override public void stop() { model.stop(); view.startVISIBLE(); } @Override public void reset(int centerX, int centerY) { if(!model.isFinished()) { moveCenter(centerX, centerY); view.setXYTextInit(); model.reset(); view.startVISIBLE(); } } @Override public void move(int x , int y) { if(model.isPlaying()) { model.move(x, y); moveSquare(); view.setXYText(model.getX(), model.getY()); } } @Override public void moveCenter(int centerX, int centerY) { model.move(centerX, centerY); moveSquare(); } @Override public void moveSquare() { view.setPosition(model.getX(), model.getY()); } } public interface Presenter { void start(); void stop(); void reset(int centerX, int centerY); void move(int x, int y); void moveCenter(int centerX, int centerY); void moveSquare(); } MVP 에 대한 생각 MVC 와 비교해보면 꽤나 코드가 깔끔해 졌다는 것을 구성만 보고도 알 수 있을 것이다. 이점이라고 하면, 뷰와 프레젠터가 1 : 1 대응으로 View 인터페이스를 구현했다면 Presenter 로직을 손 쉽게 테스트 할 수 있다. 다만 MVP 에도 문제점이 있는데, MVC 와 마찬가지로 프로젝트를 수정하거나 새로운 기능을 추가할 때, 많은 프리젠테이션 로직이 프레젠터에 모이게 되고 비대해 지게 되면서 유지보수에 어려움이 따른다. MVVM ( Model - View - View Model ) Model : MVC, MVP 와 동일하다. 다만, 기존 모델에 비즈니스 로직을 추가해주기 위해 MVVM 에만 SquareParams 라는 모델을 추가해 주었다. 더보기 public class SquareParams { private int x, y, w, h; public SquareParams() {}; public SquareParams(int x, int y, int w, int h) { this.x = x; this.y = y; this.w = w; this.h = h; } public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } public int getW() { return w; } public void setW(int w) { this.w = w; } public int getH() { return h; } public void setH(int h) { this.h = h; } } View : MVVM 에서의 View 는 MVC 에서 Controller 에 있던 액티비티와 프래그먼트가 넘어왔다고 생각하면 된다. 또한 가지 다른점은 데이터 바인딩을 위해 XML 을 적절히 변경해 주어야 한다. 추가로 build gradle(:app) 파일에 밑에 데이터 바인딩을 위한 코드를 집어넣어 주어야 한다. 이를 통해 뷰는 뷰모델에 의해 모델과 유연한 바인딩이 가능하게 된다. dataBinding { enabled = true } View Model : 뷰모델은 기본적으로 뷰에 종속되지 않는다. 다르게 말하면 종속시키면 안 된다. 뷰모델을 통해 사용할 모델을 래핑하고 뷰에 바인딩 시켜줄 옵져버블 데이터를 생성한다. 또한 뷰가 모델에 이벤트를 잘 전달할 수 있도록 BindingAdapter 을 준비한다. 더보기 @SuppressLint("ClickableViewAccessibility") public class MvvmViewModel extends BaseObservable implements ViewModel { public static final String TAG = MvvmViewModel.class.getSimpleName(); @Bindable public DPModel model = null; public int centerX = 0, centerY = 0; @Bindable public SquareParams squareParams = null; public MvvmViewModel() { this.model = new DPModel(); this.squareParams = new SquareParams(-1, -1, -1, -1); } // Here we implement delegate methods for the standard Android Activity Lifecycle. // These methods are defined in the Presenter interface that we are implementing. public void onCreate() { } public void onPause() { } public void onResume() { } public void onDestroy() { } @Override public void start(View view) { setParams(view); getCenter(); model.start(); setOnTouchListener(moveTouchListener); notifyPropertyChanged(BR.model); } @Override public void stop() { model.stop(); setOnTouchListener(emptyTouchListener); notifyPropertyChanged(BR.model); } @Override public void reset() { if(!model.isFinished()) { moveCenter(centerX, centerY); model.reset(); setOnTouchListener(emptyTouchListener); notifyPropertyChanged(BR.model); } } private void setParams(View view) { if(squareParams.getX() == -1 && squareParams.getY() == -1) { squareParams.setX((int) view.getX()); squareParams.setY((int) view.getY()); squareParams.setW(view.getWidth()); squareParams.setH(view.getHeight()); notifyPropertyChanged(BR.squareParams); model.setX(squareParams.getX()); model.setY(squareParams.getY()); } } private void getCenter() { centerX = (int) squareParams.getX(); centerY = (int) squareParams.getY(); } private void moveCenter(int centerX, int centerY) { model.move(centerX, centerY); notifyPropertyChanged(BR.model); } @Bindable public View.OnTouchListener onTouchListener; private View.OnTouchListener emptyTouchListener = null; private View.OnTouchListener moveTouchListener = new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if((event.getX() >= 0 && event.getX() <= v.getWidth() - squareParams.getW()) && (event.getY() >= 0 && event.getY() <= v.getHeight() - squareParams.getH())) { if(model.isPlaying()) { model.move((int) event.getX(), (int) event.getY()); } notifyPropertyChanged(BR.model); return true; } return true; } }; private void setOnTouchListener(View.OnTouchListener onTouchListener) { this.onTouchListener = onTouchListener; notifyPropertyChanged(BR.onTouchListener); } } @SuppressLint("ClickableViewAccessibility") public class MvvmBindingAdapter { public static final String TAG = MvvmBindingAdapter.class.getSimpleName(); @BindingAdapter({"touchListener"}) public static void setTouchListener(View self, View.OnTouchListener onTouchListener){ if (onTouchListener != null) self.setOnTouchListener(onTouchListener); } @BindingAdapter("moveSquare") public static void setSquareMove(View self, DPModel model) { self.setX((int) model.getX()); self.setY((int) model.getY()); } @SuppressLint("SetTextI18n") @BindingAdapter("stringResult") public static void getResult(TextView self, DPModel model) { if(model.isPlaying()) { self.setText("X : " + model.getX() + ", Y : " + model.getY()); } else { self.setText("START를 눌러주세요"); } } } public interface ViewModel { void start(View view); void stop(); void reset(); } MVVM 에 대한 생각 MVVM 을 사용하기 위해선 기본적인 안드로이드 구조와 MVVM 자체의 데이터 바인딩에 대한 이해도가 필요하다고 생각한다. 이점이라고 하면, 당연히 뷰에 대한 의존도가 전혀 없으므로 MVP 처럼 가상의 뷰를 만들 필요도 없이 데이터 변화를 추적하면서 테스트할 수 있다. 또한 ViewModel 과 View 의 종속성이 1 : n 관계이므로 그만큼 코드의 양을 줄일 수 있다고 볼 수 있다. MVVM 에도 문제점이 있는데, 프로젝트를 수정하거나 새로운 기능을 추가할 때, 추가되는 프리젠테이션 로직을 처리하기 위해 XML 이나 View Model, BindingAdapter 에 코드를 추가하게 되고 비대해 지게 되면서 유지보수에 어려움이 따른다. 결론 MVC, MVP, MVVM 디자인 패턴에 알아보았다. MVC, MVP, MVVM 패턴을 사용하는 것은 보인의 자유고 선택이다. 무엇이 무엇보다 더 좋다라고 하기에는 무리가 있지 않을까? 혹자는 "MVP 가 MVC 보다 좋고 MVVM 이 MVP 보다 좋다" 라고 말할 수 있겠지만, 혼자 개발하면서 페이지수가 2개인 앱을 만드는데 굳이 MVP, MVVM 를 이용해서 만들 필요는 없다고 생각한다. 그리고 MVP 가 좋은 상황이 있는 것이고 MVVM 을 사용하는게 좋은 상황이 있다고 생각된다. 물론 똑같은 뷰모델을 여러 뷰에서 사용하기 위해서는 당연히 MVVM 이 좋겠지만, 그렇지 않은 부분에서 까지도 MVVM 을 이용해서 코드를 짠다면 MVP 랑 다를 것이 없으니깐 말이다. 이후에는 MVC 패턴은 간단하니 제쳐두고 MVP, MVVM 패턴을 어떻게 활용하는지도 알아보도록 하자 내용이 잘 정리 되었는지 모르겠지만 이번 포스팅을 통해서 많은 사람들이 디자인 패턴에 대해 이해할 수 있고 지금껏 갖고 있던 궁금증을 풀 수 있었으면 좋겠다. 참조 https://academy.realm.io/kr/posts/eric-maxwell-mvc-mvp-and-mvvm-on-android/ https://github.com/ericmaxwell2003/ticTacToe https://medium.com/@jsuch2362/android-mvvm-%EC%9D%84-%EC%9C%84%ED%95%9C-databinding-34cd9be44c63
So you have finished reading the 안드로이드 디자인 패턴 topic article, if you find this article useful, please share it. Thank you very much. See more: 안드로이드 디자인 패턴 종류, 안드로이드 MVVM, 안드로이드 스튜디오 패턴 잠금, 안드로이드 MVC, 안드로이드 MVP 패턴 예제, 안드로이드 디자인 가이드, 안드로이드 MVP, MVVM, 안드로이드 MVP 구현