Intro
- 이번 최종 프로젝트에서 중간발표때 이슈가 되었던 부분은 커뮤니티게시판이었다. 처음에 개발할때에는 쉽게봤는데 여러사람이 쓰는 게시판의 글에 좋아요처리가 생각보다 쉽지않았다. 무엇보다 기존에 만든 코드의 버그가 빈번하게 발생하는데 설계를 하고 짠 코드가아니다보니 부득이하게 리펙토링과정을 할 수 밖에없었다.
커뮤니티게시판 요구사항
- 게시판의 요구사항은 아주 기본적인 것들만 넣어보았다.
- 게시글 읽기
- 게시글 쓰기
- 게시글 조회수 증가
- 게시글 좋아요(사용자는 하나의 글에 하나의 좋아요수를 증가시킬 수 있다. 그리고 좋아요를 취소할 수 있다.)
- 게시글 삭제
- 게시글 스크랩기능(일종의 북마크라고 보면 된다. 스크랩한 게시글은 내정보 페이지에서 모아서 볼 수 있다.)
- 이러한 요구사항이 나온 이유는 우리 앱의컨셉이 여행가계부+여행정보를 찾고 게시판을통해 공유하고 다른 사람의 여행정보 혹은 블로그 글을 보며 스크랩하여 여행을 편하게 준비할 수 있도록 하는것이 목적이었다. 그래서 이런 요구사항들이 생겼다.
변경하게 된 이유
- 계층간 무분별한 데이터 이동
- 기존 코드는 LiveData를 RemoteSource로 주입해서 업데이트 받는 형태였다. 이러다보니 MVVM 구조에도 맞지않고 계층을 침범해버리는 형태라 이는 추후 유지보수와 가독성을 위해서라도 반드시 수정해야했다.
- 모호한 이름
- 이전에 Firebase RDB를 사용할때 아래와같이 데이터를 3개로 나눠서 관리했었다. 아래 이름만보고 어떤 데이터를 저장하고있는지 유추하기가 매우 힘들다는것을 알 수 있다.

- RemoteDataSource의 과중한 책임할당
- 이전 설계에서 커뮤니티의 모든 요구사항기능을 하나의 RemoteSource에 구현했었다. 그 결과 코드를 찾기 굉장히 복잡했다. 여기에 LiveData들을 주입하다보니 오만곳에서 LiveData가 업데이트되는 현상이 벌어지는데 이게 어디에서부터 업데이트되어 데이터가 유입되는지 파악하기가 힘들었다.
- UI 상태변경이 어렵다.
- 데이터가 각각 분리되어있다보니 관리측면에서 편할지몰라도, UI에서 좋아요 데이터의 상태에 따라 보여주는 이미지가 달라져야할때 구현하기가 너무 어려웠다. 좋아요 데이터가 true인지 false인지 알려줄 수 있어야하는데 이는 ListAdapter에서 받는 데이터를 기준으로 판단을 해야하는 상황이다. 그러다보니 CommunityData에서 판별할 수 있도록 설계가 필요한 상황이었다.
설계
Realtime Database

- 위와같이 설계를 변경하였다. 변경점은 CommunityData안에 좋아요를 클릭한 유저의 id를 저장하는 것이다. 마찬가지로 ScrapUsers에 해당 게시글을 스크랩한 유저의 id를 저장하여 해당 유저가 존재하는지를 체크하여 UI의 상태를 업데이트해주는 방식으로 진행했다.
- 블로그의 경우 게시판과 다르게 자체 Model의 List만 관리해주면되서 작업하는데 어려움은 없었다.
Architecture

- 위의 그림은 현재 커뮤니티 화면에서 게시글을 받아올때 사용하는 구조이다. 이것외에도 좋아요라던지 등등이 더 있지만 이 구조에서 크게 차이가 나지 않으므로 해당 이미지만 가져왔다.
- RemoteDataSource는 Firebase RDB 하나만 사용하고있어 원래는 하나의 class에서 처리하는게 맞다고 생각해 이전에는 하나의 클레스에 구현했었다. 그랬더니 500줄이 넘어가는 상황을 겪었고 이건 아니다싶어 이번에는 RemoteSource 코드 자체를 가져오는 데이터의 성질에 맞게 분리하였다. 총 3개로 분리하였고 내역은 다음과같다.
- FirebaseBoardRemoteDataSource
- 게시판 관련 데이터. 좋아요 및 조회수도 여기에 속한다.
- 게시글 스크랩부분도 게시판 데이터 안에서 일어나는 일이므로 여기에 속한다.
- FirebaseBlogScrapRemoteDataSource
- 블로그 스크랩관련 데이터. 여기서 사용자가 스크랩한 블로그 데이터를 받아온다.
- FirebaseStorageRemoteDataSource
- 게시판에 올라가는 이미지처리. 이미지는 Firebase Storage에 업로드 후 이미지 Url을 가져와 RDB에 저장한다.
Outro
- 현재 커뮤니티 게시판작업은 모두 끝마친 상태이다. 작업한것을 정리하고 회고하며 내가 왜 이렇게 바꿨는지를 다시 돌아보고 기록하기위해 여기에 남긴다.
- 다음시간에는 실제 코드를 어떤식으로 구성하였는지 왜 그렇게 구성하였는지를 정리하며 회고하는 시간을 가지도록 하겠다~!