본문 바로가기
카테고리 없음

📱 Android에서 UI 없는 Fragment를 사용하는 이유와 실제 활용법

by 경이 Kyung I 2025. 5. 16.
반응형

Android 개발을 하다 보면 "프래그먼트는 UI를 담당하는 건데, 왜 생명주기만 쓰고 UI 없이 사용할까?"라는 의문이 들 수 있습니다. 저도 그런 의문에서 출발했고, 실제 권한 요청 처리 로직을 구현하다가 UI 없는 백그라운드 전용 프래그먼트를 사용해보면서 그 장점들을 알게 되었습니다.

이 글에서는 다음 내용을 다룹니다:

  • Fragment를 UI 없이 사용하는 이유
  • commit() vs commitNow()의 차이
  • add(fragment, TAG)를 꼭 써야 하는 이유
  • Fragment와 Activity 중 어떤 걸 선택해야 할까?
  • 전체 흐름 예제 코드

📌 문제의 시작: 권한 요청 처리

어떤 작업을 하려면 사용자에게 권한을 요청해야 합니다. 이 권한 요청을 깔끔하게 처리하려고 별도의 클래스를 만들고 싶었고, 이때 선택할 수 있는 방법은 다음과 같았습니다.

  1. Activity로 권한 요청을 처리하기
  2. 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 없는 프래그먼트는 안드로이드 앱의 조용한 해결사다."

 

반응형