현치비

안드로이드 아키텍쳐 컴포넌트(Android Architecture Components) - 1부 본문

Android/Android Library

안드로이드 아키텍쳐 컴포넌트(Android Architecture Components) - 1부

현CHIBI 2017. 8. 3. 12:30

Google IO 2017에서 가장 흥미로웠던 주제는 "안드로이드 아키텍쳐 컴포넌트" 였다.


개발자들은 MVC, MVP, MVVM등 여러가지 패턴을 사용했었었는데,


이제는 구글의 아키텍쳐 컴포넌트 권고사항을 많이 따르지 않을까 생각된다.


안드로이드 아키텍쳐 컴포넌트?


https://developer.android.com/topic/libraries/architecture/index.html


위 주소로 들어가 디벨롭 문서가 한번 읽어보는 걸 추천하고, 간단히 요약을 해보았다.


안드로이드 아키텍쳐 컴포넌트 (Android Architecture Components)


크게는 4가지로 구분을 할 수 있다.


1. Lifecycle

2. ViewModel

3. LIveData

4. Room


먼저 LifeCycle에 대해 알아보면, 


일단, 필자는 LifeCycle이 어떻게 동작하는지 안다.


LifeCycle (https://developer.android.com/guide/components/activities.html#Lifecycle)


1. Lifecycle?


class MyLocationListener {
   
public MyLocationListener(Context context, Callback callback) {
       
// ...
   
}

   
void start() {
       
// connect to system location service
   
}

   
void stop() {
       
// disconnect from system location service
   
}
}

class MyActivity extends AppCompatActivity {
   
private MyLocationListener myLocationListener;

   
public void onCreate(...) {
        myLocationListener
= new MyLocationListener(this, (location) -> {
           
// update UI
       
});
 
}

   
public void onStart() {
       
super.onStart();
        myLocationListener
.start();
   
}

   
public void onStop() {
       
super.onStop();
        myLocationListener
.stop();
   
}
}

위 MyLocationListener를 onStart()에서 실행하고, onStop()에서 중지하는 코드를 많이 넣는다.


위 MyLocationListener 클래스가 5개 액티비티에서 사용해야 한다면? 


5개 액티비티에 위와 같은 코드들을 넣어줘야 한다.


100개 액티비티에서 사용한다면?


1000개...?


그런데, 갑자기 onCreate()에서 실행하고, onDestory()에서 중지하라고 기획쪽에 바뀌었다고 한다.


그럼 모든 액티비티 코드를 들어가서 일일히 다 바꿔줘야 한다.


그런데? MyWifiListener가 생겼다.


onStart()에서 실행 onStop()에서 중지를 해야하는데, 1000개 액티비티에 또 다 추가해줘야 하는 상황!


이렇게 되면 onStart()와 onStop()에 코드량이 많아져서 가독성이 떨어지고, 굉장히 유연하지 못한 코드가 완성된다.


기존 안드로이드 개발자들은 어쩔 수 없이 위와같이 코드를 작성했다.


하지만!


이제는 위와 같은 코드에서 벗어날 수 있다.


public class MyObserver implements LifecycleObserver {
   
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
   
public void onResume() {
   
}

   
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
   
public void onPause() {
   
}
}
aLifecycleOwner
.getLifecycle().addObserver(new MyObserver());
LifecycleObserver를 상속받은 클래스를 LifecyclerOwner에 추가해주면 된다.

눈치껏 알겠지만,

LifecycleOwner가 Resume이 될때 onResume() 메서드가 불리고, 

LifecycleOwner가 Pause이 될때 onPause() 메서드가 불린다.

그렇다면 LifecycleOwner가 뭘까?

LifecycleOwner

LifecycleOwner는 인터페이스로 Lifecycle을 가질 수 있는 클래스에 구현하면 된다.


(Lifecycle을 가질수 있는 클래스(Activity, Fragment))


getLifecycle() 메서드를 통해 Lifecycle을 가져올 수 있다.


가져온 Lifecycle을 통해 현재 상태를 확인할 수 있다.


class MyLocationListener implements LifecycleObserver {
   
private boolean enabled = false;
   
public MyLocationListener(Context context, Lifecycle lifecycle, Callback callback) {
       
...
   
}

   
@OnLifecycleEvent(Lifecycle.Event.ON_START)
   
void start() {
       
if (enabled) {
           
// connect
       
}
   
}

   
public void enable() {
        enabled
= true;
       
if (lifecycle.getState().isAtLeast(STARTED)) {
           
// connect if not connected
       
}
   
}

   
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
   
void stop() {
       
// disconnect if connected
   
}
}


위 MyLocationListener에선 생성자 2번째 파라미터로 lifecycle을 받는다.


상태를 체크해서 명령을 내릴 수가 있다.


Activity와 Fragment에 onCreate, onStart, onResume 등 Lifecycle 메서드에 코드를 넣지 않아도 된다.


Lifecycle을 언제 쓰는게 좋을까? (Best pratices)


1. UI 컨트롤러(Activity와 Fragment)는 최대한 뷰에 데이터를 보여주는 용도로만 사용할 수 있다. (코드가 유연해지고 깔끔해진다.)


2. UI 컨트롤러와 데이터를 처리하는 부분을 나눌 수 있게 된다. (ViewModel을 쓰면 되는데, 2부에서 알아보자)


추가적으로, 현재는 LifecycleActivity나 LifecycleFragment를 써야하는데, 


Android Architecture Components가 정식적으로 릴리즈되면 


LifecycleOwner interface를 implements하면 된다고 한다.


필자는 솔직히 LocationListener를 사용할 때는 사용하지 않았고, 


Fragment에서 DialogFragment를 띄울 때, onSaveInstanceState 뒤에 Fragment를 띄우면 Exception이 발생한다.


그래서 현재 Fragment의 상태가 onStart인지 체크를 해서


맞다면 DialogFragment 실행


아니라면 lifecycle.addObserver()를 해서 Lifecycle.Event.ON_START가 됬을 때 

DialogFragment를 실행


위와 같은 방식을 사용했고, LocationListener는 LiveData를 썼는데, 


LocationListener는 솔직히 한 앱당 1개씩 존재하는 것이 맞다고 생각을 했고, 한 액티비티에서만 사용돼서 켰다 껐다 하는 성격이 


아닌 것으로 판단되어 LiveData를 사용했다.


LiveData는 추후에 알아보도록 하자.


이상 1부를 마친다.



Comments