며칠간 클론앱 구현에 관련된 포스팅을 안했더니,
구현은 하면서도 자꾸 글 작성을 미루고 있다는것이 정말 신경 많이 쓰였다 ㅠㅠ
그래서 여태껏 했던 작업을 정리하는겸 글을 써본다.
우선적으로 구현을 했던 기능이 지역 검색 기능이었다.
Room Database에 들어있는 지역정보를 쿼리문 돌려서 검색하도록 만들어준 기능이다.
검색어를 입력할 때 마다, DB에 포함되는 단어가 있는지를 보여주고 RecyclerView에 뿌려주는 식으로 구현을 했다.
나는 생각보다 컴퓨터의 능력에 의구심을 많이 가지는 타입인데,
지금은 데이터가 얼마 없기 때문에, 처리 속도가 어느정도 보장 됐다고 생각한다.
만약, 데이터가 무수히 많을 경우에는 어떻게 할까?
그리고, 그 데이터가 DB가 아닌 네트워크에서의 처리라면 어떻게 해야할까?
처음으로 Paging을 사용해보았고, 검색기능을 구현 해보았기 때문에
이런 부분을 우선적으로 고려하지는 않았지만, 충분히 생각을 해봐야 할 문제같다.
검색어로 입력된 단어를 포함하는 데이터를 조회하여 보여준다.
데이터가 없다면 맨 오른쪽 사진처럼 검색 결과가 없다는 문구를 보여준다.
이렇게하니 생긴 또다른 문제는,
한글 같은 경우는 '서동'을 입력 할 경우 '서' -> '서ㄷ' -> '서도' -> '서동' 의 순으로 작성이 되는데,
'서'의 타이밍에서 검색된 결과가 존재 했을 경우
이어서 '서ㄷ'가 되는 즉시 검색 결과가 존재하지 않는 문제가 생기는 것이다.
이게 문제가 뭐냐면.. 글자를 입력할 때 마다 recycerview가 visible / gone 상태가 계속 반복되다보니 어지럽다..
보통 어플의 검색기능을 사용하면 저렇게 확확 화면이 바뀌지 않는데,
이러한 알고리즘도 찾아봐야 할 것 같다.
닉네임 설정 화면은 위와 같이 만들었다.
특별하게 어려운 부분은 없었고, ImageView를 동그랗게 만들기 위해 CircleImageView 라이브러리를 사용했다.
아직, 프로필 사진을 넣는 기능은 별도로 구현하지 않았다.
그리고 초기 로그인 화면부터 닉네임 설정, 지역 설정 화면, 메인 화면까지를 쭉 연결해보았다.
플로우는 아래와 같다.
파이어베이스에서는 로그인 된 유저의 Uid 값을 저장한다.
이를 SharedPreference 값으로 저장하여 어디에서나 데이터 처리에서 사용할 수 있도록 지정해두었다. (로그아웃 시 해제시킨다.)
이렇게 저장된 Uid를 통해, db에 저장된 유저의 정보를 간단하게 조회 할 수 있게 되는 예시가 존재하며 간단하게 구현을 해놓았다.
간단한 Splash 화면을 만들어놨다.
로그인이 유지가 되어있다면 메인화면으로 바로 이동하고,
사용자가 로그아웃을 시켜 둔 상태라면 로그인 화면으로 이동하도록 설정해두었다.
이미지는 아래 링크에서 다운로드 받아 사용했다.
Pngtree.com
현재 MainActivity에는 5개의 Fragment가 존재한다. 그리고 각각의 Fragment들이 데이터를 처리하게 될 것이다.
현재 '나의 당근' 탭을 다루는 Fragment에 유저의 정보가 간략하게 뜨게된다.
이는 Firebase의 Database에 저장되어있는 유저의 정보를 Uid를 통해 접근하여 데이터를 받아와 띄워주는 형태이다.
원했던 설계는, MainActivity에 접근하자마자 Firebase상의 Database에 접근하여 User의 정보를 가져오는건데, 지금은 '나의 당근' Fragment에 들어가야 그제서야 Firebase와 연결을 하게된다. 그러다보니 위의 스크린샷처럼 바로 데이터를 띄우는 것이 아니라, 약간의 시간이 지나고서야 데이터를 뷰에 보여주는 식이다.
사실, 이러한 데이터를 바로 띄우는 방법으로 2가지 정도가 더 생각난다.
그 중 하나는 이미 실천을 해보았다. MainActivity에서 쓸모없는 User의 정보를 받아오는 방법인데, MainActivity 자체에서는 사용하지도 않을 데이터를 굳이 여기서 받아와야하나 하는 생각에 그만두었다. (데이터는 최대한 빨리 띄워지긴 한다.)
남은 하나는 내장DB에 이러한 정보들을 저장해 두는 것이다. 사실 보안에 대해서는 1도 신경 안쓰는 프로젝트기는 하지만, User의 정보를 계속해서 내장DB 혹은 SharedPreference에 넣는것은 바람직하지 못하다고 생각하며, 그러한 도구에 자꾸 의존하게 될 것 같아서 사용을 줄이기로 결정했다.
최대한의 ViewModel과 Firebase간의 연동 작업을 통해, 그리고 이를 통해서 ViewModel을 조금이나마 더 잘 활용할 수 있도록 만드는 것이 더 큰 목표이기 때문에, ViewModel을 사용하는 방향으로 계속해서 고민해서 문제를 해결해 보도록 하겠다.
그리고, 사실 이 프로젝트를 시작하기 전에는 몰랐는데,
뭔가 조금씩 보안쪽에 신경을 쓰면서 작업을 해야겠다는 생각이 들었다.
주변에서 들리는 정보도 많고, 아예 신경을 안 쓸 수 없는 부분도 아닌것이.. 충분히 어려운 내용임을 인지하고 있고 분명 회사에서 프로젝트를 하면서도 계속해서 어려움을 겪고 사용할 것이기 때문이다.
물론 이번 프로젝트에서는 보안따위 신경쓰지 않지만, 플젝이 끝나고나면 바로 기본적인 보안 서적을 들고 공부 할 계획에 있다.