Notice
Recent Posts
Recent Comments
Link
«   2026/05   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Tags
more
Archives
Today
Total
관리 메뉴

bonggyulim 님의 블로그

[Troubleshooting] Fragment 화면 전환 중 Flow 구독으로 발생한 NullPointerException 해결 본문

Projects

[Troubleshooting] Fragment 화면 전환 중 Flow 구독으로 발생한 NullPointerException 해결

bonggyulim 2026. 3. 10. 19:12

문제 상황

모임 생성 후 다음과 같은 화면 흐름이 발생했다.

CreateGroupFragment
      ↓
popBackStack()
      ↓
HomeFragment
      ↓
ReadGroupFragment

모임을 생성하면 자동으로 모임 상세 페이지로 이동하도록 구현하였다.
하지만 화면 전환 과정에서 HomeFragment에서 NullPointerException이 발생했다.

발생한 에러

java.lang.NullPointerException
Attempt to invoke virtual method on a null object reference

에러가 발생한 코드

binding.rvMyGroupList.adapter = myGroupListAdapter

binding == null
 

상태에서 View 접근이 발생했다.

원인 분석

Fragment에서는 메모리 누수 방지를 위해 onDestroyView()가 호출되면 ViewBinding을 null로 초기화한다.

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

하지만 해당 Fragment에서는 Flow를 다음과 같이 구독하고 있었다.

lifecycleScope.launch {
    viewModel.userGroupList.collect { uiState ->
        ...
    }
}

이 경우 Fragment의 View가 파괴된 이후에도 Flow가 계속 데이터를 emit하게 된다.
결과적으로 Fragment의 생명주기와 Flow의 수명주기가 맞지 않아 문제가 발생하였다.

해결 방안

먼저 다음과 같은 방법들을 시도하였다.

  • BackStack이 0일 때만 Flow가 실행되도록 조건문 추가
  • beginTransaction() 대신 findNavController() 사용

위 방법으로도 문제가 해결되었지만, 근본적인 해결 방법은 아니라는 점을 알게 되었다.

그래서 Flow 구독을 Fragment 생명주기에 맞추기 위해
repeatOnLifecycle()을 적용하였다.

viewLifecycleOwner.lifecycleScope.launch {
    repeatOnLifecycle(Lifecycle.State.STARTED) {
        viewModel.userGroupList.collect { uiState ->
            ...
        }
    }
}

repeatOnLifecycle()을 사용하면 Fragment가 STARTED 상태일 때만 Flow를 수집하고,
Lifecycle이 STOPPED 상태가 되면 자동으로 수집을 중단한다.

결론

Fragment에서 Flow를 사용할 때는 repeatOnLifecycle을 사용해 Fragment 생명주기에 맞게 구독을 관리해야 ViewBinding 관련 NullPointerException을 방지할 수 있다.