Android Fragment에 대한 개념과 핵심 요소를 정리하였다.
Fragment는 안드로이드 앱 UI의 재사용 가능한 부분을 나타내는 UI 구성요소이다. Fragment는 자체 레이아웃을 정의하고 관리하며, 자체 생명주기를 가지고, 자체 입력 이벤트를 처리할 수 있다. Fragment는 독립적으로 사용할 수 없고, Acitivty 혹은 다른 Fragment에 의해 호스팅되어야 한다(종속적이어야 한다).
Fragment는 UI를 개별 청크(덩어리)로 분리하여 Activity UI에 모듈성(프로그램을 여러 개의 독립적인 구성 요소로 나누어 구성하는 설계 원칙)과 재사용성을 도입한다.
Activity는 Navigation Drawer, Bottom Navigation 같은 Global한 UI를 구성하는데 적합한 반면에, Fragment는 단일 화면이나 화면 일부를 구성하기에 적합하다.
FragmentManager는 Fragment를 add, remove, replace, back stack에 추가하는 등의 작업을 수행하는 class이다.
Jetpack Navigation 라이브러리를 사용하는 경우 Navigation 라이브러리가 FragmentManager를 사용하기 때문에 개발자가 FragmentManager와 직접 상호작용하는 경우는 거의 없다.
FragmentActivity 및 서브 클래스(예: AppCompatActivity)에서는 getSupportFragmentManager() 메서드를 통해 FragmentManager에 접근 가능하다.
FragmentManager는 한 개 이상의 자식 Fragment를 가질 수 있다. Fragment 내에서 Fragment의 자식을 관리하는 FragmentManager에 getChildFragmentManager()를 통해서 접근 가능하다. 만약 호스팅한 FragmentManager에 접근이 필요하면, getParentFragmentManage()를 통해서 접근 가능하다. 그림으로 표현하면 다음과 같다.

여러 프래그먼트 변경 작업(add, replace 등)을 그룹으로 묶어서 커밋하는 작업 단위를 Transaction이라고 한다. 그리고 FragmentTransaction 클래스에서 제공하는 API를 사용하여 Transaction 내에서 수행할 작업을 지정할 수 있다.
예시로 아래 코드를 분석하면,
supportFragmentManager.beginTransaction().apply {
replace(R.id.fragmentContainer, fragment)
commit()
}
beginTransaction() : FragmentTransaction 인스턴스를 returnreplace() : 커밋할 작업. 여러 작업을 하나의 트랜잭션으로 그룹화 가능. replace() 말고도 add(), remove() 등 다른 여러 작업을 추가해도 된다.commit() : 모든 작업이 트랜잭션에 추가되었음을 FragmentManager에 알리는 메소드이다. commit() 메소드는 비동기 방식으로, 트랜잭션을 바로 처리하지는 않는다. 대신 트랜잭션은 메인 UI 스레드에서 가능한 한 빠르게 처리된다. 만약 트랜잭션을 바로 처리하고 싶으면 commitNow()를 사용하면 된다. 대부분의 사용 사례에서는 commit() 메소드 사용만으로도 충분하다.https://developer.android.com/guide/fragments
https://developer.android.com/guide/fragments/fragmentmanager
https://developer.android.com/guide/fragments/transactions