Learn & Run

Jetpack - Room (2) 본문

Android

Jetpack - Room (2)

iron9462 2021. 7. 15. 21:00

이전 포스팅에서 간단하게 SQLite 데이터베이스를 사용해보면서 어떤점이 개선되어야 하면 좋을 것 같은지 살펴보았다. 그러면 Jetpack에 포함된 Room 라이브러리를 사용해보면서 앞서 언급한 문제들을 해결해줄 수 있을지 확인해 보도록 하자. 이번 포스팅에서는 Room에 대해 소개해보려고 한다.

 

 

Room이란 무엇일까? 

 

Room은 기기 내에서 사용하는 데이터베이스를 편리하게 사용할 수 있는 라이브러리이다. 앞서 SQLite 데이터베이스를 사용해 보았는데, 우리는 왜 Room을 사용해야하는지 아래 이미지를 통해 확인할 수 있다.

참고 : https://www.google.com/url?client=internal-element-cse&cx=000521750095050289010:zpcpi1ea4s8&q=https://developer.android.com/training/data-storage/sqlite%3Fhl%3Dko&sa=U&ved=2ahUKEwj7z-bPkrHyAhVvy4sBHWsaAu8QFjAFegQIAxAC&usg=AOvVaw1wAw8s_Mdbzqj1rFIInzgO

한마디로 Room 라이브러리를 사용하면 위와 같은 문제들을 개선 또는 해결할 수 있다는 것이다. 이러한 이유로 Google에서는 Room의 사용을 권장한다. 

 

 

SQLite에 비해서 어떤 것들이 달라졌을까?

 

https://medium.com/androiddevelopers/incrementally-migrate-from-sqlite-to-room-66c2f655b377

 

Incrementally migrate from SQLite to Room

Migrate your complex database to Room with manageable PRs.

medium.com

 

 

Room 구성 요소 (Entity, Dao, Database)

 

위의 이미지에 나와있는것 처럼 Room은 3가지의 주요 컴포넌트로 구성요소를 갖고있습니다.

안드로이드 문서에 나와있는 내용들을 살펴보고 실제 구현한 코드를 보고 어떻게 사용하는지 확인해보도록 합니다.

 


1. Database

 

  • Database Holder를 포함하며, App에 영구적으로 저장되는 data와 기본 연결을 위한 주 엑세스 포인트 역할
  • @Database로 어노테이션된 클래스는 다음의 조건을 만족해야 한다.
    • Roomdatabase를 상속(extends)받는 클래스는 추상 클래스이어야 한다
    • 주석 내에 DB와 연결된 Entity 목록과 버전을 포함(entities=[entity1::class, entity2::class], version=1)
    • 인수가 0개인 추상메서드를 포함하고, return은 @Dao로 주석처리된 DAO인스턴스를 반환 (abstract fun dao() : Dao)
  • 런타임 시 Room.databaseBuilder() 또는 Room.inMemoryDatabaseBuilder()로 Database 인스터스를 얻음

참고 : https://github.com/Imabubblyiron/boostcourse-android/blob/master/app/src/main/java/com/boostcourse/iron/data/database/MovieRoomDatabase.java

 

 

2. Entity

 

  • 데이터베이스 내에서 테이블 구조를 표현하는 @Entity 애노테이션이 설정된 Java/Kotlin 클래스
  • 각 Entity에 대한 항목(Itme)을 보관하기 위해 연결된 Database 객체 내에 테이블이 생성된다
  • 데이터베이스 클래스의 @Database 애노테이션에 설정된 Entity Array를 통해 Entity 클래스 참조

참고 : https://github.com/Imabubblyiron/boostcourse-android/blob/master/app/src/main/java/com/boostcourse/iron/data/database/entity/MovieEntity.java

 

 

3. DAO (Data Access Object)

 

  • Room에서는 SQL을 이용한 직접적인 쿼리 접근 방식이 아닌 DAO를 이용해서 DB에 접근해야합니다.
  • 즉, DAO는 데이터베이스에 접근할 수 있는 메소드를 포함하며, 데이터 접근 객체
  • DAO는 Interface(인터페이스) / abstract class(추상 클래스)로 구현
  • 기존 SQLite Query의 큰 문제는 컴파일 시 쿼리상의 오류를 발견하지 못한다는 점이였는데,
    Room DAO는 작성된 쿼리의 오류를 컴파일 시점에 발견하여 조기에 오류를 수정할 수 있다는 점이 큰 장점
  • Entity 자동완성을 지원하여 Query 작성시에 오타 확률을 크게 줄여줌
  • Room을 사용해 App의 데이터에 접근하려면 DAO를 사용

참고 : https://github.com/Imabubblyiron/boostcourse-android/blob/master/app/src/main/java/com/boostcourse/iron/data/database/dao/MovieDao.java

 

 

4. 실제 사용

 

참고 : https://github.com/Imabubblyiron/boostcourse-android/blob/master/app/src/main/java/com/boostcourse/iron/data/DatabaseManager.java

 

 

예제 코드는 아래 문서를 통해서 직접 사용해보도록 합니다.

 

https://developer.android.com/training/data-storage/room?hl=ko#groovy 

 

Room을 사용하여 로컬 데이터베이스에 데이터 저장  |  Android 개발자  |  Android Developers

Room 라이브러리를 사용하여 더 쉽게 데이터를 유지하는 방법 알아보기

developer.android.com

 

 

실제 사용해보니 SQLite보다 나은점은 어떤 것이 있을까? 

 

  • 하드코딩하던 SQLite에 비해 일관성있는 DAO(Insert, Select, Update, Delete) 코드를 구성할 수 있다.
  • SQLite는 컴파일 중 유효성 검사를 못하지만, Room은 유효성 검사 기능이 있어 가능합니다.
  • Schema가 변경될 시 자동으로 업데이트 해줍니다.
  • 결과물을 클래스로 맵핑하여 데이터를 처리할 수 있다.
  • LiveData와 RX-Java 를 위한 Observation 생성 및 동작을 가능하게 합니다.