이번 니차내차 서비스에 지도가 필요해서, 한국인 정서에 가장 적합하다고 판단된(?) 네이버 지도를 사용하기로 했다.

프로젝트에 적용하면서 문제가 생겼던 부분들에 대해 정리하고 넘어가기로 했다.

1. 네이버 지도, 생명주기랑 무슨 상관?

지도를 사용하는데에는 MapFragmentMapView 두 가지 방법이 있다.

MapFragment는 지도 View를 포함한 Fragment이고, MapView는 FrameLayout으로 구현한 지도 View이다.

그래서 지도는 결국 생명주기에 맞춰서 설계가 되어있고, 실제 내부 코드를 보면 생명주기에 맞춰서 해야할 작업들(예를 들면, 지도 그리는 세팅, 옵션 세팅 등)을 하고 있다.

2. 그냥 써주면 되는거 아닌가?

네이버 지도 공식문서에서 다음과 같이 언급하고 있다.

MapView를 사용할 때는 반드시 MapView가 포함된 액티비티의 라이프 사이클에 맞추어 onCreate()onStart()onResume()onPause()onStop()onDestroy()onSaveInstanceState()onLowMemory()를 호출해야 합니다.

위에서 봤듯이 내부에서 작업을 하고 있기 때문에 설정을 해주어야 한다.

하지만 여기서 문제가 생긴다.

지금까지 우리가 알고 있는 내용을 살펴보도록 하자.

  1. 기본적으로 override method를 사용할 때, super를 먼저 호출하고 난 후에 작업을 수행한다.
  2. Fragment에서 binding을 사용할 때, 메모리 누수 방지를 위해 binding을 해제시키는 작업을 해야한다.

위의 두 내용 덕분에 나는 onDestroyView를 아래와 같이 코드를 짰다.

override fun onDestroyView() {
    super.onDestroyView()
    binding.mapView.onDestroy()
}

// 우리 프로젝트에서는 BaseFragment를 사용하기 때문에 약식으로 아래와 같이 작성했다.
BaseFragment.onDestroyView() {
    override fun onDestroyView() {
        super.onDestroyView() // Fragment의 onDestroyView 이다.
        _binding = null
    }
}

위와 같이 작성했더니, Fragment를 옮기거나, 화면 전환 등 onDestroyView가 불릴 때 binding이 먼저 해제되면서 접근하던 mapView가 사라지니 접근할 수가 없게 되었다.