라떼는말이야

[Kotlin] Room 사용법 (Android에서 로컬 데이터베이스 사용하기) 본문

안드로이드

[Kotlin] Room 사용법 (Android에서 로컬 데이터베이스 사용하기)

MangBaam 2021. 7. 27. 01:15
반응형

Room은 안드로이드 개발 중 로컬 데이터베이스에 데이터를 저장하고자 할 때 사용한다.

 

만약 기기가 네트워크에 액세스할 수 없을 때 오프라인 상태인 동안에도 사용자가 여전히 콘텐츠를 탐색할 수 있으며 나중에 기기가 다시 온라인 상태가 되면 콘텐츠 변경사항이 서버에 동기화된다.

 

Room은 위와 같은 문제를 자동으로 처리하기 때문에 안드로이드 개발자 페이지에서는 SQLite 대신 Room을 사용할 것적극적으로 권장한다고 되어있다.

 

우선 Room을 사용하기 위해서는 환경 설정이 필요하다.


환경 설정

build.gradle(Module: app)

프로젝트 창을 보면 Gradle Scripts 내부에 build.gradle (Module: 앱 이름.app) 이 있다.

 

plugins 추가

plugins 추가

가장 상단에 plugins가 있는데

id 'kotlin-kapt'

를 추가한다.

 

Dependencies 추가

dependencies 추가

dependencies에 위 3개를 추가한다.

참고로 room_version은 

https://developer.android.com/jetpack/androidx/releases/room?hl=ko <- 여기서 확인 가능하다.

 

 

 

room 버전

현재 최신 버전은 21년 6월 16일의 2.3.0 버전이다.

왠만하면 안정화 버전을 사용할 것을 추천한다.

 

동기화 하기

Sync Now

이렇게 gradle 파일을 수정하고 나면 상단에 파일이 변경되었으니 싱크를 맞추라는 안내 문구가 나온다.

오른쪽의 Sync Now 버튼을 눌러 동기화를 시켜주면 Room을 사용할 준비가 끝났다.

 


Room 사용하기

Room을 사용하기 위해서는 3가지 파일이 작성되어야 한다.

  1. DB Entity (테이블) 정의
  2. DAO (쿼리) 정의
  3. 데이터베이스 정의

원활한 관리를 위해 dao와 model은 패키지로 묶었다.

위 사진에서 HistoryDao는 DAO, History는 DB Entity, AppDatabase는 데이터베이스이다.


DB Entity 정의

Entity는 실체(객체)이다. 흔히 데이터베이스에서 개념 스키마를 뜻하며 쉽게 테이블이라고 생각하면 될 것 같다.

 

코틀린 코드

@Entity
data class History(
    @PrimaryKey val uid: Int?,
    @ColumnInfo val expression: String?,
    @ColumnInfo(name = "new_result") val result: String?
)

data class를 정의하고, 그 위에 @Entity라는 어노테이션이 필요하다.

 

- Entity에는 하나 이상의 기본키를 설정해야 한다.

@PrimaryKey로 선언된 변수가 기본키이다.

 

기본키를 자동으로 할당하게 하려면 autoGenerate속성을 설정하면 되는데 자세한 사용법은 직접 찾아보길 바란다.

 

 

 

기본키는 복합키로 이루어질 수 있다. 이럴 경우 어노테이션에서 설정해준다.

-> @Entity(primaryKeys = arrayOf("firstName", "lastName"))

 

테이블 이름은 기본적으로 클래스 이름(예제에서는 History)이 된다.

만약 별도로 테이블 이름을 설정해주고 싶다면 어노테이션에서 설정 가능하다.

-> Entity(tableName = "users")

 

열로 사용할 변수 설정은 @CcolumnInfo로 가능하다. 이때 기본적으로 변수 이름이 열 이름이 된다.

만약 별도로 열 이름을 설정하고 싶다면 name 속성을 주면 된다.

-> @ColumnInfo(name = "first_name") val firstName: String? (예제에서 result)

 

DAO 정의

DAO는 Data Access Object의 약자이다.

DAO를 통해서 쿼리문을 사용해 데이터베이스의 데이터에 접근할 수 있다.

 

@Dao
interface HistoryDao {
	@Query("SELECT * FROM history")
	fun getAll(): List<History>

	@Insert
	fun insertHistory(history: History)

	@Query("DELETE FROM history")
	fun deleteAll()
}

 

 

 

DAO로 정의하기 위해선 @Dao라는 어노테이션이 필요하다.

그리고 DAO는 인터페이스로 작성된다.

 

@Query를 통해 직접 SQL을 작성할 수 있다.

 

그 외에도 @Insert @Delete @Update 등으로 간편하게 구현할 수 있는 기능을 제공한다.

활용 방법이 많으니 안드로이드 개발자 문서를 찾아보면 좋을 것 같다.

 

DB 정의

Entity와 DAO가 작성되었으니 마지막으로 Database를 작성한다.

Room에서 데이터베이스를 정의하기 위해서는 @Database를 사용하며 클래스는 추상 클래스로 작성되어야 한다.

그리고 추상 클래스는 RoomDatabase()를 상속해야 하며

매개 변수가 없는 추상 메서드를 포함해야 한다.

반환 값은 DAO

@Database(entities = [History::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
    abstract fun historyDao() : HistoryDao
}

어노테이션에는 데이터베이스와 연결된 항목의 목록과 버전을 포함해야 한다.

만약 entity가 여러 개일 경우 arrayOf를 사용해 여러 Entity를 묶는다.


코드에서 사용하기

데이터베이스의 틀이 잡혔기 때문에 이제 코드에서 데이터베이스를 다룰 수 있다.

 

코틀린에서 사용할 때 Room.databaseBuilder를 사용한다.

다음과 같다.

 

코틀린 코드

val db = Room.databaseBuilder(
        applicationContext,
        AppDatabase::class.java,
        "historyDB"
    ).build()

안드로이드 개발 시엔 onCreate 내부에서 선언해주면 된다.

만약 전역 변수로 사용하고 싶다면 다음과 같이 하면 된다.

lateinit val db: AppDatabase

 

 

 

 

Room.databaseBuilder의 매개변수는 Context, Class, name이 온다.

  • Context : 보통 Application context가 사용된다.
  • Class: @Database로 어노테이션 된 추상 클래스
  • name: 데이터베이스 파일의 이름

이렇게 DB 객체도 생성이 완료 되었다.

 

이 db를 사용하는 방법은 다음과 같다.

db.historyDao().getAll()

db에서 DAO를 접근하고, DAO에서 쿼리 인터페이스를 접근하면 된다.

반응형
Comments