티스토리 뷰

728x90
반응형
SMALL

안녕하세요, 안드로이드 앱 개발자 여러분! 이번 블로그에서는 Room 라이브러리의 고급 기능과 실전적인 데이터베이스 설계에 대해 자세히 다뤄보겠습니다. Room은 안드로이드에서 SQLite를 효과적으로 활용할 수 있도록 도와주는 도구로, 고급 기능을 활용하면 더 복잡하고 강력한 데이터베이스를 설계할 수 있습니다.

1. Room 라이브러리의 고급 기능

1.1. 관계형 데이터베이스 설계

Room을 사용하면 엔터티 간의 관계를 정의하여 관계형 데이터베이스를 구축할 수 있습니다. 예를 들어, 일대다(1:N) 관계를 가지는 데이터를 표현하는 방법은 다음과 같습니다.

// One-to-Many 관계 예제

// 엔터티 1
@Entity(tableName = "users")
data class User(
    @PrimaryKey(autoGenerate = true)
    val id: Long = 0,
    val name: String
)

// 엔터티 2
@Entity(tableName = "user_addresses", foreignKeys = [ForeignKey(entity = User::class, parentColumns = ["id"], childColumns = ["userId"], onDelete = ForeignKey.CASCADE)])
data class UserAddress(
    @PrimaryKey(autoGenerate = true)
    val id: Long = 0,
    val street: String,
    val city: String,
    val userId: Long // 외래 키
)

1.2. 인덱스 추가

데이터베이스에서 특정 열을 검색하거나 정렬할 때 성능을 향상시키기 위해 인덱스를 추가할 수 있습니다.

// 인덱스 추가 예제

@Entity(tableName = "users")
data class User(
    @PrimaryKey(autoGenerate = true)
    val id: Long = 0,
    @Index // 인덱스 추가
    val name: String
)

1.3. 트랜잭션 처리

여러 개의 쿼리를 하나의 트랜잭션으로 묶어서 실행하면 데이터의 일관성을 유지할 수 있습니다.

// 트랜잭션 처리 예제

@Dao
interface UserDao {
    @Transaction
    @Query("SELECT * FROM users WHERE id = :userId")
    suspend fun getUserWithAddresses(userId: Long): UserWithAddresses
}

data class UserWithAddresses(
    @Embedded
    val user: User,
    @Relation(
        parentColumn = "id",
        entityColumn = "userId"
    )
    val addresses: List<UserAddress>
)

2. 실전적인 데이터베이스 설계

2.1. 데이터베이스 버전 관리

앱이 업데이트되면 데이터베이스의 스키마가 변경될 수 있습니다. Room은 데이터베이스 버전을 관리하여 업데이트 시 스키마를 업데이트할 수 있도록 지원합니다.

// 데이터베이스 버전 관리 예제

@Database(entities = [User::class], version = 2)
abstract class AppDatabase : RoomDatabase() {
    // ...
}

2.2. 마이그레이션 수행

데이터베이스 버전이 변경될 때, Room은 마이그레이션을 통해 이전 데이터를 새로운 스키마에 맞게 변환할 수 있습니다.

// 마이그레이션 예제

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

    abstract fun userDao(): UserDao

    companion object {

        // 이전 버전에서 현재 버전으로의 마이그레이션 수행
        private val MIGRATION_1_2 = object : Migration(1, 2) {
            override fun migrate(database: SupportSQLiteDatabase) {
                // 마이그레이션 코드 작성
            }
        }

        fun getDatabase(context: Context): AppDatabase {
            return Room.databaseBuilder(
                context.applicationContext,
                AppDatabase::class.java,
                "app_database"
            )
                .addMigrations(MIGRATION_1_2)
                .build()
        }
    }
}

2.3. 데이터베이스 초기화

앱이 처음 설치되었을 때 또는 데이터베이스가 초기화되어야 할 때 초기 데이터를 삽입할 수 있습니다.

// 데이터베이스 초기화 예제

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

    abstract fun userDao(): UserDao

    companion object {

        private val roomCallback = object : RoomDatabase.Callback() {
            override fun onCreate(db: SupportSQLiteDatabase) {
                super.onCreate(db)
                // 데이터베이스가 처음 생성될 때 수행할 작업 작성
            }
        }

        fun getDatabase(context: Context): AppDatabase {
            return Room.databaseBuilder(
                context.applicationContext,
                AppDatabase::class.java,
                "app_database"
            )
                .addCallback(roomCallback)
                .build()
        }
    }
}

마무리

이번 블로그에서는 Room 라이브러리의 고급 기능과 실전적인 데이터베이스 설계에 대해 살펴보았습니다. 관계형 데이터베이스 설계, 인덱스 추가, 트랜잭션 처리 등을 통해 안드로이드 앱에서 강력하고 효과적인 데이터베이스를 구축하는 방법을 학습했습니다. 또한 데이터베이스 버전 관리, 마이그레이션, 초기화 등의 주제를 다루어 더욱 안정적이고 확장 가능한 데이터베이스를 설계하는 방법을 알아보았습니다. 다음 글에서는 안드로이드 앱 개발의 더 다양한 주제와 최신 동향을 다뤄보겠습니다. Happy coding! Skill UP!! 🚀

728x90
반응형
LIST
반응형
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함