-
Notifications
You must be signed in to change notification settings - Fork 6
Demo Week2
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
- 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가 없음
- ConcatAdapter를 위한
- 목록 표시: 라벨에 속한 Not Todo 목록 표시
- 전체 라벨: 모든 Not Todo 목록 표시
- 일반 라벨: 해당 라벨이 부착된 Not Todo 목록 표시
- 목록의 성공/실패 여부 표시: 성공/실패 여부에 따라 목록의 색상이 다르게 보임.
- 뷰의 동작
- 일반: 성공/실패가 정해지지 않은 Not Todo는 회색으로 유지
- 성공: 좌 -> 우 스와이프 시에 노란색으로 변경
- 실패: 우 -> 좌 스와이프 시에 파란색으로 변경
- 데이터 관리
- 더미 데이터로 테스트
- 스와이프가 발생하면 Room에 데이터를 업데이트한 후 색상 변경이 반영
- SUCCESS, FAIL, NOTHING 타입으로 나눠서 저장
- 뷰의 동작
-
뷰의 동작
- 전체 라벨 터치: 모든 Not Todo 목록 출력
- 일반 라벨 터치: 해당 라벨과 관계가 있는 Not Todo 목록 출력
- 현재 선택된 라벨을 목록의 앞으로 끌어옴
- 선택된 라벨 취소: 선택한 라벨을 다시 터치하면 해당 라벨이 제외되고 목록의 뒤로 빠짐
-
데이터 관리
- 더미 데이터로 테스트
- Room에서 Todo와 Label을 N:N (다:다) 관계로 설정
- 하나의 라벨은 여러 개의 Todo를 가짐 -> 라벨을 터치하면 해당 라벨과 관계가 있는 모든 Not Todo 출력
- 하나의 Not Todo는 여러 개의 라벨을 가짐 -> 다른 라벨이 같은 Not Todo를 가질 수 있으므로 중복 출력되지 않도록 처리
- @Insert, @Update, @Delete 어노테이션을 사용해 SQL을 직접 작성하지 않고 명령 실행 가능
- 이외의 명령은 @Query 어노테이션을 사용해 직접 작성 가능
- 여러 명령이 순차적으로 실행되는 경우에는 @Transaction 어노테이션을 사용해 모두 실행되거나 모두 실행되지 않도록 해야 함
- 다대다 관계 설정(Todo-Labal)
- Hilt를 사용하기 위해서는 @HiltAndroidApp 어노테이션을 Application 클래스에 붙여줘야 함
- Application을 상속받은
NottoApplication
에 @HiltAndroidApp 어노테이션을 붙임
- 종속성 주입을 위해 @AndroidEntryPoint 어노테이션을 붙임
- ViewModel은 @HiltViewModel 어노테이션을 통해 의존성 주입 가능
- @HiltViewModel 어노테이션을 붙여주고 Repository를 주입하기 위해 생성자에 @Inject 어노테이션을 붙임
@Singleton 어노테이션을 붙여주고 LocalDataSource를 주입하기 위해 생성자에 @Inject 어노테이션을 붙임
- 특정 유형(ex: 외부 라이브러리, 인터페이스)의 인스턴스 제공을 위함
- @Module 어노테이션과 @InstallIn(SingletonComponent::class)을 붙임
-
provideTodoLabelDatabase(@ApplicationContext context: Context)
: @Singleton, @Provides -
provideTodoLabelDao(todoLabelDatabase: TodoLabelDatabase)
: @Provides -
provideLocalDataSource(todoLabelDao: TodoLabelDao)
: @Provides
- 가장 하위(?)의 참조만 명시적으로 Provide하면 순차적으로 주입이 이루어진다.
- @inject 어노테이션을 사용하지 않고 모든 참조들을 명시적으로 Provide하는 것도 가능하다.
두구두구두구두구🥁..
⭐비⭐밀⭐