본문 바로가기
ANDROID/Android Jetpack

[Android/Jetpack] AAC - Room

by 주 녕 2021. 8. 3.
반응형

https://developer.android.com/

Room

Google에서 제공하는 ORM(Object-relational mapping)

SQLite에 대한 추상화 레이어를 제공하여 원활한 데이터베이스 액세스를 지원하며 SQLite를 완벽히 활용함

실행 기기에 앱 데이터 캐시를 만들고 네트워크 연결 여부와 관계없이 사용자가 콘텐츠를 탐색할 수 있음

 

🙋‍♀️ ORM이란?

Object Relational Mapping, 객체-관계 매핑

  • 객체 지향 프로그래밍은 클래스를 사용하고 관계성 데이터 베이스에서는 테이블을 사용하기 때문에 객체 모델과 관계형 모델 간에 불일치가 발생
  • ORM은 객체 간의 관계를 바탕으로 SQL을 자동으로 생성하여 불일치를 해결함
  • 즉, 객체를 통해 간접적으로 데이터 베이스의 데이터를 다룸
  • Persistant API라고도 할 수 있음

🙋‍♀️ Persistence(영속성)이란?

데이터를 생성한 프로그램이 종료되더라도 사라지지 않는 데이터의 특성

→ 영속성을 가지지 않는 데이터는 프로그램 종료 시 소멸

 

SQLite보다 Room을 사용해야 하는 이유?

  • 컴파일 타임에 SQL에 대한 유효성 검사가 가능하다.
  • Schema 변경 시, 자동으로 업데이트가 가능하다.
  • boilerplate code 없이 ORM 라이브러리를 통해서 Java나 Kotlin 객체에 매핑할 수 있다.
  • Observation을 위한 LiveData 등과 함께 작동하도록 구축되었다.

 

Room의 3가지 요소

1. Room Database

  • 기본 SQLite 데이터베이스에 대한 엑세스 포인트 역할
  • 데이터베이스 작업 단순화
  • RoomDatabase를 확장하는 추상 클래스로 사용하며 보통 싱글톤 패턴으로 정의함

[ Annotation ]

  • @Database : 해당 클래스가 Database 임을 알려주는 어노테이션
    • entites : 해당 Database에 어떤 테이블이 있는지 명시하는 속성
    • version : Scheme가 바뀔 때 해당 속성을 변경해야 함
    • exportSchema : Room의 Schema 구조를 폴더로 export할 것인가에 대한 속성

 

2. DAO (Data Access Objects)

  • 데이터베이스에 엑세스하는데 사용되는 메서드를 정의하는 클래스
  • 사용자가 DAO의 함수를 호출하면 Room Database에서 해당 함수의 작업을 실행

[ Annotation ]

  • @Insert : 삽입 - @Entity로 정의된 클래스 객체, 해당 클래스의 collection, array만 인자로 받을 수 있음
  • @Update : 업데이트 - return 값으로 업데이트된 행의 개수를 반환 받을 수 있음
  • @Delete : 삭제 - return 값으로 삭제된 행의 개수를 반환 받을 수 있음
  • @Query : 쿼리 - 쿼리문을 작성하여 실행할 수 있음

 

3. Entity

  • 데이터베이스 내의 DB 테이블을 나타냄

[ Annotation ]

  • @Entity : 테이블 선언
    • tableName : 테이블 명, 기본으로 클래스 명이 테이블 명이 됨
  • @ColumnInfo : 컬럼 선언
    • name : 컬럼 명, 기본으로 argument 명이 column 명이 됨
  • @PrimaryKey : 테이블의 PK 

 

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

  1. 앱은 Room DB를 사용하여 DB와 연결된 DAO를 가져옴
  2. 앱은 각 DAO를 통해 DB CRUD를 처리함
  3. 앱은 Entity를 사용하여 DB 테이블 column에 해당하는 값을 가져오고 setting 함

 

👆 주의사항

Room의 CRUD 처리는 메인 스레드(UI 스레드)가 아닌 Background Thread에서 처리해야 함

∵ 데이터를 받아올 때 처리시간이 길어질 경우 UI에 영향을 줄 수 있기 때문BUT, 메인 스레드에서 DB에 대한 접근을 허용하고 싶다면 allowMainThreadQueries() 호출!

 

 


reference >

 

 

반응형

댓글