본문 바로가기
개발/Android

[Android] Room 개념 정리 및 예제

by 1인용 놀이터 2025. 4. 23.
728x90
반응형

Room 이란?

Room은 스마트폰 내장 DB에 데이터를 저장하기 위해 사용하는 라이브러리이다.

Room은 SQLite를 활용하여 DB 데이터를 Java 또는 코틀린 객체로 매핑 해주며, DB를 구조적으로 분리하여 데이터 접근의 편의성을 높여주고 유지보수에 편리하다.

 

SQLite의 단점

 

위와 같은 이유로 구글에서는 SQLite 대신 Room 사용을 권장하고 있다.

 

Room 장점

  • SQL 쿼리의 컴파일 시간 확인
  • 반복적이고 오류가 발생하기 쉬운 상용구 코드를 최소화하는 편의 주석
  • 간소화된 데이터베이스 이전 경로

Room 구성요소

1. Entity 

  • Room에서 데이터베이스의 테이블을 나타내는 클래스
  • 각 Entity 클래스는 데이터베이스 내 테이블과 매피오디며, 클래스 내의 필드는 테이블 컬럼에 해당된다.

2. DAO

  • Data Access Object의 약자로 데이터에 접근할 수 있는 메소드를 정의 해 놓은 인터페이스이다.

3. Database

  • 데이터베이스를 보유하고 DB 생성 및 버전을 관리한다.
  • Room DB에서 DAO를 가져와서 객체를 통해 데이터를 CRUD 한다.

 

 

Room 사용 설정

앱에서 Room을 사용하려면 앱의 build.gradle 파일에 다음 종속 항목을 추가합니다.

dependencies {
    val room_version = "2.7.0"

    implementation("androidx.room:room-runtime:$room_version")

    // If this project uses any Kotlin source, use Kotlin Symbol Processing (KSP)
    // See Add the KSP plugin to your project
    ksp("androidx.room:room-compiler:$room_version")

    // If this project only uses Java source, use the Java annotationProcessor
    // No additional plugins are necessary
    annotationProcessor("androidx.room:room-compiler:$room_version")

    // optional - Kotlin Extensions and Coroutines support for Room
    implementation("androidx.room:room-ktx:$room_version")

    // optional - RxJava2 support for Room
    implementation("androidx.room:room-rxjava2:$room_version")

    // optional - RxJava3 support for Room
    implementation("androidx.room:room-rxjava3:$room_version")

    // optional - Guava support for Room, including Optional and ListenableFuture
    implementation("androidx.room:room-guava:$room_version")

    // optional - Test helpers
    testImplementation("androidx.room:room-testing:$room_version")

    // optional - Paging 3 Integration
    implementation("androidx.room:room-paging:$room_version")
}

 

기본 예제

1. Entity

다음 코드는 User 데이터 항목을 정의합니다. 각 User 인스턴스는 앱 데이터베이스의 user 테이블에 있는 행 하나를 나타냅니다.

  • 코틀린
@Entity
data class User(
    @PrimaryKey val uid: Int,
    @ColumnInfo(name = "first_name") val firstName: String?,
    @ColumnInfo(name = "last_name") val lastName: String?
)

 

  • 자바
@Entity
public class User {
    @PrimaryKey
    public int uid;

    @ColumnInfo(name = "first_name")
    public String firstName;

    @ColumnInfo(name = "last_name")
    public String lastName;
}

 

2. DAO

다음 코드는 UserDao라는 DAO를 정의합니다. UserDao는 앱의 나머지 부분이 user 테이블의 데이터와 상호작용하는 데 사용하는 메서드를 제공합니다.

  • 코틀린
@Dao
interface UserDao {
    @Query("SELECT * FROM user")
    fun getAll(): List<User>

    @Query("SELECT * FROM user WHERE uid IN (:userIds)")
    fun loadAllByIds(userIds: IntArray): List<User>

    @Query("SELECT * FROM user WHERE first_name LIKE :first AND " +
           "last_name LIKE :last LIMIT 1")
    fun findByName(first: String, last: String): User

    @Insert
    fun insertAll(vararg users: User)

    @Delete
    fun delete(user: User)
}
  • 자바
@Dao
public interface UserDao {
    @Query("SELECT * FROM user")
    List<User> getAll();

    @Query("SELECT * FROM user WHERE uid IN (:userIds)")
    List<User> loadAllByIds(int[] userIds);

    @Query("SELECT * FROM user WHERE first_name LIKE :first AND " +
           "last_name LIKE :last LIMIT 1")
    User findByName(String first, String last);

    @Insert
    void insertAll(User... users);

    @Delete
    void delete(User user);
}

 

3. Database

다음 코드는 데이터베이스를 보유할 AppDatabase 클래스를 정의합니다. AppDatabase는 데이터베이스 구성을 정의하고 영구 데이터에 대한 앱의 기본 액세스 포인트 역할을 합니다. 데이터베이스 클래스는 다음 조건을 충족해야 합니다

  • 클래스에는 데이터베이스와 연결된 데이터 항목을 모두 나열하는 entities 배열이 포함된 @Database 주석이 달려야 합니다
  • 클래스는 RoomDatabase를 확장하는 추상 클래스여야 합니다.
  • 데이터베이스와 연결된 각 DAO 클래스에서 데이터베이스 클래스는 인수가 0개이고 DAO 클래스의 인스턴스를 반환하는 추상 메서드를 정의해야 합니다
@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
}

 

@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
    public abstract UserDao userDao();
}
728x90
반응형

'개발 > Android' 카테고리의 다른 글

[Android] Service를 통한 Activity 전환  (0) 2025.05.09
[Android] Annotaion 개념 정리 및 예제  (0) 2025.05.07
[Android] RecyclerView ?  (0) 2025.04.11
[Android] ViewBinding 정리  (1) 2025.03.13
[Android] LayoutInflater 정리  (6) 2025.03.10