[kotlin] Room 라이브러리의 데이터베이스에서의 관계 설정 방법

Room 라이브러리를 사용하여 안드로이드 앱의 데이터베이스를 관리할 때, 다양한 테이블 사이의 관계를 설정할 수 있습니다. 이 글에서는 Room에서 데이터베이스의 관계를 설정하는 방법에 대해 알아보겠습니다.

1. 일대다 관계 설정하기

Room에서 일대다 관계는 @Relation 어노테이션을 사용하여 설정할 수 있습니다. 예를 들어, 하나의 엔터티가 다수의 하위 엔터티를 가지는 경우에 해당합니다.

data class Library(
    @Embedded val library: LibraryEntity,
    @Relation(
        parentColumn = "libraryId",
        entityColumn = "libraryOwnerId"
    )
    val books: List<BookEntity>
)

위의 예시에서 Library 엔터티는 LibraryEntity를 포함하고 있으며, libraryIdlibraryOwnerId 컬럼을 기반으로 BookEntity의 리스트를 가져오게 됩니다.

2. 다대다 관계 설정하기

데이터베이스의 다대다 관계는 중간 테이블을 사용하여 정의됩니다. Room에서는 @Ignore 어노테이션과 함께 중간 엔터티를 사용하여 다대다 관계를 구현할 수 있습니다.

data class UserWithPlaylists(
    @Embedded val user: UserEntity,
    @Relation(
        parentColumn = "userId",
        entity = PlaylistEntity::class,
        entityColumn = "playlistId",
        associateBy = Junction(
            value = UserPlaylistCrossRef::class,
            parentColumn = "userId",
            entityColumn = "playlistId"
        )
    )
    val playlists: List<PlaylistEntity>
)

위의 예시에서 UserWithPlaylists 엔터티는 UserEntity를 포함하고 있으며, 중간 엔터티 UserPlaylistCrossRef를 사용하여 PlaylistEntity의 리스트를 가져오게 됩니다.

3. 하나의 엔터티에 여러 관계 설정하기

하나의 엔터티에서 여러 관계를 설정해야 하는 경우 @Relation 어노테이션을 여러 번 사용할 수 있습니다. 예를 들어, 하나의 엔터티가 여러 하위 엔터티를 가지고 있으며, 각 하위 엔터티와의 관계를 설정해야 할 때 해당합니다.

data class SchoolWithTeachersAndStudents(
    @Embedded val school: SchoolEntity,
    @Relation(
        parentColumn = "schoolId",
        entityColumn = "schoolOwnerId"
    )
    val teachers: List<TeacherEntity>,
    @Relation(
        parentColumn = "schoolId",
        entityColumn = "schoolOwnerId"
    )
    val students: List<StudentEntity>
)

위의 예시에서 SchoolWithTeachersAndStudents 엔터티는 SchoolEntity를 포함하고 있으며, teachersstudents 리스트를 각각 가져오게 됩니다.

이와 같이 Room 라이브러리를 사용하여 안드로이드 앱의 데이터베이스에서 관계를 설정하는 방법에 대해 알아보았습니다. 이러한 관계 설정을 통해 데이터베이스를 효율적으로 구성하고, 데이터를 관리하는데 도움이 될 것입니다.

참고 자료: Android Developers - Define relationships between objects