서론
지난 포스팅에 Jetpack navigation에 대해 정리해 보았다. 오늘은 navigation 사용 시 데이터 전달에 활용되는 Safe Args에 대해 정리해보려 한다.
이전 포스팅은 아래 내용 참고해주세요🤗
https://ystech.tistory.com/entry/Android-Jetpack-Navigation%EC%97%90-%EB%8C%80%ED%95%B4
[Android] Jetpack Navigation에 대해
서론 Android에서 자주 사용되는 Jetpack Navigation에 대해 정리해보려 한다. 기존 화면 전환 시 intent, transaction을 사용하지만, 앱 구성이 복잡해질수록 코드도 복잡해질 수 있다. 화면 구성 및 UI 전환
ystech.tistory.com
Safe Args란?
Safe Args는 Android 앱에서 안전하게 탐색 그래프에 전달되는 인수를 처리하는 라이브러리이다. Android Jetpack 라이브에 속하며, navigation과 함께 사용된다.
Safe Args의 장점
- 안전한 타입 지정 : SafeArgs는 컴파일 타임에 안전성을 제공하여 전달되는 인수의 유형을 확인한다. 이는 잘못된 유형의 데이터가 전달되는 것을 방지하여 실행 시 예외를 방지한다.
- 자동으로 생성된 클래스 : 안드로이드 스튜디오에서 SafeArgs 플러그인을 활용하여, 네비게이션 그래프에서 전달되는 인수를 기반으로 자동으로 생성된 클래스를 생성할 수 있다. 이 클래스를 사용하여 탐색 그래프 간의 인수 전달을 처리할 수 있다.
- 보일러플레이트 코드 감소 : SafeArgs를 사용하면 직접 번들링하고 추출하는 번거로운 코드를 작성할 필요가 없으므로 보일러플레이트 코드의 양을 줄일 수 있다.
- IDE 지원 : SafeArgs는 안드로이드 스튜디오의 지원을 받으며, 자동 완성 및 오류 검사와 같은 편의 기능을 제공한다.
인수 유형
유형 | app:argType 문법 | 기본값 지원 | 경로에서 처리여부 | Null 허용 여부 |
정수 | app:argType="integer" | O | O | X |
Float | app:argType="float" | O | O | X |
Long | app:argType="long" | O - 기본값은 L로 끝나야함(ex : "10L") | O | X |
Boolean | app:argType="boolean" | O - true/false | O | X |
문자열 | app:argType="string" | O | O | O |
리스트 참조 | app:argType="reference" | O - 기본값은 @resourceType/resourceName 이나 'O' 이어야 함 | O | X |
Parcelable | app:argType="<type>" type은 Parcelable의 정규화된 클래스 이름 |
기본값 @null 지원 | X | O |
Serializable | app:argType="<type>" type은 Serializable 정규화된 클래스 이름 |
기본값 @null 지원 | X | O |
Enum | app:argType="<type>" type은 enum의 정규화된 이름 |
O - 기본값은 정규화되지 않은 이름과 일치해야함 (ex : SUCCESS가 MyEnum.SUCCESS 로 일치해야함) | X | X |
인수 유형이 null 값을 지원하는 경우 android:defaultValue="@null"을 사용하여 기본값을 null로 선언할 수 있다.
Sample
Project build.gradle
plugins {
id 'androidx.navigation.safeargs.kotlin' version '2.5.3' apply false
}
앱 모듈 buld.gradle
plugins {
id 'androidx.navigation.safeargs.kotlin'
}
navigation_graph.xml (사용하는 navigation xml 파일)
<fragment
android:id="@+id/homeFragment"
android:name="com.soo.sample_saa_project.view.fragment.HomeFragment"
android:label="HomeFragment" >
<action
android:id="@+id/action_homeFragment_to_webViewFragment"
app:destination="@id/webViewFragment"
app:popEnterAnim="@anim/fade_in"
app:popExitAnim="@anim/fade_out" />
</fragment>
<fragment
android:id="@+id/webViewFragment"
android:name="com.soo.sample_saa_project.view.fragment.WebViewFragment"
android:label="WebViewFragment" >
<argument
android:name="url"
app:argType="string"
android:defaultValue=""
/>
</fragment>
위와 같이, 데이터를 전달받을 fragment에 argument 추가 및 action을 설정해 준다.
WebviewFragment
// Safe Args를 통해 전달된 데이터 받기
val args: WebViewFragmentArgs by navArgs()
val url = args.url // safe args url 받음
위와 같이 args를 통해 데이터를 전달받아 사용한다.
마치며
오늘은 navigation 데이터 전달에 활용되는 safe args에 대해 정리해 보았다. 기존 Intent, Bundle보다 안정성도 있고 비교적 간단하게 작성할 수 있다는 장점이 있었다. 또한, 기본형뿐만 아니라 data class로 정리한 데이터 모델도 전달할 수 있어 실제 프로젝트에서 다양하게 활용될 수 있다. navigation을 사용하는 프로젝트에서는 빠질 수 없는 개념이므로 확실하게 알아두고 사용해야 될 것 같다😊
전체 코드는 아래 참고 부탁드립니다.
https://github.com/pparksoo11/Single_Activity_Architecture_Sample
GitHub - pparksoo11/Single_Activity_Architecture_Sample: SAA + 클린 아키텍처 + MVVM + Hilt 등을 활용한 예제
SAA + 클린 아키텍처 + MVVM + Hilt 등을 활용한 예제. Contribute to pparksoo11/Single_Activity_Architecture_Sample development by creating an account on GitHub.
github.com
Reference
https://developer.android.com/guide/navigation/use-graph/safe-args?authuser=2&hl=ko
Safe Args | Android 개발자 | Android Developers
이 페이지는 Cloud Translation API를 통해 번역되었습니다. Safe Args 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 대상 간 이동을 위해 Safe Args Gradle 플러그인을
developer.android.com
https://developer.android.com/guide/navigation/use-graph/pass-data?hl=ko
대상 간 데이터 전달 | Android 개발자 | Android Developers
이 페이지는 Cloud Translation API를 통해 번역되었습니다. 대상 간 데이터 전달 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 탐색을 사용하면 대상 인수를 정
developer.android.com