Android 개발을 하다 보면 "프래그먼트는 UI를 담당하는 건데, 왜 생명주기만 쓰고 UI 없이 사용할까?"라는 의문이 들 수 있습니다. 저도 그런 의문에서 출발했고, 실제 권한 요청 처리 로직을 구현하다가 UI 없는 백그라운드 전용 프래그먼트를 사용해보면서 그 장점들을 알게 되었습니다.
이 글에서는 다음 내용을 다룹니다:
- Fragment를 UI 없이 사용하는 이유
- commit() vs commitNow()의 차이
- add(fragment, TAG)를 꼭 써야 하는 이유
- Fragment와 Activity 중 어떤 걸 선택해야 할까?
- 전체 흐름 예제 코드
📌 문제의 시작: 권한 요청 처리
어떤 작업을 하려면 사용자에게 권한을 요청해야 합니다. 이 권한 요청을 깔끔하게 처리하려고 별도의 클래스를 만들고 싶었고, 이때 선택할 수 있는 방법은 다음과 같았습니다.
- Activity로 권한 요청을 처리하기
- UI 없는 Fragment로 처리하기
이 중에서 저는 Fragment를 선택했습니다. 이유는 아래에서 설명하겠습니다.
⚠️ commit() vs commitNow() 차이
activity.supportFragmentManager.beginTransaction()
.add(fragment, TAG)
.commit() // 비동기 커밋
vs
activity.supportFragmentManager.beginTransaction()
.add(fragment, TAG)
.commitNow() // 동기 커밋
- commit()은 비동기 → fragment가 아직 attach되기 전 상태에서 return되므로 위험
- commitNow()는 동기 → 즉시 attach되며 이후 로직에서 안전하게 사용 가능
따라서 attachIfNeeded()처럼 fragment를 바로 사용해야 할 때는 반드시 commitNow()를 써야 합니다.
✅ .add(fragment, TAG)는 왜 꼭 필요할까?
supportFragmentManager.beginTransaction()
.add(fragment, TAG)
이걸 하지 않으면 fragment는 단순히 메모리 안의 객체일 뿐, FragmentManager에 등록되지 않아서 생명주기도 작동하지 않고 findFragmentByTag(TAG)로도 찾을 수 없습니다.
즉, "FragmentManager에 붙이지 않은 프래그먼트는 유령이다" 라고 이해하면 됩니다.
🧩 UI 없는 프래그먼트는 어떤 식으로 생명주기를 구현할까?
class CPSPermissionRequesterFragment : Fragment() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.d("CPSPermissionRequester", "onCreate")
requestPermissions()
}
private fun requestPermissions() {
// ActivityCompat.requestPermissions() 등 호출
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
): View? {
return null // UI 없음
}
}
이런 구조에서는 Fragment가 붙는 순간 onCreate()만으로 로직이 실행됩니다.
뷰를 만들지 않기 때문에 return null만 해주면 됩니다.
🤔 Activity로 처리해도 될까?
정답은 “가능은 하지만, 비추천”입니다.
항목 | Fragment | Activity |
생명주기 제어 | 부모 Activity와 연동됨 | 독립적이지만 UI 강제 |
사용자 경험 | 조용히 처리 가능 | 새 화면 뜨는 등 UX 거슬릴 수 있음 |
재사용성 | 여러 화면에 붙이기 쉬움 | 화면 단위로만 이동 가능 |
Jetpack 연동 | 공식 권장 (ex. registerForActivityResult 내부도 프래그먼트 기반) | 거의 사용 안 함 |
✅ 정리: 언제 Fragment, 언제 Activity?
목적 | 추천 방식 |
UI 없는 권한 요청, 백그라운드 로직 | ✅ Fragment (UI 없이) |
설정 화면, 독립적인 전환 화면 | ✅ Activity |
화면 전환 없는 재사용 가능한 로직 컴포넌트 | ✅ Fragment |
✍️ 결론
프래그먼트는 UI만을 위한 도구가 아닙니다.
Android 시스템의 생명주기를 활용할 수 있는 가벼운 백그라운드 로직 실행기로도 매우 유용합니다.
특히 권한 요청, ActivityResult 처리처럼 시스템과 연동되는 작업은 UI 없는 프래그먼트가 가장 적합합니다.
"UI 없는 프래그먼트는 안드로이드 앱의 조용한 해결사다."
댓글