정말 정말 간단한 정보를 저장할 경우를 생각해봅시다.
예를 들어 자동 로그인 여부를 저장하고 싶은데 고작 이 true/false 값을 저장하려고 Room을 사용하는 건 닭 잡는데 소 잡는 칼 쓰는 격이라고 할 수 있습니다. 작은 일에 큰 노력을 들여야 한다는 것이죠ㅎㅎ
이럴 때는 Room이 아니라 sharedpreferences라는 것을 사용하면 됩니다.
반대로 대량의 데이터를 처리하게 될 경우는 Room보다 Realm을 사용하면 좋습니다. 속도도 빠르고 안정적이고 비동기 지원이 된다는 장점이 있으나 앱 용량이 커진다는 단점이 있어 상황에 맞게 사용하면 됩니다.
관계형 데이터베이스
이자 경량 데이터베이스다SQL
: RDB가 데이터를 조작, 제어하는 용도로 사용하는 언어SQL구문(쿼리)
: SQL언어로 쓴 명령어ORM(Object Relational Mapping)
: 객체(class)와 관계형 데이터베이스의 데이터(Table)을 매핑하고 변환하는 기술로 복잡한 쿼리를 잘 몰라도 코드만으로 데이터베이스의 모든 것을 컨트롤 할 수 있도록 도와줌Room
:안드로이드는 SQLite를 코드 관점에서 접근할 수 있도록 ORM 라이브러리인 Room을 제공함이쯤되면 SQLite와 Room은 무슨 차이가 있을지 궁금해진다. 왜 안드로이드 디벨로퍼에선 Room DB 사용하기를 SQLite보다 권장하는 걸까?
SQLite 단점
Room DB 장점
Entities
: 데이터베이스의 테이블 역할을 하는 클래스라고 보면됨. Entities클래스 하나 당 테이블 하나를 만드는 것DAO(Data Access Object)
:Room은 데이터를 읽고 쓰는 메서드를 인터페이스 형태로 설계하고 사용함. 코드 없이 이름만 명시하는 형태로 인터페이스를 만들면 Room이 알아서 나머지 코드 작성해줌 즉 DAO는 데이터베이스에 접근해서 DML쿼리(CRUD수행하는 쿼리)를 실행하는 메서드의 모음Room Database
:Room 라이브러리가 제공하는 데이터베이스인 RoomDatabase는 RoomDatabase를 상속받아 클래스(RoomHelper)를 만들면 됨. 추상클래스로 만들어야함Rest of The App
:나머지 부분 코드를 작성! id 'kotlin-kapt
추가plugins {
...
id 'kotlin-kapt'
...
}
implementation "androidx.room:room-ktx:2.3.0"
kapt "androidx.room:room-compiler:2.3.0"
테이블
:클래스 위에 @Entity라는 어노테이션을 작성하면 Room라이브러리가 @Entity어노테이션이 적용된 클래스를 찾아 테이블로 변환함. 데이터베이스에서 테이블명을 클래스명과 다르게 하고 싶을 떄는 @Entity(table="테이블명)으로 작성속성
:멤버변수 위에 @ColumnInfo 어노테이션을 붙이면 테이블의 컬럼(속성)이 된다는 걸 명시함. 컬럼명을 테이블의 속성명과 다르게 하고 싶을때는 @ColumnInfo(name="속성이름")기본키
:기본키로 만들고 싶은 속성 위에 @PrimaryKey 어노테이션을 붙이고 자동으로 값이 증가하는 옵션을 붙여서 @PrimaryKey(autoGenerate=true) @Dao
interface UserDao {
@Query("SELECT * FROM room_memo") // 테이블의 모든 값을 가져와라
fun getAll(): List<User>
@Query("DELETE FROM User WHERE name = :name") // 'name'에 해당하는 유저를 삭제해라
fun delete(name: String)
@Insert(onConflict = OnConflictStrategy.REPLACE) //기존에 저장되있던 Primary key의 데이터가 업데이트되면 insert안하고 걍 업데이트 해줌
fun insert(memo: RoomMemo)
}
@Database(entities = arrayOf(User::class, Student::class), version = 1)