1. 첫 프로젝트 HiStory
HiStory는 UMC 1기 활동을 하며 처음으로 안드로이드 개발자이자 PM으로 진행했으며, 런칭까지 했던 프로젝트이다. 안드로이드 개발자 2명, 서버개발자 3명, 디자이너 1명이 팀이 되어 진행했다.
2. 리팩토링을 하는 이유
부끄럽지만, 당시는 런칭을 하는데에 급급해 구글링을 통해 앱이 굴러가게만 하는데에 집중했다.
그래서 발생한 결과가 왼쪽과 같은 모습이다. 지난 학기 객체지향프로그래밍 수업을 들으면서 설계를 한 후 진행한다면 개발이 얼마나 빠르게 진행될 수 있는지 경험할 수 있었다. (물론 설계가 잘못되었을 때는 수정사항이 많이 발생했지만..) 또한 학기 중에 안드로이드 공식 문서에서 아키텍처에 대해 읽으면서 이를 실제 프로젝트에 적용해보고 싶다는 마음이 생겼다.
이번에 리팩토링을 하는 이유는 크게 3가지이다.
1. 권장 앱 아키텍처에 맞게끔 UI레이어와 데이터 레이어를 분리하여 프로그램에 대해 파악이 용이하게끔 하기 위함
2. 이전에 학습했던 내용을 리팩토링하며 복습하고자 하기 위함
3. 복습하며 단순히 코드를 붙여넣기만 하는게 아니라 어떤 구조로 어플리케이션이 동작하는지 파악하고자 하기 위함
이 과정을 통해 스스로가 조금 더 나은 개발자가 되길 바라는 마음으로 시작했다.
3. BottomNavigation 수정
# 수정 전 코드 (MainActivity.kt)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mBinding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.bnvMain.setOnNavigationItemSelectedListener(this)
binding.bnvMain.itemIconTintList = null
binding.bnvMain.selectedItemId= R.id.action_home
val intent = Intent(this, LockScreenService::class.java)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
this.startForegroundService(intent)
} else {
this.startService(intent)
}
}
# 수정 후 코드(MainActivity.kt)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mBinding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
supportFragmentManager
.beginTransaction()
.replace(binding.flContainer.id, HomeFragment())
.commitAllowingStateLoss()
binding.bnvMain.setOnItemSelectedListener {
changeFragment(it.itemId)
true
}
}
이전에는 OnNavigationItemSelectedListener를 오버라이딩하여 navigation 동작을 처리했지만, deprecate되었기 때문에 FragmentManager를 사용하여 선택된 메뉴의 id를 가지고 화면 전환이 이루어지게끔 처리했다.
FragmentManager는 백스택의 fragment를 관리하여 추가, 삭제 등의 작업을 할 수 있는데, 이를 활용하여 현재 fragment가 WriteFragment일 때만 다른 화면을 선택할 때 경고 문구가 나오게 처리할 수 있었다.
val currentFragment = supportFragmentManager.fragments[0]
if(currentFragment is WriteFragment){
if(menuId != R.id.nav_writing){
showAlert(menuId)
}
}
+ 처음에는 currentFragment == WriteFragment() 로 작성했었는데 생각해보니 이렇게 하면 새로 만든 instance와 기존 instance를 비교하니 동작하지 않는 듯 했다. 그래서 검색을 해보니 type 비교를 is로 하면 된다고 해서 이처럼 작성하게 되었다.
참고 문헌
프래그먼트 관리자 | Android 개발자 | Android Developers
Type checks and casts | Kotlin Documentation (kotlinlang.org)
'Kotlin_study' 카테고리의 다른 글
[HiStory 리팩토링] 3. 카카오 로그인 기능 적용(2) (0) | 2023.01.04 |
---|---|
[HiStory 리팩토링] 2. 카카오 로그인 기능 적용 (0) | 2023.01.03 |
[Kotlin] Custom Calendar Library(kizitonwose) 사용하기 (0) | 2022.07.13 |
[Kotlin] 동기와 비동기 살펴보기 (0) | 2022.07.04 |
[Kotlin] Android font 적용하기 (0) | 2022.07.01 |