안드로이드

[Android] 네비게이션(Navigation)에 대해 알아보자

코딩하는후운 2022. 9. 22. 13:59
반응형

[Android] 네비게이션(Navigation)에 대해 알아보자

# Navigation Component는 왜 등장 했을까?

기존 네비게이션 방식의 어려운 점들

  • Fragment Transaction(Lifecycle Dancing)
  • 상황마다 목적지가 다른 Up and Back Action
  • Passing Arguments
  • Deep Links
  • 위의 문제들로 인한 *Error-prone Boilerplate Code
Error-prone : 발생하기 쉬운 오류

 

# 왜 Navigation Component를 쓸까?

  • 우선 Navigation Component를 사용하면 여러 화면 (Fragment)를 하나의 Activity로 묶어서 그래프라는 개념으로 관리하게 된다.
    (Single Activity - Multi Fragment)
  • Fragment의 전환을 직접 Fragment Manager를 통해 해줘야 했지만, Navigation을 사용하면서 FragmentManager를 통한 화면 전환을 직접 할 필요가 없다.
    Up & Back에 대한 액션을 네비게이션 컴포넌트에게 위임한다.
  • 기본적으로 navigate() 메소드를 통해 화면 전환을 하게 되는데 popUpTo 옵션을 사용하여 특정 위치까지 되돌아갈 수 있고 popUpToInclusive 옵션을 통해 목적지 사이에 있는 프래그먼트를 날릴 수도 있다.
  • SharedElement Animation도 지원한다. 화면 전환이 매우 smooth하게 이루어지는 것.
  • SafeArgs를 사용하면 자동으로 생성된 코드 클래스를 통해 인자 전달 및 목적지 이동을 안전하게 할 수 있다.
  • LifecycleOwner로 Fragment를 사용하면 메모리 누수가 발생할 수 있다.
    LifecycleOwner로 ViewLifecycleOwner를 사용하면 된다.
  • 다음 목적지 인자 전달에는 Bundle || SafeArgs가 가능하지만, 이전 목적지로 돌아가게 되면 인자 전달 기능은 없다.
    이는 AAC ViewModel을 사용하여 Activity Scope내에서 인자 전달이 가능하다.
  • NavController.navigate()를 빠르게 2번 호출하면 illegalStateException이 발생한다.
    graph.xml내의 fragment에 종속된 Action을 Global Action으로 바꾸면 해결 된다.
    이 경우, Fragment가 2개 생성되는데 이를 RxJava의 debounce 연산자로 중복 이벤트를 방지할 수 있다.

# 장점

  • 프래그먼트의 트렌젝션 처리.
  • 올바르게 Up과 Back동작을 처리.
  • 화면전환에 대한 표준화된 애니메이션 리소스.
  • 딥 링크 구현 및 처리를 쉽게 할 수 있다.
  • Bottom Navigation과 같은 요소들을 최소한의 추가작업으로 구현.
  • Safe Args - 대상사이에서 데이터를 탐색하고 전달할때 안정성을 제공하는 Graph 플러그인.
  • ViewModel - Navigation Graph에 대한 ViewModel을 확인해 그래프 대상 사이에 UI 관련 데이터를 공유.

 

# Navigation 구성요소

  • Navigation Graph : 모든 Navigation 관련 정보가 하나의 중심 위치에 모여있는 XML 리소스 입니다.
    단순히 말해 사용자가 앱에서 갈 수 있는 모든 플로우를 보여주고 앱 내의 Fragment를 한눈에 확인 할 수 있습니다.
  • NavHost : Navigation Graph에서 대상을 표시하는 빈 컨테이너 입니다.
    대상 구성요소에는 프래그먼트 대상을 표시하는 기본 NavHost구현인 NavHostFragment가 포함 됩니다.
  • NavController : NavHost에서 App Navigation을 관리하는 객체입니다. NavController는 사용자가 앱 내에서 이동할 때 NavHost에서 대상 콘텐츠의 전환을 조종하는 역할을 합니다.

Navigation Graph에서 특정 경로를 따라 이동할지, 특정 대상으로 직접 이동할지 NavController에게 전달하고 NavController가 NavHost에 적절한 대상을 표시해주는 방식입니다.

 

 

반응형