개선사항 정리

gang_shik·2022년 4월 30일
0

프로젝트 Fit-In

목록 보기
3/10

이전에 가장 고민했던 부분이 Kotlin으로 코드 개선 및 구조에 대해서 개선사항이 명확했었음, 그리고 지금은 구현에 초점을 맞췄지만 만약 실제 출시하는 앱이라는 가정이라면 구현하고 돌아가는데 문제는 없더라도 의외에 에러에 맞딱드릴 수 있을 것 같았음

현재사항

  • 현재 구현한 것을 바탕으로 진행을 한다면 문제는 없을 수 있겠지만 실제 출시를 해서 운영한다면 문제가 발생할 상황이 농후해 보였음

  • 코드 자체가 러프했고 구현 자체에 포커스를 맞췄음, 그래서 현재 구현한 것을 하나씩 따져보면서 개선할 사항에 대해서 정리해 볼 예정

  • Kotlin의 내용을 어느정도 알고 기술 스택에 대한 이론적인 내용은 이해하고 있었지만 직접적인 적용점을 확신이 없었음, 그래서 어느정도의 기준이 필요했음

Android CodeLab 기초

  • 위의 Course를 해석하면서 GitHub에 정리하면서 Issue를 남기고 정리해봄, Kotlin Fundamental이었고 버전 세팅이 어려움이 있었지만 커스텀해서 맞춰서 모든 Task 해결함

CodeLab 정리 GitHub

  • 간단하게 Course 후기를 생각해보면 지금 내가 짠 코드나 구현 부분이 좀 Legacy한 방법이라고 생각이 듬, 현재 위의 코드랩과 공식문서 기준으로 본다면 FitIn에 구현한 것에서 개선한 방식으로 처리한 것이라서 이를 확실히 정리해서 구분할 필요가 있어보임

  • 이를 바탕으로 Kotlin 기반으로 전반적으로 적용해서 처리할 부분에 대해서 Task 해결하면서 현재 프로젝트와 접목시킬 점을 알아볼 것


개선할 사항들

Data Binding과 View Binding

  • 현재까지 진행한 부분에서 View Binding을 활용해서 findViewById를 통한 리소스를 개선을 하였음

  • 하지만 View Binding은 View를 불러오는데만 개선할 뿐 데이터와 뷰를 레이아웃을 통해서 직접적으로 처리하기 위해선 Data Binding을 활용해서 쓸 수 있음

  • 여기서 로그인 & 회원가입 및 통신 처리를 하고 Data를 처리하기 때문에 View Binding 말고 Data Binding을 활용할 수 있음, 직접적으로 데이터 처리가 수월해짐

  • 그리고 결과적으로 View Binding에서 View를 불러오는 방식이 Data Binding이라고 크게 달라지는 것이 아니기 때문에 이에 맞게 개선하면 좋아보임

Fragment 활용

  • data 양이 별로 많지 않고 초기 로그인 & 회원가입이기 때문에 단순하게 Intent를 활용해 BackStack을 관리하고 Activity를 다 만들었음

  • 하지만 Fragment를 활용하면 Navigation을 통해 Fragment간 화면 전환 및 argument를 통한 데이터 관리가 수월해짐, Intent를 열어서 매번 처리하는데 이를 위해서 코드 내부적으로도 Intent로 받은 값을 처리하고 최악의 경우 네트워크 통신이 길어지면 ANR에러가 발생할 수 있음

  • 무엇보다 Activity 내부에서 네트워크 처리, UI 변경 처리, 인텐트를 통한 데이터 처리 등 상당히 많은 작업을 Activity 내부에서 처리하고 있음, 관심사 분리가 필요해 보임

MVVM 패턴 및 Thread 안정성

  • 앞서 말했지만 Activity에서 네트워크 호출 및 UI 변경 처리, 데이터 처리 등 하나의 Activity에 그 안에 일어나는 작업을 모두 처리하고 있음

  • 그리고 추가로 로그인 & 회원가입 확인을 위해서 Lifecycle 함수를 통해서 확인을 해야하는데 이 부분도 러프하게 Lifecycle 메소드를 호출해서 처리하고 있음

  • 이러한 부분들이 구현에는 문제 없으나 실제 운용한다는 앱이라면 문제 발생시 해결할 수 있는데 상당한 문제가 생길 수 있음

  • Model-View-ViewModel 구조를 통해서 위에서 말한 복합적인 문제를 해결할 수 있음

  • 그러면 View에 역할을 하는 Fragment에서는 viewModel에 데이터와 관련해서 LiveData로 저장할 수 있음, 즉, 데이터 처리와 관련해서 viewModel만을 불러온다면 해당 data에 대해선 LiveData가 확인 처리가 가능하고 이와 관련하여 Data Binding을 활용했기 때문에 layout에서 직접적으로 onClick과 관련한 값 처리 및 data를 연결할 수 있음

  • 이 말은 앞서 Activity 내부에서 data 직접 연결하는 작업, 그리고 네트워크 연결 이런 것을 ViewModel에서 정의 그리고 Data Binding 활용하여 layout에서 데이터를 직접 연결하고 실질적으로 Activity의 역할에서는 해당 ViewModel을 불러와서 연결하는 작업만 해주면 되고 그와 부수적인 처리를 ViewModel이 해주고 View 변경 처리만 해주면 됨

  • 즉 명확한 관심사 분리됨, 그리고 무엇보다 Fragment 사용시 Navigation을 통해서 argument를 넘겨주면서 처리하기 때문에 Intent로 직접 넘겨주거나 할 필요 없이 이를 통해 받아서 처리할 수 있음, 추가로 다음 화면으로 넘어가는 Intent 처리 등 불필요해짐

  • 그리고 생명주기에 맞춰서 값 변경과 처리를 해주기 때문에 로그인 된 상태인지 아닌지를 LiveData에서 boolean을 통해서 확인해서 이와 관련한 로직을 간편하게 처리해줄 수 있음

  • 그리고 API 통신 관련해서도 Coroutine을 활용하기 때문에 비동기 처리를 간편하게 처리할 수 있음, 기존의 콜백 방식을 활용하지 않아도 됨


정리

  • View Binding에서 Data Binding으로 개선

    • 네트워크에서 데이터를 받아오거나 기존의 Activity에서 클릭 리스너 처리나 데이터 처리한 것을 해당 layout에 직접적으로 참조해서 연결해줄 수 있음

    • MVVM 패턴 적용시에도 바로 접목 가능함

  • Fragment 사용

    • 기존에는 Activity를 활용 Intent를 통해서 Navigation 처리를 함, 그래서 data 역시 직접 Intent를 통해서 전해주고 받아오고 Navigation을 추상적으로 구상한 것을 직접 해야함

    • 이 부분을 Fragment 활용 Activity에선 <fragment>로 담고, Navigation을 통해서 로그인 & 회원가입 부분을 만듬

    • Intent를 통해서 직접 data 넘길 필요없이 Navigation으로 정한 루트대로 처리할 시 argument로 Nav를 불러옴으로써 간단하게 데이터 받아서 처리함, UI 차원에선 내부적으로 해야할 일이 걍 참조한 거 불러오기만 하면 됨

  • MVVM 패턴 사용

    • Activity가 Intent 처리, 네트워크 통신, 받은 데이터 UI 처리 등 많은 작업을 소화함

    • 하나가 안되면 그리고 성능이나 속도가 느려질 가능성 매우 농후함

    • 이를 Fragment 적용, 1차적으로 개선하고 MVVM 패턴 활용 그 Fragment 안에서도 ViewModel을 불러오기만함, Data Binding 활용, 데이터 처리도 연결도 layout을 활용함

    • 네트워크 통신 data 관리는 View Model에서 그 data를 보여주는데 있어서 layout에 data binding을 통해서 실질적으로 Fragment에선 viewmodel 연결, ViewModel을 불러와 데이터만 체크만 하면 됨


위의 사항들을 접목시켜 프로젝트 리팩토링 해 볼 예정, 지금은 하나의 Activity가 많은 일을 하고 비동기 처리에 대해서도 데이터 처리에 대해서도 Thread의 안정성이 고려가 되지 않았음, 이런 부분을 좀 더 나눠서 처리해볼 것, 이 외에 진행하면서 꾸준히 개선 피드백 할 예정

profile
측정할 수 없으면 관리할 수 없고, 관리할 수 없으면 개선시킬 수도 없다

0개의 댓글