마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

Navigation Component 이제 사용해도 될까요?

0 추천
예전에 Bottom Navigation 구현 관련해서 질문을 드린적 있는데

그때 받은 답변이 Navigation Component가 간단한 화면전환하기에는 좋지만 복잡해지면 너무 문제가

많고, NavController의 화면전환이 show/hide 형식이 아니라 replace형식이기때문에

화면전환후에 돌아올때 뷰,데이터의 상태를 직접 수동으로 구현해줘야하고 버그 등등으로

FragmentManager로 show/hide 를 이용하라고 답변을 들었고

내비게이션 컴포넌트를 많이 비추천하셨습니다.

 

제가 프래그먼트매니저와 show/hide를 이용해서

A B C 바텀 메뉴에서  B 프래그먼트 화면으로 이동후 이 B화면에서 화면의 버튼을 통해

다른 D 프래그먼트로 전환하는 것을 구현하고 있는데,

 

 전환후에 다른 메뉴로 갔다가 다시 돌아오면 뷰, 데이터가 유지가 되어야하는데 아직 미숙해서

구현을 잘못해서 그런지 유지가 되지 않습니다.. 더 해봐야하겠지만 막막하기두하구요.

 

그러다가 오늘 다른것을 구글링하다가

https://developer.android.com/jetpack/androidx/releases/navigation#version_240_2

 

이것을 보았는데 여기보니까 이게 그 화면전환시에 뷰 상태 유지에 관한 내용아닌가요..?

이것만 보면 사용해도 될지 아니면 여전히 아직도 추천안하시는지 궁금합니다.

화면전환이야 nav_graph와 host가 있으니 제가 걱정할필요는 없을것같기두 하구요..
codeslave (3,940 포인트) 님이 2021년 6월 11일 질문

1개의 답변

0 추천
현재 해당 라이브러리와 프레그먼트 라이브러리의 최근 개발 버전이 님이 말씀하시는 multi stack을 지원하기 위한 코드를 추가했습니다. 아직 개발 버전이라 프로덕션에 사용하기에는 좀 그렇지만, 다운받아서 테스트해 보시고 원하는 동작을 한다면, 정식 릴리즈 될 때까지 기다리시거나 아니면 alpha 버전을 사용해도 무방하시면 사용하시면 될 것 같아요. Jetpack말고도 해당 기능을 지원하는 잘 알려진 다른 라이브러리들도 여럿 있습니다. Simplestack같은. 아니면 그냥 FragmentManager만 사용하셔도 대부분은 사실 충분합니다.

참고로, 아래 링크에 가시면 유틸리티 클래스가 있습니다.
https://github.com/techyourchance/android-architecture-course/tree/master/app/src/main/java/com/techyourchance/mvc/screens/common/fragmentframehelper

사실 대부분의 업무용 앱은 위의 링크에 있는 FramentFrameHelper 안의 메소들만 잘 사용하시면 충분하다고 생각합니다. FragmentFrameHelper 같은 클래스를 바로 사용하기 보다는 Navigation을 관리하는 클래스를 하나 만드셔서 여기서 모든 Navigation 을 관리하도록 하는게 코드를 깨끗하고 관리하기 좋게 만드는 방법입니다. Jetpack Navigation 을 사용하더라도 해당 라이브러리가 어딘가로 이동하는 기능만 제공하기 때문에 다시 이런 식으로 내 앱에서 Navigation의 흐름을 관리하는 클래스가 다시 필요해집니다.

한가지 예로, 로그인 화면으로 이동할 때,

Navigation Compoent: findNavController.navigate(R.id.loginFragment)

My wrapper class: myNavigator.goToLogin()

바로 Navigation Component를 프레그먼트에 바로 사용하는 것보다는 wrapper class 처럼, 실제 구현코드를 감추는게 훨씬 재사용성이 뛰어납니다. 나중에 Navigation Component를 다른 것으로 교체해야하는 상황이 되거나 하면 훨씬 더 그렇죠. 왜냐하면 첫번째는 내가 코드에 대한 컨트롤이 전무하지만, 두번째의 경우는 어느정도의 컨트롤을 내가 할 수 있기 때문입니다. Navigation Component를 사용했는지, 다른 걸 사용했는지 사실 이 코드를 호출하는 입장에서는 상관이 없기 때문입니다.

개인적으로는 새로운 프로젝트을 한다면 Navigation Component는 굳이 사용하지는 않을 것 같습니다. (순전히 개인적인 생각입니다.) 물론 multi stack이 잘 지원된다면 고려해 볼만은 합니다만.

결론은, 딱히 정답은 없습니다. 님의 요구사항에 맞게 선택하시면 될 것 같아요. 다만, 잠정적인 문제점을 알고 있다면, 당혹스럽지 않겠죠.
spark (225,780 포인트) 님이 2021년 6월 11일 답변
spark님이 2021년 6월 11일 수정
...