티스토리 뷰
이번 포스팅에서는 ROOM 에 대해 알아보려 한다.
참고로, 지난 포스팅에서는 UI, DB 생성, CRUD, column 추가, DB 확인을 알아 보았다.
[Android/Database] - SQLite 에서 ROOM 까지 (2) - UI 구성
[Android/Database] - SQLite 에서 ROOM 까지 (3) - SQLiteOpenHelper
[Android/Database] - SQLite 에서 ROOM 까지 (4) - SQLite 를 이용한 CRUD
[Android/Database] - SQLite 에서 ROOM 까지 (5) - SQLite 로 생성된 기존 DB 에 column 추가하기
[Android/Database] - SQLite 에서 ROOM 까지 (6) - DB 확인하기
ROOM?
ROOM 은 데이터베이스의 데이터를 자바 or 코틀린 객체로 매핑해 주는 ORM 라이브러리다.
◼ ORM(Object Relational Mapping) 이란?
- 객체 지향 프로그래밍은 클래스를 사용하고, 관계형 데이터베이스는 테이블을 사용한다.
- 객체 모델과 관계형 모델 간에 불일치가 존재한다.
- ORM 을 통해 객체 간의 관계를 바탕으로 SQL을 자동으로 생성하여 불일치를 해결한다.
ROOM 은 SQLite 에 대한 추상 레이어를 제공하여 SQLite 의 모든 기능을 제공하면서 편한 데이터베이스의 접근을 허용한다.
Google 은 SQLite 대신 ROOM 을 사용하도록 권고하고 있다.
SQLite vs ROOM
- SQLite 는 쿼리에 대한 에러를 컴파일 타임에 확인할 수 없지만 ROOM 은 컴파일 타임에 SQL 에 대한 유효성을 검사 할 수 있다.
- SQLite 는 schema 가 변경이 될경우 SQL 쿼리를 수동으로 업데이트 해야하지만 ROOM 은 쉽게 해결이 가능하다.
- SQLite 는 java 데이터 객체를 변경하기 위해 많은 boilerplate code 를 사용해야 하지만 ROOM 은 boilerplate code 없이 매핑 가능하다.
(Boilerplate code : 수정하지 않거나 최소한의 수정만을 거쳐 여러곳에 필수적으로 사용되는 코드)
- ROOM 은 LiveData 와 RxJava 를 위한 Observation 으로 생성하여 동작할 수 있지만 SQLite 는 할 수 없다.
ROOM 구성요소
ROOM 은 아래와 같이 3가지 구성요소(Database, Entity, Dao) 가 있다.
출처 : https://developer.android.com/images/training/data-storage/room_architecture.png?hl=ko
Database
데이터베이스의 holder를 구성하며 지속적인 관계형 데이터의 기본 연결을 위한 access point 역할을 한다.
◼ "@Database" 로 annotation 이 지정된 클래스는 다음 조건을 충족해야 한다.
- RoomDatabase 를 extends 하는 abstract class 여야 한다.
- Annotation 내에 entities 를 포함해야 한다.
- 클래스 내부에 인수가 0 개인 @Dao annotation 이 지정된 클래스를 반환하는 abstract class 를 포함한다.
Entity
Entity file 은 class 의 변수들이 column 이 되어 database 의table 이 된다.
◼ Annotation
@Entity(tableName = StudentEntry.TABLE_NAME)
Table 이름을 선언한다. (기본적으로 entity class 이름을 database table 이름으로 인식)
@PrimaryKey
각 entity 는 1개의 primary key 를 가져야 한다.
@ColumnInfo
Table 내 column 을 변수와 매칭
Dao
DAO 는 database 에 접근할 수 있는 메소드를 포함하며 SQL 쿼리를 지정할 수 있다.
◼ Annotation
@insert
Entity set 을 삽입한다.
@Entity로 정의된 class만 인자로 받거나, 그 class의 collection 또는 array 만 인자로 받을 수 있다.
인자가 하나인 경우 long type 의 return (insert 된 row Id)을 받을 수 있고, 여러 개인 경우 long[], List 을 받을 수 있다.
"onConflict = OnConflictStrategy.REPLACE" option 으로 update 와 동일한 기능을 할 수 있다.
@update
Entity set 을 갱신한다.
Return 값으로 업데이트된 행 수를 받을 수 있다.
@delete
Entity set 을 삭제한다.
Return 값으로 삭제된 행 수를 받을 수 있다.
@query
@Query를 사용하여 DB를 조회할 수 있다.
Compile time 에 return 되는 object 의 field 와 sql 결과로 나오는 column 의 이름이 맞는지 확인하여 일부가 match되면 warning, match 되는게 없다면 error를 보낸다.
'Android > Database' 카테고리의 다른 글
SQLite 에서 ROOM 까지 (9) - Architecture Components 구성을 위한 Repository, ViewModel 추가하기 (0) | 2020.09.15 |
---|---|
SQLite 에서 ROOM 까지 (8) - ROOM 의 3 구성요소(Database, Entity, Dao) 추가하기 (0) | 2020.09.09 |
SQLite 에서 ROOM 까지 (6) - DB 확인하기 (0) | 2020.08.25 |
SQLite 에서 ROOM 까지 (5) - SQLite 로 생성된 기존 DB 에 column 추가하기 (0) | 2020.08.20 |
SQLite 에서 ROOM 까지 (4) - SQLite 를 이용한 CRUD (0) | 2020.08.14 |
- Total
- Today
- Yesterday
- registerForContextMenu
- notifyDataSetChanged
- mPANDO
- android activity flag
- 앱테크
- WEMIX
- task 생성
- onCreateContextMenu
- 리워드앱
- M2E
- BroadcastReceiver
- bindservice
- 안드로이드 인텐트
- Intent
- 리워드 어플
- StringUtils
- 채굴앱
- android flag activity
- p2e
- 무료채굴
- 안드로이드 서비스
- StartService
- android task
- Android Service
- android intent
- 무료 채굴
- 앱테크 추천
- onContextItemSelected
- task
- RoomDatabase
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |