Fragment: 개념, Android의 프래그먼트 및 FragmentManager

저자: IT Sectr 게시일: 2026-02-22 읽는 시간: 7 분

Fragment는 Activity에 포함되고 FragmentManager를 통해 관리되는 Android의 재사용 가능한 UI 구성 요소입니다. 각 프래그먼트는 고유한 생명주기, 레이아웃 및 상태를 가집니다. Fragment는 다양한 화면 크기에 대한 적응과 코드 재사용을 단순화합니다. 자세한 내용은 Google 공식 가이드를 참조하세요.

주요 포인트

  • Fragment — Activity 내에서 자체 생명주기와 레이아웃을 가진 UI 구성 요소
  • FragmentManager — 프래그먼트 트랜잭션과 백 스택을 관리하는 클래스
  • FragmentTransaction — 프래그먼트 추가, 교체 또는 제거를 위한 원자적 연산
  • Jetpack Fragment — Android 1.6(API 4)까지의 하위 호환성을 위한 라이브러리
  • ViewModel — 하나의 Activity 내에서 프래그먼트 간 데이터 교환을 위한 공유 구성 요소

Fragment란?

Fragment는 Activity 내에서 화면의 일부를 나타내는 모듈식 Android 사용자 인터페이스 구성 요소입니다. Fragment는 자체 레이아웃을 관리하고, 생명주기 이벤트를 처리하며, 상태를 저장할 수 있습니다. 모듈성 덕분에 하나의 프래그먼트를 다른 Activity와 다른 기기에서 사용할 수 있습니다.

Fragment API는 태블릿을 지원하기 위해 2011년 Android 3.0(Honeycomb, API 11)에서 등장했습니다. 그 이전에는 개발자가 휴대폰과 태블릿용으로 별도의 Activity를 만들어야 했습니다. Fragment는 독립적인 블록으로 화면을 조립할 수 있게 했습니다. 2019년 Google은 API 4까지의 하위 호환성을 가진 Jetpack Fragment 라이브러리를 출시했습니다.

Google(2026)에 따르면, Google Play 앱의 80%가 어떤 형태로든 Fragment를 사용합니다. Jetpack Fragment 라이브러리는 Google Play Services를 통해 100억 회 이상 다운로드되었습니다. Fragment는 Jetpack Compose 시대에도 Android 아키텍처의 핵심 구성 요소로 남아 있습니다.

Fragment 생명주기

Fragment의 생명주기는 호스트 Activity의 상태에 의존하기 때문에 Activity보다 더 복잡합니다. Fragment는 Activity와 동일한 상태를 거치지만 자체 콜백(onAttach, onCreateView, onViewCreated, onActivityCreated, onDestroyView, onDetach)을 추가합니다.

Fragment 콜백Activity 해당목적
onAttachonCreate 전Fragment가 Activity에 연결됨
onCreateonCreateUI 외 데이터 초기화
onCreateViewonCreateinflater를 통한 레이아웃 생성
onViewCreatedonCreate뷰 생성 후 UI 요소 바인딩
onDestroyViewonDestroy뷰 제거, UI 리소스 해제
onDetachonDestroyFragment가 Activity에서 분리됨

Fragment와 Activity 생명주기 비교

Fragment 생명주기의 주요 차이점은 onCreate와 onDestroy 사이에 onCreateView와 onDestroyView가 호출된다는 것입니다. Fragment는 UI 없이도 존재할 수 있습니다(onCreateView가 null을 반환하는 경우). Activity 재생성 후 FragmentManager가 자동으로 프래그먼트를 복원합니다.

FragmentManager 및 트랜잭션

FragmentManager는 Activity에서 프래그먼트를 관리하는 중앙 클래스입니다. 프래그먼트 추가, 제거, 교체, 백 스택 관리 및 상태 복원을 담당합니다. FragmentManager는 supportFragmentManager(AndroidX) 또는 fragmentManager(이전 API)를 통해 사용할 수 있습니다.

kotlin
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 프래그먼트가 아직 추가되지 않음 — 생성 중
        if (savedInstanceState == null) {
            val transaction = this.supportFragmentManager
                .beginTransaction()
            transaction.add(R.id.fragment_container, ListFragment())
            transaction.addToBackStack(null)
            transaction.commit()
        }
    }

    fun replaceFragment(fragment: Fragment) {
        supportFragmentManager.beginTransaction()
            .replace(R.id.fragment_container, fragment)
            .addToBackStack(null)
            .commit()
    }
}

FragmentTransaction 트랜잭션은 원자적입니다. commit()은 다음 Looper 사이클에서 실행을 예약합니다. 즉시 실행하려면 commitNow()를 사용하세요. addToBackStack(null)은 트랜잭션을 백 스택에 추가합니다 — 뒤로 가기 버튼이 작업을 취소합니다.

Fragment 생명주기 메서드

Kotlin 예제를 통해 Fragment 생명주기의 주요 메서드를 살펴보겠습니다. onCreateView는 레이아웃을 생성합니다 — Activity와 달리 메서드는 View를 반환해야 합니다. onViewCreated는 그 직후에 호출되며, 여기서 ID로 요소를 찾는 것이 안전합니다. onDestroyView는 뷰 참조를 정리하는 마지막 순간입니다.

kotlin
class DetailFragment : Fragment() {

    private var _binding: FragmentDetailBinding? = null
    private val binding get() = _binding!!

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        _binding = FragmentDetailBinding.inflate(inflater, container, false)
        return binding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        binding.textTitle.setText("세부 정보")
    }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }
}

View Binding 패턴(_binding/binding)은 onDestroyView 후에 레이아웃 참조가 null이 되도록 보장합니다. 뷰가 소멸된 후 binding에 접근하면 NullPointerException이 발생합니다. Google은 모든 프래그먼트에 이 패턴을 권장합니다.

프래그먼트 간 데이터 전송

프래그먼트 간 데이터 전송을 위해 Android는 여러 메커니즘을 제공합니다. 가장 안정적인 것은 하나의 Activity의 프래그먼트 간에 공유되는 ViewModel입니다. Fragment Result API는 일회성 이벤트에 적합합니다. Bundle 인수는 프래그먼트 생성 시 데이터용입니다.

kotlin
// 두 프래그먼트를 위한 공유 ViewModel
class SharedViewModel : ViewModel() {
    private val _selectedItem = MutableLiveData<Item>()
    val selectedItem: LiveData<Item> = _selectedItem

    fun select(item: Item) { _selectedItem.setValue(item) }
}

// 프래그먼트 A: Fragment Result API를 통해 이벤트 전송
setFragmentResult("request_key", bundleOf("key" to "value"))

// 프래그먼트 B: 이벤트 수신
childFragmentManager.setFragmentResultListener("request_key", this) { requestKey, bundle ->
    val value = bundle.getString("key")
}

Fragment Result API(Fragment 1.3.0에서 추가)는 더 이상 사용되지 않는 setTargetFragment/onActivityResult를 대체합니다. 이 API는 타입 안전하며, Bundle을 사용하고, 수신자에 대한 지식이 필요하지 않습니다. Parent FragmentManager가 프래그먼트 간 중개자 역할을 합니다.

Fragment vs Activity: 언제 무엇을 선택할까

Fragment와 Activity 중 선택은 애플리케이션 아키텍처에 따라 달라집니다. Fragment는 적응형 레이아웃(휴대폰 + 태블릿), 사용자 정의 전환 애니메이션 및 Jetpack Navigation 사용에 필수적입니다. Activity는 1~2개 화면의 간단한 앱에 적합합니다.

기준FragmentActivity
생성 속도빠름(가벼운 구성 요소)느림(시스템 프로세스)
재사용성높음(하나의 Fragment를 다른 Activity에서)낮음(각 화면에 자체 Activity)
전환 애니메이션유연함(FragmentTransaction)제한적(overridePendingTransition)
회전 시 보존자동(관리자가 복원)수동(onSaveInstanceState)
Deep LinksNavigation Component를 통해intent-filter를 통한 네이티브 지원

Jetpack Fragment 및 Jetpack Navigation

Fragment 작업의 현대적인 접근 방식은 Jetpack Navigation Component로, 수동 FragmentManager 관리를 대체합니다. 이 라이브러리는 NavGraph(XML 탐색 그래프), NavHostFragment 및 타입 안전한 데이터 전송을 위한 Safe Args를 제공합니다.

Jetpack Fragment 라이브러리(androidx.fragment:fragment-ktx)에는 FragmentResult API, DialogFragment, BottomSheetDialogFragment 및 Lifecycle-aware 구성 요소와의 통합이 포함됩니다. 2026년부터 Google은 Fragment를 직접 사용하지 않고 Jetpack Navigation을 통해서만 사용할 것을 권장합니다.

xml

<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    app:startDestination="@+id/listFragment">

    <fragment
        android:id="@+id/listFragment"
        android:name=".ListFragment"
        android:label="목록">
        <action
            android:id="@+id/action_list_to_detail"
            app:destination="@+id/detailFragment" />
    </fragment>

    <fragment
        android:id="@+id/detailFragment"
        android:name=".DetailFragment"
        android:label="세부 정보" />
</navigation>

자주 묻는 질문

FragmentManager란?

FragmentManager는 프래그먼트 트랜잭션을 관리하는 클래스입니다. Activity 컨테이너에서 프래그먼트를 추가, 제거 및 교체합니다. FragmentManager는 Activity 재생성 시 프래그먼트 상태를 복원하고 백 스택을 관리합니다.

Fragment와 Activity의 차이점은?

Fragment는 Activity 내 UI의 일부로, 독립적으로 존재할 수 없습니다. Fragment는 화면 회전 시 Activity 재생성에서 살아남습니다. Activity는 자체 Lifecycle을 가진 전체 화면이며, Fragment는 Activity의 Lifecycle에 의존합니다.

Activity 대신 Fragment를 사용해야 할 때는?

Fragment — 화면이 여러 독립 블록(탭, 마스터-디테일, 태블릿 적응)으로 구성된 경우. Activity — 화면에 반복 가능한 블록이 없는 경우. Google은 Single Activity + 다중 Fragment를 권장합니다.

프래그먼트 간 데이터를 전송하는 방법은?

세 가지 방법: 부모 Activity를 통해(공유 ViewModel), Fragment Result API(setFragmentResult)를 통해, Fragment 생성 시 Bundle 인수를 통해. ViewModel은 재생성 중에도 데이터가 보존되므로 선호되는 방법입니다.

Fragment Transaction이란?

Fragment Transaction은 프래그먼트 세트를 변경하는 원자적 연산입니다. FragmentManager.beginTransaction()은 add, remove, replace, hide, show를 호출할 수 있는 트랜잭션을 엽니다. 각 트랜잭션은 commit() 또는 commitNow()로 종료됩니다.

요약

  • Fragment는 Activity 내에서 자체 생명주기, 레이아웃 및 상태를 가진 재사용 가능한 UI 구성 요소
  • FragmentManager는 프래그먼트 트랜잭션을 관리하고 Activity 재생성 시 상태를 복원
  • FragmentTransaction은 프래그먼트 추가, 교체, 제거 및 숨기기를 위한 원자적 연산
  • Fragment 생명주기에는 onAttach부터 onDetach까지 6개의 콜백과 추가 onCreateView 지점이 포함
  • ViewModel은 하나의 Activity 내 프래그먼트 간 데이터 교환의 권장 방법
  • Fragment Result API는 프래그먼트 간 타입 안전한 일회성 이벤트 전송을 제공

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기