Developing Myself Everyday

Room 이란?


데이터베이스에 데이터를 가져오려면 기본적으로 우리는 서버를 거치고 REST API를 사용해야 한다. 이렇게 되면 데이터베이스에 접근이 불편하고 번거롭다. 그리고 컴파일 타임에서 오류를 검출할 수 없게 된다. 

 

Room은 이런 번거로움을 한번에 해결해준다. Room은 안드로이드 영구 저장소 솔루션 중 하나로, SQLite 데이터베이스 위에 구축된 ORM(Object-Relational Mapping) 라이브러리이다. Room은 데이터베이스 작업을 쉽게 수행할 수 있도록 추상화된 인터페이스를 제공하며, 데이터베이스 스키마를 객체로 표현하여 개발자가 직접 SQL 쿼리를 작성하는 번거로움을 줄여준다.

 

Room의 주요 구성 요소는 다음과 같다:

  1. Entity(엔티티):
    • 데이터베이스 테이블과 매핑되는 객체로, 데이터베이스의 각 행을 나타낸다.
    • @Entity 어노테이션을 사용하여 클래스를 엔티티로 표시하고, 필요한 열(column)을 멤버 변수로 정의한다.
  2. DAO(Data Access Object):
    • 데이터베이스 작업을 수행하는 메서드의 집합이다.
    • @Dao 어노테이션을 사용하여 인터페이스를 DAO로 표시하고, 작업에 필요한 SQL 쿼리를 메서드로 정의한다.
    • Room은 이러한 메서드를 실행할 때 필요한 SQL 쿼리를 자동으로 생성하여 실행한다.
  3. Database(데이터베이스):
    • 실제 SQLite 데이터베이스와의 연결을 담당하는 클래스다.
    • @Database 어노테이션을 사용하여 추상 클래스로 표시하고, 데이터베이스의 버전 및 엔티티와 DAO를 지정한다.
    • 데이터베이스 객체를 얻기 위해 Room.databaseBuilder() 메서드를 사용하여 데이터베이스를 빌드한다.

 

 

MVVM - 저장소 패턴에 Room 사용


MVVM Repository 패턴에 Room을 사용해서 사용자의 정보를 저장해 회원가입하고 로그인하는 간단한 코드를 작성해 보겠다.

 

 

Entity 생성

첫 번째로 해야할 일은 엔티티 클래스를 정의하는 것이다. 데이터베이스 테이블의 열과 해당하는 필드를 가지게 된다.

 

import androidx.room.Entity
import androidx.room.PrimaryKey

@Entity(tableName = "users")
data class User(
    @PrimaryKey val email: String,
    val password: String
)

 

위의 코드에서 User 클래스는 users 테이블과 매핑되는 엔티티이다. @Entity 어노테이션을 사용해 테이블 이름을 지정하고 @PrimaryKey 어노테이션을 사용해 주요 식별자를 정의한다.

 

 

DAO (Data Access Object) 생성

다음은 데이터베이스 작업을 수행하는 DAO 인터페이스를 정의해야 한다. 여기서는 사용자에 대한 CRUD 작업을 수행하는 메서드를 추가한다.

 

import androidx.room.Dao
import androidx.room.Insert
import androidx.room.Query

@Dao
interface UserDao {
    @Insert
    suspend fun insertUser(user: User)

    @Query("SELECT * FROM users WHERE email = :email")
    suspend fun getUserByEmail(email: String): User?
}

 

위의 코드에서 UserDao 인터페이스는 @Dao 어노테이션을 사용해 DAO 인터페이스임을 표시한다. @Insert 어노테이션은 사용자를 삽입하는 회원가입 메서드를 정의하고 @Query 어노테이션은 사용자를 Email로 조회해 로그인 기능을 정의한다.

 

 

데이터베이스 클래스 정의

세번째는 Room 데이터베이스를 나타내는 추상 클래스를 정의하고 데이터베이스의 인스턴스를 싱글톤으로 정의한다.

 

@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {

    abstract fun userDao(): UserDao

    companion object {
        @Volatile
        private var database: AppDatabase? = null

        fun getDatabase(context: Context): AppDatabase {
            return database ?: synchronized(this) {
                val instance = Room.databaseBuilder(
                    context.applicationContext,
                    AppDatabase::class.java,
                    "app_database"
                ).build()
                database = instance
                instance
            }
        }
    }
}

 

위의 코드에서 AppDatabase 클래스는 @Database 어노테이션을 사용해 데이터베이스임을 나타낸다. entities 매개변수에는 엔티티 클래스의 배열을 전달하고 version 매개변수에는 데이터 베이스 버전을 지정한다. abstract 키워드를 사용해 추상 DAO 메서드를 정의한다.

 

그리고 companion object를 통해 AppDatabase 인스턴스를 제공하는 메서드를 정의한다. 이 메서드를 통해 AppDatabase 인스턴스를 싱글톤으로 가져올 수 있다.

 

@Volatile 은 싱글톤 구현시 해당 데이터가 메모리에만 존재하도록 명시하는 기능을 가진다.


 

 

다음 게시글에서는 Hilt에 대해 알아보고 Hilt를 사용해서 어떻게 의존성을 주입하는지 알아보도록 하겠다.

 

 

 

[2] MVVM Repository에 Room과 Hilt 사용하기

이 게시글은 아래의 게시글에서 이어진 내용입니다. [1] MVVM Repository에 Room과 Hilt 사용하기 만약 MVVM Repository 패턴에 대한 이해가 부족하다면 아래의 게시글을 갔다가 오기 바란다. MVVM Pattern with Re

everyday-develop-myself.tistory.com

'Android > Kotlin' 카테고리의 다른 글

Generics (제네릭)  (0) 2023.06.29
[2] MVVM Repository에 Room과 Hilt 사용하기  (0) 2023.06.19
[Kotlin Coroutine] (6) - 채널 2  (0) 2023.06.08
RxJava에 대해  (0) 2023.06.06
[Kotlin Coroutine] (5) - Channel (채널)  (2) 2023.06.06
profile

Developing Myself Everyday

@배준형

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!