Skip to content

Demo Week2

doyeon edited this page Nov 4, 2021 · 3 revisions

🌈Demo week2

🖥2주차 발표 영상

notto_calendar_month_title.mp4

🤼‍♀️프로젝트 협업 방식

😄한 화면단위로 data와 레이아웃을 분리해 작업했고, 무수한 conflict와 함께 일주일을 보내면서 협업방식을 개선해나갔습니다😄

설정

  • Android CI : build 성공 여부 확인(Github에서 제공하는 기본 Android CI)

  • merge 버튼의 제한 : merge commit만 허용

    설정 이미지
  • branch protection rule : branch에 merge하기 위해서는 반드시 pr이 선행, 모든 pr에는 approval이 최소 1개 이상 요구

    설정 이미지
  • Discussions Tab의 사용 : 버그와 프로젝트의 성장과정을 기록

    버그는 Create issue from discussion 이슈로 추가해서 관리

    설정 이미지
  • PR 템플릿 설정

    설정 이미지

변경 내용

  • PR Merge 방식 변경 : 기존 rebase 방식에서 merge commit 방식으로 변경

    A, B가 동시 작업을 하던 중에 A가 요청한 pr에서 B의 작업과 관련된 데이터 타입이나 파일을 수정한 일이 있었습니다. 해당 pr을 merge했을 때 B는 관련 데이터 타입을 이용해 작업한 commit 내역이 전부 빌드가 되지 않는 문제가 발생했습니다. 따라서 이러한 문제를 해결해주기 위해 기존에 사용하면 Rebase 방식에서 Merge Commit 방식으로 변경하였습니다.

  • PR을 merge하는 역할을 변경 : 기존 마지막 reviewer 에서 pr 요청자로 변경

    기존에는 설정한 reviewer중 가장 마지막으로 approval을 한 사람이 merge를 해서 pr 작성자와 reviewer 모두에게 코드 책임감을 갖도록 했습니다. 문제는, pr 작성자가 추가하고 싶은 관련 commit이 있을 때 reviewer가 이미 merge를 해버린 경우 의미없는 pr이 추가되는 경우였습니다. 따라서 마지막 approval을 남긴 reviewer가 아닌 pr 작성자가 merge를 하도록 변경하였고, approval 이후에 추가 commit이 발생했다면 리뷰를 재요청하기로 결정했습니다.

📚구현 내용

📝프로젝트 구조

├─common
├─di
├─model
│  ├─data
│  ├─database
│  │  ├─label
│  │  ├─todo
│  │  └─todolabel
│  └─datasource
│      ├─option
│      ├─popular
│      └─todo
├─ui
│  ├─home
│  │  └─utils
│  ├─option
│  └─popular
└─util

📝ConcatAdapter

  • RecyclerView와 이외의 View들을 함께 스크롤하기 위해 NestedScrollView를 사용할 수 있지만 그럴 경우 RecyclerView의 장점인 ViewHolder 재사용이 불가능하기 때문에 모든 View를 RecyclerView의 Item으로 구현 -> 세 가지 타입의 Item들을 ConcatAdapter를 사용해 하나의 어댑터처럼 사용 -> ConcatAdapter(CalenderAdapter, LabelWrapperAdapter, TodoAdapter)
  • ConcatAdapter를 위한 BindingAdapter 적용
    • ConcatAdapter를 위한 BindingData(List<Todo>, List<Label>) 구현
    • TodoAdapter는 Todo List를, LabelAdapter는 Label List를 사용
      • LabelAdapter는 LabelWrapperAdapter 안에 포함되어 있어서 LabelWrapperAdapter에서 따로 빼와서 아이템 리스트를 넣어줌
    • CalenderAdapter는 특별히 사용하는 List가 없음

📝Todo

  • 목록 표시: 라벨에 속한 Not Todo 목록 표시
    • 전체 라벨: 모든 Not Todo 목록 표시
    • 일반 라벨: 해당 라벨이 부착된 Not Todo 목록 표시
  • 목록의 성공/실패 여부 표시: 성공/실패 여부에 따라 목록의 색상이 다르게 보임.
    • 뷰의 동작
      • 일반: 성공/실패가 정해지지 않은 Not Todo는 회색으로 유지
      • 성공: 좌 -> 우 스와이프 시에 노란색으로 변경
      • 실패: 우 -> 좌 스와이프 시에 파란색으로 변경
    • 데이터 관리
      • 더미 데이터로 테스트
      • 스와이프가 발생하면 Room에 데이터를 업데이트한 후 색상 변경이 반영
      • SUCCESS, FAIL, NOTHING 타입으로 나눠서 저장

📝Label

  • 뷰의 동작

    • 전체 라벨 터치: 모든 Not Todo 목록 출력
    • 일반 라벨 터치: 해당 라벨과 관계가 있는 Not Todo 목록 출력
      • 현재 선택된 라벨을 목록의 앞으로 끌어옴
    • 선택된 라벨 취소: 선택한 라벨을 다시 터치하면 해당 라벨이 제외되고 목록의 뒤로 빠짐
  • 데이터 관리

    • 더미 데이터로 테스트
    • Room에서 Todo와 Label을 N:N (다:다) 관계로 설정
    • 하나의 라벨은 여러 개의 Todo를 가짐 -> 라벨을 터치하면 해당 라벨과 관계가 있는 모든 Not Todo 출력
    • 하나의 Not Todo는 여러 개의 라벨을 가짐 -> 다른 라벨이 같은 Not Todo를 가질 수 있으므로 중복 출력되지 않도록 처리

📝Room Database

  • @Insert, @Update, @Delete 어노테이션을 사용해 SQL을 직접 작성하지 않고 명령 실행 가능
  • 이외의 명령은 @Query 어노테이션을 사용해 직접 작성 가능
  • 여러 명령이 순차적으로 실행되는 경우에는 @Transaction 어노테이션을 사용해 모두 실행되거나 모두 실행되지 않도록 해야 함
  • 다대다 관계 설정(Todo-Labal)

📝Hilt

NottoApplication

  • Hilt를 사용하기 위해서는 @HiltAndroidApp 어노테이션을 Application 클래스에 붙여줘야 함
  • Application을 상속받은 NottoApplication에 @HiltAndroidApp 어노테이션을 붙임

HomeFragment

  • 종속성 주입을 위해 @AndroidEntryPoint 어노테이션을 붙임

HomeViewModel

  • ViewModel은 @HiltViewModel 어노테이션을 통해 의존성 주입 가능
  • @HiltViewModel 어노테이션을 붙여주고 Repository를 주입하기 위해 생성자에 @Inject 어노테이션을 붙임

TodoLabelRepository

@Singleton 어노테이션을 붙여주고 LocalDataSource를 주입하기 위해 생성자에 @Inject 어노테이션을 붙임

TodoLabelDatabaseModule

  • 특정 유형(ex: 외부 라이브러리, 인터페이스)의 인스턴스 제공을 위함
  • @Module 어노테이션과 @InstallIn(SingletonComponent::class)을 붙임
  • provideTodoLabelDatabase(@ApplicationContext context: Context): @Singleton, @Provides
  • provideTodoLabelDao(todoLabelDatabase: TodoLabelDatabase): @Provides
  • provideLocalDataSource(todoLabelDao: TodoLabelDao): @Provides

핵심

  • 가장 하위(?)의 참조만 명시적으로 Provide하면 순차적으로 주입이 이루어진다.
  • @inject 어노테이션을 사용하지 않고 모든 참조들을 명시적으로 Provide하는 것도 가능하다.

🌟다음주 예고

두구두구두구두구🥁..
⭐비⭐밀⭐
Clone this wiki locally