기어가더라도 제대로
[UIKit-기초] UITabBarController 탭 이동 VS 화면 생성해서 이동 본문
회원 탈퇴 후 앱 크래시 문제 해결기
개발하다 보면 참 다양한 문제들을 마주치게 되는데요. 오늘은 제가 최근에 겪었던 재미있는(?) 버그 수정 경험을 공유해보려고 합니다. 기술적인 내용이 있지만, 최대한 쉽게 풀어써봤으니 끝까지 읽어주시면 감사하겠습니다 😊
어떤 문제가 있었나요?
먼저 상황 설명부터 할게요. 저희 앱은 회원가입을 하고 로그인해서 사용하는 서비스였는데, 최근에 사용자 편의성을 높이기 위해 회원가입을 필수가 아닌 선택으로 바꾸는 작업을 진행했어요.
그런데... 이게 웬걸? 회원 탈퇴를 하고 나면 앱이 뻗어버리는 현상이 발생하더라고요.
원인을 파헤쳐보니...
문제의 원인을 찾아보니 꽤나 아찔했습니다. 앱 전체 코드에서 무려 260군데나 되는 부분이 사용자 정보를 무조건 있을 거라고 가정하고 있었거든요.
앱은 사용자 정보를 내부 DB(데이터베이스)라는 곳에 저장해두고 필요할 때마다 꺼내 쓰는데, 회원 탈퇴하면 이 정보가 사라지니까 앱이 당황해서 멈춰버린 거였어요.
// 회원탈퇴를 하고 화면을 다시 그렸을 때 저 코드가 불리면 앱이 크래시가 발생
realm.objects(MemberDB.self)[0]
바뀐 로그인 흐름에서는 회원가입이 선택이라 내부 DB에 아무런 값이 없는 상황에서 앱이 터짐
해결한 방법
처음에는 '아, 이거 260군데 다 고쳐야 하나...' 하고 한숨부터 나왔습니다. 근데 잠깐, 이상한 점을 발견했어요.
로그아웃할 때는 왜 문제가 없었을까? 🤔
그러다 깨달았죠. 로그아웃할 때는 화면을 새로 그리지 않고 이전 화면으로 돌아가기만 하니까 문제가 없었던 거예요!
그래서 생각했습니다. "회원 탈퇴도 로그아웃처럼 처리하면 어떨까?"
결국 이렇게 해결했어요:
- 회원 탈퇴 처리를 하고
- 바로 메인 화면으로 돌아간 다음
- 그 때 화면을 새로고침하기
이렇게 하니까 신기하게도 코드 260군데를 건드리지 않고도 문제가 깔끔하게 해결되었습니다!
회원탈퇴도 로그아웃과 마찬가지로 회원탈퇴를 한 다음에 있는 화면으로 이동만 해주는 방식으로 해결했습니다.
// MARK: - WithdrawVC
func withdraw() {
// ~ 생략, 완료 시점에 moveToHome
moveToHomeTab()
}
func moveToHomeTab() {
if let viewControllers = self.navigationController?.viewControllers, viewControllers.count > 2 {
// Move To MoreTabVC()
let targetIndex = viewControllers.count == 3 ? 0 : 2
let targetViewController = viewControllers[targetIndex]
self.navigationController?.popToViewController(targetViewController, animated: true)
DispatchQueue.main.async { [weak app] in
app?.onWithdraw.send(())
}
}
}
// MARK: - MoreTabVC
private func setupBinding() {
app?.onWithdraw
.receive(on: RunLoop.main)
.sink { [weak self] in
// move to main
self?.menuTableView.reloadData()
self?.moveToMain()
}
.store(in: &cancellables)
}
private func moveToMain() {
if let tabController = self.tabBarController,
tabController.viewControllers?.isEmpty == false,
let homeVC = tabController.viewControllers?[0] {
tabController.selectedViewController = homeVC
}
}
- HomeTabVC와 MoreTabVC는 같은 Level에 있는 뷰컨트롤러
데모
이번 일로 배운 것들
이번 경험을 통해 몇 가지 교훈을 얻었는데요:
- 작은 변화가 예상치 못한 도미노를 일으킬 수 있다는 것
- 가장 직관적인 해결책이 항상 최선은 아니라는 것 (260군데 수정하기... 아찔하네요 😱)
- 이미 잘 작동하는 것을 참고하면 좋은 해결책을 찾을 수 있다는 것
앞으로의 계획
이번 일을 계기로 앱 구조를 더 탄탄하게 만들어야겠다는 생각이 들었어요. 'Coordinator 패턴'이라는 걸 적용해볼 생각입니다.
글 읽어 주셔서 감사합니다.
'만난 에러들' 카테고리의 다른 글
[에러] 오래 응답이 없는 화면 - 2 (0) | 2024.12.11 |
---|---|
[에러] 오래 응답이 없는 화면 - 1 (0) | 2024.12.11 |
[HTTP Error] ATS(Apple Transfer Security) Policy를 준수하는 우아한 방법, iOS Simulator에서 http 요청 보내는 방법, since it does not conform to ATS policy (1) | 2024.06.14 |
PHPickerController와 효율적 메모리 사용(feat. memory leak) (0) | 2022.08.17 |
TableView - didSelecAtRow 메서드가 입력이 안될때! (0) | 2022.08.12 |