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을 방지할 수 있다.
'Projects' 카테고리의 다른 글
| RareBridge 프로젝트 회고 (0) | 2026.03.19 |
|---|---|
| [성능 개선] API 호출 건수 감소를 통한 검색 기능 최적화 (0) | 2026.03.10 |