IT_Programming/Android_Java

[펌] 안드로이드 아키텍처 가이드와 아키텍처 컴퍼넌트에 대해 확인해 보세요.

JJun ™ 2017. 6. 27. 21:13



 출처

 : https://developers-kr.googleblog.com/2017/06/android-and-architecture.html 

 

 예제 프로젝트

 : https://github.com/googlesamples/android-architecture-components

   android-architecture-components-master.zip




<블로그 원문은 여기에서 확인하실 수 있으며, 블로그 번역 리뷰는 김태호(Google)님이 참여해 주셨습니다.>



Android 운영체제는 광범위한 기기와 폼 팩터에서 원활히 실행되는 앱을 빌드하기 위한 강력한 기반을 제공합니다.
하지만 개발자들은 복잡한 수명 주기 및 권장 앱 아키텍처 결여와 같은 문제로 인해 강력한 앱을 작성하기가 어렵다는 의견을 피력해왔습니다.


그래서 우리는 강력한 앱을 더욱 쉽고 재미있게 작성할 수 있게 만들어 개발자가 혁신을 꾀할 수 있는 영역에 집중하도록 뒷받침해야 합니다. 오늘 우리는 아키텍처 컴포넌트 프리뷰와 함께 Android 앱 아키텍처에 대한 가이드를 발표하려고 합니다. 우리는 쓸데없이 시간을 낭비하는 대신 인기 있는 Android 라이브러리를 통해 이룬 성과를 인정하고 있습니다.




처방이 아닌 의견


우리는 Android 애플리케이션을 작성할 수 있는 방법이 한 가지가 아니라는 점을 잘 알고 있습니다.  우리가 제공하는 것은 Android의 독특한 상호 작용 방식과 가장 잘 연동되는 Android 애플리케이션의 설계에 도움이 될 수 있는 일련의 지침입니다. Android 프레임워크에는 액티비티와 같이 OS와의 연결 지점을 처리하는 잘 정의된 API가 있지만, 이러한 API는 개발자 애플리케이션의 진입점일 뿐, 애플리케이션 아키텍처를 이루는 기본 구성 요소는 아닙니다. 프레임워크 구성 요소는 데이터 모델을 UI 구성 요소에서 분리하도록 강제하지 않으며, 수명 주기와 상관없이 데이터를 유지할 수 있는 명확한 방법을 제공합니다.


기본 구성 요소


Android 아키텍처 컴포넌트는 온전한 앱 아키텍처를 구현하기 위해 함께 작동하는 동시에, 개발자가 겪는 문제점을 개별적으로 해결해주기도 합니다. 최초로 제공되는 이러한 구성 요소들을 사용하면 다음과 같은 이점이 있습니다.

  • 액티비티와 프래그먼트의 생명주기를 자동으로 관리하여 메모리 및 리소스 누수 방지
  • SQLite 데이터베이스에 자바 데이터 객체 유지


Lifecycle Components


새로운 
Lifecycle-aware 컴포넌트는 애플리케이션의 핵심 구성 요소를 수명 주기 이벤트에 연결하는 구성체를 제공하므로 명시적인 종속성 경로를 제거해 줍니다.

일반적인 Android 관찰 모델은 onStart()에서 관찰을 시작하고 onStop()에서 관찰을 중지합니다.  이는 아주 간단한 얘기로 들리지만, 한 번에 여러 개의 비동기 호출이 수행되는 경우가 종종 있으며, 이러한 비동기 호출은 모두 구성 요소의 수명 주기를 관리하는 작업을 담당합니다.  그래서 경계 조건을 놓치기에 십상입니다.  따라서 Lifecycle Components가 도움이 될 수 있습니다.


Lifecycle, LifecycleOwner  LifecycleObserver


이 모든 구성 요소의 핵심 클래스는 
Lifecycle입니다.
이 클래스는 수명 주기 이벤트의 열거형과 함께 
현재 수명 주기 상태의 열거형을 사용하여 관련 구성 요소에 대한
수명 주기 상태를 추적합니다.


수명 주기 상태 및 이벤트



LifecycleOwner는 getLifecycle() 메서드에서 Lifecycle 객체를 반환하는 인터페이스인 반면, LifecycleObserver는 해당 메서드에 주석을 추가함으로써 구성 요소의 수명 주기 이벤트를 모니터링할 수 있는 클래스입니다. 이를 모두 결합하면 수명 주기 이벤트를 모니터링하고 현재 수명 주기 상태를 쿼리할 수 있는 Lifecycle-aware 컴포넌츠를 생성할 수 있습니다.

public class MyObserver implements LifecycleObserver {
  public MyObserver(Lifecycle lifecycle) {
    // Starts lifecycle observation
    lifecycle.addObserver(this);
   ...
  }
  public void startFragmentTransaction() {
     // Queries lifecycle state
     if (lifecycle.getState.isAtLeast(STARTED)) {
        // perform transaction
     }
  }
  // Annotated methods called when the associated lifecycle goes through these events
  @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
  public void onResume() {
  }
  @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
  public void onPause() {
  }
}
MyObserver observer = new MyObserver(aLifecycleOwner.getLifecycle());


LiveData


LiveData는 식별 가능한 수명 주기 인식 데이터 홀더 클래스입니다.
UI 코드는 
LifecycleOwner와 연결된 기본 데이터의 변경 사항을 구독하고 LiveData는 다음 사항을 확인합니다.

  • 수명 주기가 활성 상태(STARTED 또는 RESUMED)인 동안 관찰자가 데이터에 대한 업데이트를 가져옴
  • LifecycleOwner가 제거될 때 관찰자가 제거됨
  • LifecycleOwner가 구성 변경으로 인해 다시 시작되거나 백 스택에서 다시 시작되는 경우 관찰자가 최신 데이터를 가져옴


이는 메모리 누수를 일으키는 많은 경로를 제거하는 데 도움이 되고 중지된 액티비티에 대한 업데이트를 방지함으로써 충돌을 줄여 줍니다.

LiveData는 Fragment 또는 Activity와 같은 수명 주기 소유자와 연결된 많은 리스너에 의해 관찰될 수 있습니다.



ViewModel


ViewModel은 Activity 또는 Fragment에 대한 UI 데이터를 포함하는 도우미 클래스이며, UI 컨트롤러 로직과 데이터 보기 소유권을 분리하는 역할을 합니다. ViewModel은 구성 변경으로 인해 Activity/Fragment가 제거되고 다시 생성되는 경우를 포함하여 해당 Activity/Fragment의 범위가 활성 상태인 동안 유지됩니다. 이를 통해 ViewModel은 다시 생성된 활동 또는 프래그먼트 인스턴스에서 UI 데이터를 사용 가능하도록 할 수 있습니다. LiveData를 사용하여 ViewModel 내에 저장된 UI 데이터를 래핑하면 데이터가 인식 가능한 수명 주기 인식 홈에 제공됩니다. LiveData는 알림과 관련된 사항을 처리하는 반면, ViewModel은 데이터가 적절하게 유지되도록 합니다.



데이터 지속성(Persistence)



Android 아키텍처 컴포넌트는 Room 라이브러리를 사용하여 데이터 지속성을 단순화하기도 합니다. Room은 SQLite를 완벽히 활용하면서 원활한 데이터베이스 액세스를 지원하는 객체 매핑 추상화 계층(object-mapping abstraction layer)을 제공합니다.

핵심 프레임워크는 원시 SQL 콘텐츠 작업을 위한 내장형 지원 기능을 제공합니다. 이러한 API는 강력하기는 하지만 상당히 낮은 수준이므로 사용하는 데 상당한 시간과 노력이 필요합니다.

  • 원시 SQL 쿼리에 대해서는 컴파일 시간 검증 작업이 수행되지 않습니다.
  • 스키마가 바뀜에 따라 영향을 받는 SQL 쿼리를 수동으로 업데이트할 필요가 있습니다. 이 과정은 시간이 오래 걸리고 오류가 발생하기 쉬울 수 있습니다.
  • SQL 쿼리와 자바 데이터 객체 간에 변환하려면 상당량의 상용구 코드를 작성해야 합니다.


Room은 SQLite를 통해 추상화 계층을 제공하는 동시에 이러한 문제도 해결해 줍니다.



데이터베이스, 엔터티 및 DAO


Room에는 다음과 같은 세 가지 주요 구성 요소가 있습니다.

  • 엔터티 - 단일 데이터베이스 행에 대한 데이터를 나타내며, 주석이 추가된 자바 데이터 객체를 사용하여 생성됩니다. 엔터티는 각각 자체적인 테이블에 유지됩니다.
  • DAO(데이터 액세스 객체) - 데이터베이스에 액세스하는 메서드를 정의하며 주석을 사용하여 SQL을 각 메서드에 연결합니다.
  • 데이터베이스 - 주석을 사용하여 엔터티 및 데이터베이스 버전의 목록을 정의하는 홀더 클래스입니다. 이 클래스 콘텐츠는 DAO의 목록을 정의합니다. 또한, 기본 데이터베이스 연결을 위한 기본 액세스 지점이기도 합니다.


Room을 사용하려면 엔터티로 유지할 자바 데이터 객체에 주석을 지정하고 이러한 엔터티를 포함하는 데이터베이스를 생성한 후, 데이터베이스를 액세스 및 수정하기 위한 SQL로 DAO 클래스를 정의하세요.

@Entity
public class User {
    @PrimaryKey
    private int uid;
    private String name;
    // Getters and Setters - required for Room
    public int getUid() { return uid; }
    public String getName() { return name; }
    public void setUid(int uid) { this.uid = uid; }
    public void setName(String name) { this.name = name; }
}
@Dao
public interface UserDao {
    @Query("SELECT * FROM user")
    List getAll();
    @Insert
    void insertAll(User... users);
}
@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
    public abstract UserDao userDao();
}



앱 아키텍처에 대한 가이드


아키텍처 컴포넌트는 독립 실행형으로 설계되었지만, 효과적인 앱 아키텍처에 통합되는 경우 가장 효과적입니다.
오늘 우리는 아키텍처 컴포넌트를 사용하여 강력하고 테스트 가능한 모듈식 앱의 빌드 방법을 보여 주는 
앱 아키텍처에 대한 가이드를 발표하고자 합니다. 이 가이드의 주요 목표는 다음 세 가지입니다.

  •  Android 앱 개발에 적용되는 원칙 정의 
  • 이러한 원칙에 부합하는 앱 아키텍처 설명 
  • 아키텍처 컴포넌트를 사용하여 아키텍처를 구현하는 방법 소개 


이러한 문제로 고군분투했던 모든 개발자들은 이 가이드를 읽어볼 것을 권장합니다. 기존 앱 아키텍처에 만족하고 있더라도 이 가이드에서 유용한 원칙과 통찰력 있는 정보를 확인할 수 있을 것입니다.



시작에 불과합니다.


우리는 앞으로도 계속해서 뚝심을 가지고 Android 개발자가 애플리케이션을 설계할 때 더욱 손쉽게 정확한 선택을 할 수 있도록 새로운 아키텍처 컴포넌트를 내놓을 계획입니다. 우리는 모두 강력한 Android 앱 개발 작업을 더욱 쉽고 재미있게 만들기 위해 함께 노력하고 있으므로, 이 프리뷰를 사용해 보시고 활발하게 피드백해주시면 고맙겠습니다.

Android 아키텍처에 대한 자세한 내용은 다음에서 확인할 수 있습니다.




android-architecture-components-master.zip
0.71MB