https://developer.android.com/training/data-storage/room?hl=ko
https://todaycode.tistory.com/39
https://math-coding.tistory.com/247
https://developer.android.com/codelabs/android-room-with-a-view-kotlin#0 *중요
https://medium.com/슬기로운-개발생활/안드로이드-room-사용법-1b7bd07b4cee
val room_version = "2.4.3"
implementation("androidx.room:room-runtime:$room_version")
annotationProcessor("androidx.room:room-compiler:$room_version")
https://velog.io/@corone_hi/DAO-Data-Access-Object-DTOData-Transfer-Object-VOValue-Object
// DAO와는 달리 DTO는 transfer이므로 로직을 가지지 않고 getter, setter로만 동작
// DTO <-> DAO <-> DataBase => Server에서 이런 구조로 동작함.
Room Library를 사용해 data를 저장할 때 DAO(데이터 액세스 객체)를 정의하여 상호작용
DAO를 이용해 앱 DB에 access하면 => can preserve separation of concerns, a critical architectural principle
DAO에는 항상 @Dao 어노테이션(Dao클래스 식별)을 달아야 하며 class가 아닌 interface
메소드 어노테이션
@Insert : 테이블에 data 삽입 (쿼리문을 작성하지 않아도 자동으로 insert기능 부여)
@Delete : 테이블에 있는 특정 data 삭제 (위와 동일)
@Update : 테이블에 있는 특정 data 갱신 (위와 동일)
@Query : 직접 SQL문을 작성
@Insert Annotation 옆에 onConflict = OnConflictStrategy.IGNORE(충돌 정책)은 data conflict 시 처리해야 할 작업을 정의. IGNORE = data conflict 시 새로운 data 무시
DAO에서 모든 쿼리는 비동기로 처리는게 효율적이기에 Room + Coroutines suspend 함수를 활용하여 프로그래밍이 유리
Entity
Database
DB Object
RoomDatabase class를 상속받는 abstarct class
@Entity 어노테이션을 통해 만든 User 테이블 클래스, @Dao 어노테이션을 통해 만든 userDao 클래스
Dao를 반환하는 abstract 메소드를 포함
@Database 어노테이션을 통해 DB로 식별 + 어노테이션 안에 해당 DB의 Entity들을 포함시켜 지정 -> 여러 개의 entity는 array로 묶여서 지정
어노테이션 안에 version var를 통해 앱 업데이트 여부를 구분할 수 있는 content 제공
Application이 Room DB로부터 Dao를 가져옴 -> Dao를 통해 Entity access
Dao에 포함된 메소드를 통해 -> Entity data를 읽고 씀.
ViewModel
https://medium.com/androiddevelopers/viewmodels-a-simple-example-ed5ac416317e
ViewModel's role: UI에 data 제공 & 이러한 data들은 configuration 변경에도 유지되어야 함.
Repository와 UI 사이의 communication center 역할처럼 작업을 수행
lifecycle Library의 일부
fragment들 사이에서 data를 공유할 수 있게끔 함
lifecycle을 고려하여 configuration 변경에도 앱의 UI data를 유지
정리)
Activity, Fragment 클래스로부터 앱의 UI data를 분리 ->