안드로이드에선 데이터베이스를 다루는 데 사용되는 SQLite 라이브러리는 안드로이드에서 기본으로 제공된다. 하지만 SQLite 라이브러리는 사용이 까다로운 경우가 있고, 특히 ORM(Object Relational Mapping)을 지원하지 않기 때문에 데이터베이스 작업을 수행하기 어려울 수 있다. 이러한 문제를 해결하기 위해 Google에서 개발한 ORM 라이브러리가 바로 "Room"이다. Room은 SQLite의 기능을 최대한 활용하면서 ORM 패턴을 사용하여 데이터베이스 작업을 보다 쉽게 처리할 수 있도록 도와준다.

<aside> 💡 ORM : 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑해주는 것.

</aside>

Room의 구성

Room은 데이터베이스(Database), DAO(Data Access Object) 및 엔티티(Entity) 세 가지 주요 구성 요소로 구성됩니다. 데이터베이스는 앱에서 사용할 데이터베이스를 정의하며, DAO는 데이터베이스에 액세스하기 위한 메서드를 포함한다. 엔티티는 데이터베이스에 저장되는 테이블을 나타내는 클래스다.

Dependencies

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

Entity

데이터베이스 테이블을 나타내는 클래스에 붙이는 주석이다. @Entity 주석을 사용하여 데이터베이스 테이블의 스키마를 정의할 수 있다. 엔티티 클래스의 속성은 데이터베이스의 열과 일치한다.

@Entity(tableName = "word_table")
class Word(@PrimaryKey @ColumnInfo(name="word") val word: String)

@PrimaryKey

모든 항목에는 기본 키(PK)가 필요하다. 위 코드에선 word가 PK로 설정되어 있다.

@ColumnInfo

멤버 변수 이름과 다르게 하려는 경우 테이블의 열 이름을 지정한다. 위 코드에선 열 이름을 word 로 지정한다.

DAO

DAO(Data Access Object)에서 SQL 쿼리를 지정하여 메서드 호출과 연결한다. 컴파일러는 SQL을 확인하고

@Insert 등 주석으로 쿼리를 생성한다. Room은 DAO를 이용하여 코드를 깔끔한 API로 만든다.

@Dao
interface WordDao {
		@Query("SELECT * FROM word_table ORDER BY word ASC")
		fun getAlphavetizeWords(): Flow<List<Word>>

		@Insert(onConflict = OnConflictStrategy.IGNORE)
		suspend fun insert(word: Word)

		@Query("DELETE FROM word_table")
		suspend fun deleteAll()

}