반응형
Room
Google에서 제공하는 ORM(Object-relational mapping)
SQLite에 대한 추상화 레이어를 제공하여 원활한 데이터베이스 액세스를 지원하며 SQLite를 완벽히 활용함
실행 기기에 앱 데이터 캐시를 만들고 네트워크 연결 여부와 관계없이 사용자가 콘텐츠를 탐색할 수 있음
🙋♀️ ORM이란?
Object Relational Mapping, 객체-관계 매핑
- 객체 지향 프로그래밍은 클래스를 사용하고 관계성 데이터 베이스에서는 테이블을 사용하기 때문에 객체 모델과 관계형 모델 간에 불일치가 발생함
- ORM은 객체 간의 관계를 바탕으로 SQL을 자동으로 생성하여 불일치를 해결함
- 즉, 객체를 통해 간접적으로 데이터 베이스의 데이터를 다룸
- Persistant API라고도 할 수 있음
🙋♀️ Persistence(영속성)이란?
데이터를 생성한 프로그램이 종료되더라도 사라지지 않는 데이터의 특성
→ 영속성을 가지지 않는 데이터는 프로그램 종료 시 소멸
SQLite보다 Room을 사용해야 하는 이유?
- 컴파일 타임에 SQL에 대한 유효성 검사가 가능하다.
- Schema 변경 시, 자동으로 업데이트가 가능하다.
- boilerplate code 없이 ORM 라이브러리를 통해서 Java나 Kotlin 객체에 매핑할 수 있다.
- Observation을 위한 LiveData 등과 함께 작동하도록 구축되었다.
Room의 3가지 요소
1. Room Database
- 기본 SQLite 데이터베이스에 대한 엑세스 포인트 역할
- 데이터베이스 작업 단순화
- RoomDatabase를 확장하는 추상 클래스로 사용하며 보통 싱글톤 패턴으로 정의함
[ Annotation ]
- @Database : 해당 클래스가 Database 임을 알려주는 어노테이션
- entites : 해당 Database에 어떤 테이블이 있는지 명시하는 속성
- version : Scheme가 바뀔 때 해당 속성을 변경해야 함
- exportSchema : Room의 Schema 구조를 폴더로 export할 것인가에 대한 속성
2. DAO (Data Access Objects)
- 데이터베이스에 엑세스하는데 사용되는 메서드를 정의하는 클래스
- 사용자가 DAO의 함수를 호출하면 Room Database에서 해당 함수의 작업을 실행
[ Annotation ]
- @Insert : 삽입 - @Entity로 정의된 클래스 객체, 해당 클래스의 collection, array만 인자로 받을 수 있음
- @Update : 업데이트 - return 값으로 업데이트된 행의 개수를 반환 받을 수 있음
- @Delete : 삭제 - return 값으로 삭제된 행의 개수를 반환 받을 수 있음
- @Query : 쿼리 - 쿼리문을 작성하여 실행할 수 있음
3. Entity
- 데이터베이스 내의 DB 테이블을 나타냄
[ Annotation ]
- @Entity : 테이블 선언
- tableName : 테이블 명, 기본으로 클래스 명이 테이블 명이 됨
- @ColumnInfo : 컬럼 선언
- name : 컬럼 명, 기본으로 argument 명이 column 명이 됨
- @PrimaryKey : 테이블의 PK
- 앱은 Room DB를 사용하여 DB와 연결된 DAO를 가져옴
- 앱은 각 DAO를 통해 DB CRUD를 처리함
- 앱은 Entity를 사용하여 DB 테이블 column에 해당하는 값을 가져오고 setting 함
👆 주의사항
Room의 CRUD 처리는 메인 스레드(UI 스레드)가 아닌 Background Thread에서 처리해야 함
∵ 데이터를 받아올 때 처리시간이 길어질 경우 UI에 영향을 줄 수 있기 때문BUT, 메인 스레드에서 DB에 대한 접근을 허용하고 싶다면 allowMainThreadQueries() 호출!
reference >
- https://developer.android.com/training/data-storage/room?hl=ko
- https://gmlwjd9405.github.io/2019/02/01/orm.html
- https://devel-yong.tistory.com/36
- https://jinee0717.tistory.com/43
반응형
'ANDROID > Android Jetpack' 카테고리의 다른 글
[Android/Jetpack] Recyclerview Adpater 대신 ListAdapter 적용하기 (0) | 2021.09.27 |
---|---|
[Android/Jetpack] Room + LiveData + ViewModel : 코루틴을 이용한 예제(2) (0) | 2021.09.25 |
[Android/Jetpack] Room + LiveData + ViewModel : 코루틴을 이용한 예제(1) (0) | 2021.09.24 |
[Android/Jetpack] AAC - Data Binding (0) | 2021.08.11 |
[Android/Jetpack] AAC - ViewModel (0) | 2021.07.27 |
[Android/Jetpack] AAC - LiveData (0) | 2021.07.21 |
[Android/Jetpack] AAC - Lifecycles (0) | 2021.07.20 |
[Android/Jetpack] MVVM 아키텍처와 AAC (0) | 2021.07.19 |
댓글