MVC 패턴과 MVVM의 가장 큰 차이점은 '데이터 바인딩' 이라고 할 수 있다.
간단하게 MVVM에 대해 살펴 보자.
MVVM
- View : 인터페이스 (UI)
- Model : 데이터베이스
- ViewModel : View와 커맨드 또는 데이터 바인딩으로 연결, Model 과 데이터를 주고 받음.
ViewModel 을 통해 클래스들의 의존성을 낮추며 생명주기와 관련된 문제들 (화면회전 등)을 해결할 수 있다.
아래는 안드로이드 스튜디오에서 기본적으로 제공하는 navigation drawer 액티비티를 생성하면 제공된 기본 구조이다.
fragment에서는 ViewModel을 관찰(observe)하고 있다가, 데이터 변경시 UI를 업데이트한다.
아주 간단하게 MVVM 패턴을 살펴보았고, 데이터바인딩을 알아보자
안드로이드 공식 개발 문서이다. 가장 아래 줄만 보면된다.
즉, findViewById()는 UI 프레임워크 메서드로서, 위젯의 속성을 결합할 때 사용한다. 데이터바인딩을 사용하면 이러한 코드를 삭제하여 코드를 '단순화' 시킬 수 있고, 덕분에 '유지관리'가 쉬워진다.
현재 졸업작품 애플리케이션에 데이터바인딩을 적용 중이며, 코드가 훨신 깔끔해졌다.
어떻게 사용하는가?
1. 먼저, build.gradle(app)에 dataBinding을 enable 시키는 코드 작성
android {
...
dataBinding {
enabled = true
}
...
}
2. 그다음, 바인딩시키고자 하는 layout xml 파일을 편집
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="Tab2Fragment"
type="com.example.mymobil.operate.music.Tab2Fragment" />
</data>
전체 (최상위)에 <layout>으로 래핑한다. 그리고 위 코드처럼 바로 하위 부분에,
<data>
<variable
name="Tab2Fragment"
type="com.example.mymobil.operate.music.Tab2Fragment" />
</data>
를 넣는다. type은 본 xml과 바인딩하는 java 파일을 기입하고, name은 결합 표현식에서 사용한다.
3. java 파일 작성
Activity 경우엔
private FragmentOperateTab2Binding binding;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
binding=DataBindingUtil.setContentView(this,R.layout.fragment_operate_tab2);
binding.setActivity(this);
}
fragment일 경우엔
private FragmentOperateTab2Binding binding;
@Override
public View onCreateView(
@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
binding = DataBindingUtil.inflate(inflater, R.layout.fragment_operate_tab2, container, false);
binding.setTab2Fragment(this);
return binding.getRoot();
}
* 바인딩클래스 (FragmentOperateTab2Binding)는 자동으로 생성되는 클래스.
이름은 바스칼 표기법으로 작성되는데,
fragment_operate_tab2.xml -> FragmentOperateTab2Binding
이런식으로 생성이 됨
4. 클릭 이벤트 함수 작성
public void OnClickStart1(View view) {
start(R.raw.a);
}
5. xml에서 위젯 클릭 시 발생할 이벤트 함수 연결
<Button
android:id="@+id/btnStart1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="@{Tab2Fragment::OnClickStart1}"
android:text="재생" />
android:onClick="@{Tab2Fragment::OnClickStart1}" 이런식으로 1에서 작성한
name="Tab2Fragment"을 사용한다.
'프로그래밍 > App 개발' 카테고리의 다른 글
[android] MVVM의 편리함 (20.05.28 깨달은 점) (0) | 2020.08.06 |
---|---|
[android] FCM 푸시 (node.js, android) (0) | 2020.08.06 |
[android] foreground service 예제 (0) | 2020.08.06 |
[android] 내 위치 sms 전송하기 (카카오맵) (0) | 2020.08.06 |
[android] 카카오맵 api 오류 정리 (0) | 2020.08.06 |