본문 바로가기
Android 개발/Realm, Room, Databases

Room Persistence Library에 대해서 정리해 봅니다 #Android #SQLite

by Developer88 2020. 4. 29.
반응형

오늘은 andoird의 Room에 대해서 정리해 보도록 하겠습니다.

개인적으로는 Realm을 선호하기는 하지만,

Android Architecture Library의 LiveData나 ViewModel과

함께 잘 사용할 수 있는 라이브러리라는 점에서는 매력적이라고 생각합니다.

 

1. Room

정식명칭은 Room Persistence Library이구요.

ORM(Object Relational Mapping)으로

사용하기 쉽게 데이터베이스를 객체로 매핑해주는 역할을 합니다.

SQLite를 Annotation을 이용해서 좀 더 사용하기 쉽게 추상화했다고 보면 될 것 같은데요.

 

2. Room의 3가지 Components

Room에는 3가지 주요 Component가 있는데요.

가볍게 한번 정리하고 지나가겠습니다.

2-1. Entity

Room에서의 Entity는 관계형 데이터에서의 Table과 같은데요.

Table은 데이터 베이스를 구성하는 하나의 요소이기도 합니다.

2-2. Database

관계형 데이터 베이스의 액세스 포인트이며, 데이터베이스 홀더인데요.

위의 Entity, 관계형 데이터베이스에서의 Table들이 묶인 것이 바로 이 Database이지요.

RoomDatabase클래스를 상속받는 abstract Class 이구요.

entity의 리스트들을 가지고 있습니다.

2-3. Dao

예전 SQLite를 사용할 때 많이 쓰던 클래스인데요.

데이터베이스에 액세스 하는데 필요한 메소드들을 가지고 있습니다.

최종적으로 앱에서 데이터를 얻어오거나 쓰기 위해서,

이 클래스의 함수들을 이용하게 됩니다.

 

이제 중요 구성요소에 대해 이해했으니,

본격적으로 라이브러리를 추가하고, 직접 코드를 보면서 이해해 보도록 하겠습니다.

 

3. Room 라이브러리 Implement

Room과 관련해서는 몇가지 라이브러리를 추가해 주어야 하는데요.

보통 DB를 위한 라이브러리보다는 조금 많습니다.

가장 처음이 room-runtime라이브러리이구요.

annotation을 위한 kapt그리고 kotlin Extenstion을 위한 room-ktx라이브러리가 있지요.

마지막 줄은 test를 위한 라이브러리 입니다.

dependencies {
  def room_version = "2.2.5"

  implementation "androidx.room:room-runtime:$room_version"
  kapt "androidx.room:room-compiler:$room_version" 
  implementation "androidx.room:room-ktx:$room_version"

  testImplementation "androidx.room:room-testing:$room_version"
}

 

 

4. 3가지 Component의 구현

Room라이브러리를 구현한다는 것은 위에서 언급한 3개의 Component를 구현하는 것 인데요.

Data class를 시작으로 하나씩 구현해 보도록 하겠습니다.

 

4-1. Data Class 작성

DB에 관련된 코드는 Data클래스부터 작성하게 됩니다.

Room에서는 Table을 data클래스로 매핑해서 작성해 놓은 것이 Entity입니다.

 

Room에서 사용하는 Data클래스는 아래와 같이 @Entity annotation을 붙여 주어야 하는데요.

data클래스를 이용해 테이블과 매핑하는 것이라고 볼 수 있습니다.

관계형 DB의 핵심인 PrimaryKey는 @PrimaryKey라고 하는 애노테이션을 붙이구요.

각 Column에 대해서는 @ComlumnInfo라는 Annotation을 이용해서 사용해 줍니다.

테이블안에 컬럼명을 다르게 설정하기 위해서는 "name"을 다른 값으로 아래와 같이 사용할 수 있습니다.

 

참고로 PrimaryKey가 자동으로 생성되게 하기 위해서는 annotation을 아래와 같이 설정해 주면 됩니다.

 

 

위에서 사용할 수 있는 애노테이션 이외에도 사용할 수 있는 키워드가 많이 있는데요.

@Ignore를 사용하면 해당 필드는 무시할 수 있구요.

@foreignKey를 이용해, parentColums와 childColumns를 아래와 같이 사용할 수도 있습니다.

 

 

4-2. Dao

이제 DB에 액세스하는 메소드들을 만들어 보겠습니다.

SQL쿼리를 미리 함수에 저장해 놓았다가 사용하는 것으로 생각해 볼 수 있는데요.

아래와 같이, Query 애노테이션에 괄호를 열고 SQL문을 적어 줍니다.

 

CRUD를 간단하게 아래와 같이 구현해 볼 수 있습니다.

참고로 "vararg" 키워드는 kotlin에서의 가변인자를 가르킵니다.

메소드의 인자로 받은 변수는 ":"(콜론)을 이용해서 애노테이션의 Query문에서 사용할 수 있습니다.

예를 들어, 아래의 loadAllByIds는 studentIds를 인자로 받아서 사용하고 있구요.

그 아래의 findByName메소드는 first와 last를 인자로 받아서 LIKE로 사용하고 있습니다.

 

여기서는 Insert, Update, Delete, Query 애노테이션을 이용해서,

아래 이미지와 같이 CRUD를 구현할 수 있습니다.

 

 

 

4-3. Database

이제 마지막 컴포넌트인 Database를 구현해주면 되겠는데요.

studentDatabase파일을 아래와 같이 만들었습니다.

@Database 애노테이션을 사용하구요.

entities에는 앱내에서 사용하는 entity들을 array형태로 넣어주면 되는데요.

 

 

이제 이렇게 생성한 studenDatabase를 객체로 만들어서 사용해주면 되는데요.

참고로 아래의 fallbackToDestructiveMigration()은 데이터 베이스가 수정되면,

기존 데이터를 삭제하는 메소드인데요.

그렇지 않고 Migration을 해 줄 경우에는 addMigration메소드를 사용해 주면 됩니다.

 

 

공식문서에서는 아래와 같이, RoomDatabase 객체를 만드는 것은 비싼 작업으로,

싱글턴 패턴을 사용하는 것을 추천하고 있습니다.

 

 

싱글턴 패턴을 이용하기 위해서 companion object를 사용하는 것도 방법이지만,

Koin같은 Dependency Injection을 이용하는 것도 좋을 것 같은데요.

굳이 DI를 사용하지 않으실 분들은 아래 부분은 패스하셔도 무방합니다.

4-4. Koin을 이용한 객체 주입

 

참고로 Koin에 관해서는 아래 글을 참조해 주시구요.

>> KOIN을 이용한 Dependency Injection (DI) 구현하기

아래와 같이 Koin을 사용해 볼 수도 있을 것 같습니다.

먼저 StudentDatabase객체를 만들어 주는 클래스를 만들구요.

아래와 같이 Koin Module을 구현해 줍니다.

 

 

 

그 다음 ApplicationClass에서 startKoin을 해주면 되겠지요.

 

이제, 다음과 같이 객체를 주입해 줍니다.

 

 

이렇게 주입된 객체를 아래와 같이 사용해 주기만 하면 되겠습니다.

 

 

이상으로 Room Persistence Library에 대해서 정리해 보았구요.

더 좋은 내용이 있다면, 이 글을 통해서 업데이트 하도록 하겠습니다.

 

728x90

댓글0