본문 바로가기
Android/Android Development

Android Room

by 2Plus 2020. 6. 2.

Photo by [Alexandra Gorn] on [Unsplash]

 

Room이란?

 Room은 SQLite를 편하게 사용할 수 있도록 하는 wrapper라고 생각하면 된다. Room은 Persistence 라이브러리로, SQLite를 사용하는 추상화 계층을 제공하여 SQLite의 모든 기능을 사용할 수 있는 다양한 DB Access가 가능하도록 해 준다.

 

 

Room을 사용해야 하는 이유

  • 컴파일 타임 체크를 제공
  • LiveData를 함께 사용하기에 편리
  • 구현하고 사용하기가 편리
  • 사용시 쓸데 없이 많은 코드 불필요

 

 

Room의 기본 컴포넌트

  1. Entity
  2. DAO
  3. Databse

 Room의 기본 컴포넌트는 위와 같이 세 가지 요소가 있다.

 

Entity

 Database에서 사용할 테이블과 매칭되는 Kotlin(또는 Java) 클래스

 

DAO

 get, store 등과 같이 Database access 관련 작업을 하는 interface이다. annotation을 사용하고 interface 형태로 작성해놓으면 실제 구현은 Room이 알아서 하게 된다.

 

Database

 RoomDatabase를 확장하는 추상 클래스로, 여기에 DB 테이블(Entity)과 DB의 버전 넘버링을 정의하도록 되어 있다. DB Holder를 포함하며 연결의 기본 액세스 포인트 역할도 한다. DB의 버전이 올라갈 때 (DB의 항목이나 구조 변경 시) 어떻게 처리할 지도 다룰 수 있다.

 

 

Android Studio Dependency

 

 Android Studio에서 앱 개발시 Room을 사용하기 위해서는 build.gradle(Module)의 dependency scope에 위의 세 줄을 추가해주면 된다.

 

 

 

 Rx와 함께 사용하는 것은 나중에 따로 글을 작성할 예정인데, 우선 RxKotlin과 함께 사용하려면 이것도 추가해주면 된다.

 

 

Room 사용 예시

 다양한 annotation들을 사용할 것인데 Entity annotation 관련해서는 다른 글에 따로 간단하게 정리를 해 놓을 예정이다. 우선 이 글에서은 어떤 식으로 사용하는 지 파악하기 위해 예시를 보며 정리를 한다.

 

Entity

 

 먼저, database에 저장할 테이블을 표현해 줄 entity class를 위와 같이 생성한다. 이러한 클래스는 꼭 Entitiy annotation과 함께 정의해줘야 한다. 그래야 Room이 이 클래스를 table로 인식할 수 있다. 생성한 각 엔티티에 맞는 DB를 사용하여 테이블이 작성된다. Room은 기본적으로 각 필드에 대한 열을 생성하지만 Ignore Annotation을 사용하면 필드 생성을 방지할 수도 있다.

 각 Entity는 DB에서 사용할 하나 이상의 기본 키를 정의해줘야 한다. PrimaryKey Annotation을 사용해서 정의해주면 된다.

 별도의 지정이 없으면 Room은 클래스 이름을 테이블의 이름으로 사용하게 되어 있다. 하지만 tableName property를 사용하면 테이블의 이름을 직접 지정할 수도 있다.

 엔티티 간의 관계, 중첩, 2개 이상의 기본 키 생성 등 여러 다양한 기능을 사용할 수도 있다.

 다음 안드로이드 디벨로퍼 페이지에 이러한 것들이 상세하게 정리되어 있으니 사용시 참고하면 좋을 것 같다.
https://developer.android.com/training/data-storage/room/defining-data

 

DAO

 

 DAO는 Data Access Object를 뜻한다. DAO는 database에 접근할 때 사용된다.

 엑세스하기 위해서는 Dao가 annotation 되어 있는 interface가 필요하다. 여기서도 마찬가지로 annotation을 통해 Room이 DAO를 파악하도록 되어 있다. 각 DAO는 앱의 DB에 엑세스할 수 있는 abstract function이 포함된다.

 쿼리 빌더나 직접 쿼리를 생성하지 않고 DAO를 사용하면 DB 아키텍트의 여러 다른 컴포넌트들을 쉽게 분리할 수 있는 장점과 쉽게 mocking할 수 있어서 테스트가 편리해진다는 장점이 있다.

 Room은 컴파일 타임에 DAO를 실제로 구현해서 빌드한다.

 DAO를 사용하여 매개변수를 포함한 쿼리를 수행하고, 열의 subset을 반환하거나 컬렉션을 전달할 수 있는 등 여러 작업을 더 많이 수행할 수 있다.

 DAO도 마찬가지로 안드로이드 디벨로퍼 페이지에서 더 상세히 정리된 것들을 참고할 수 있다.
https://developer.android.com/training/data-storage/room/accessing-data.html

 

Databse

 

 마지막으로 Database annotation을 해줘야 하는 Database 클래스까지 만들면 된다. Database 클래스는 DAO 인터페이스 사이를 그룹화 시켜준다. Database의 버전을 명시해줘야 하는데, 이를 통해 버전을 파악하고 데이터베이스 마이그레이션 등의 작업을 진행해줄 수 있다.

 RoomDatabase는 싱글턴 디자인 패턴으로 구현해야 한다. 인스턴스가 꽤 비싸고 여러 인스턴스에 액세스 할 필요가 없기 때문이다. 또, RoomDatabase를 확장한 형태의 abstract function으로 선언해야 한다.

 

 

Type Converter

 

 Room과 SQL이 어떻게 serialize 해야 할 지 모르는 property의 경우는 Type Converter를 생성해서 문제를 해결할 수 있다.

 

 

Entity 정리, LiveData, Coroutine, RxKotlin 등과 연동하는 방법은 추후에 따로 글로 작성하도록 할 예정이다.

 

 

반응형

댓글