반응형

이 게시물은 다음 링크를 참조하여 학습했습니다.

 

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

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

developer.android.com

 

안드로이드 Room의 사용법과 예제

1. Room  1-1. Room이란?  1-2. Room 구조  1-3. TMI 2. 사용법  2-1. gradle  2-2. Entity  2-3. DAO  2-4. Room Database  2-5. 데이터 베이스 사용 3. 예제  3-1. room + singleton + coroutine  3-..

todaycode.tistory.com

 

[Android] Room DB 사용법

21.04.13 - 코드 테스트 후 정상 작동 확인, xml 코드 별 어떤 xml의 코드인지 기재 이번 포스팅에선 제트팩 라이브러리에 속하는 룸 DB를 사용한 간단한 CRUD 예제 코드를 기록할 것이다. 먼저 앱 수준

onlyfor-me-blog.tistory.com

이번 게시물은 Room에 대해 정리해보려 한다.

엮이고 엮이면서 많은것을 한꺼번에 공부하게 되었고, 이를 정리하는 과정에서 시간이 생각보다 많이 걸렸다.

공부한 내용을 한꺼번에 게시물로 올리면 가독성이 떨어질 것 같아서 일단은 이번 게시물은 Room에 대한 개념과 구성 요소에 대한 설명글을 작성하려 한다.

 

1. Room?

Room데이터베이스를 관리하는 라이브러리이다.

기존에 Room을 배우기 전에는 SQLite를 사용해서 간단한 Database를 만들었었다.

SQLite를 사용해도 데이터베이스를 관리할 수는 있지만, Room은 성능적 측면, 편의적 측면에서 SQLite에 비해 확실한 이점을 갖고있다.

Android 공식문서에서 이야기하는 Room의 사용 이점은 다음과 같다.

- SQL 쿼리의 컴파일 시간 확인

- 반복적이고 오류가 발생하기 쉬운 상용구 코드를 최소화하는 편의 주석

- 간소화된 데이터베이스 이전 경로

 

2. Room 구성요소

Room에는 다음 3가지 주요 구성요소가 있다.

- Database Class : 데이터베이스를 보유하고 앱의 영구 데이터와의 기본 연결을 위한 기본 액세스 포인트 역할을 한다.

- Data Entities : 앱 데이터베이스의 테이블을 나타낸다.

- Data Access Object(DAO) : 앱이 데이터베이스의 데이터를 Query, Update, Insert, Delete 하는데 사용할 수 있는 메서드를 제공한다.

 

Room의 대강적인 구성요소 간 관계는 다음과 같다.

 

2-1. Data Entities

Data Entities는 아래처럼 data class로 나타낸다. 

1
2
3
4
5
6
@Entity
data class User(
    @PrimaryKey val uid: Int,
    @ColumnInfo(name = "first_name") val firstName: String?,
    @ColumnInfo(name = "last_name") val lastName: String?
)
cs

Entity에서의 Annotation에 대한 내용은 다음과 같다.

@Entity( tableName = " " ) : SQLite 테이블을 의미한다.

@PrimaryKey : 데이터 식별을 위한 기본키

@ColumnInfo( name = " " ) : 테이블의 열 이름

 

2-2. Data Access Object(DAO)

DAO는 아래처럼 interface 나타낸다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Dao
interface UserDao {
    @Query("SELECT * FROM user")
    fun getAll(): List<User>
 
    @Query("SELECT * FROM user WHERE uid IN (:userIds)")
    fun loadAllByIds(userIds: IntArray): List<User>
 
    @Query("SELECT * FROM user WHERE first_name LIKE :first AND " +
           "last_name LIKE :last LIMIT 1")
    fun findByName(first: String, last: String): User
 
    @Insert(onConflict = OnConflictStrategy.IGNORE)
    suspend fun insert(word: Word)
 
    @Insert
    fun insertAll(vararg users: User)
 
    @Delete
    fun delete(user: User)
}
cs

DAO에서 Annotation에 대한 내용은 다음과 같다.

@Dao : Room의 DAO 클래스 식별

@Query : SQL 문 실행 역할

@Insert, @Delete, @Update : 행 삭제, 업데이트, 입력 기능

onConflict : OnConflictStrategy.IGNORE : 같은 입력값 무시

 

2-3. Database Class

Database Class는 일반적으로 추상클래스로 구현한다. db instance가 여러번 생성되는 것을 방지하기 위해 singleton패턴으로 구현했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Database(entities = [User::class], version = 1)
abstract class AppDatabase: RoomDatabase() {
    abstract fun userDao(): UserDao
 
    companion object{
        private var instance: AppDatabase? = null
 
        @Synchronized
        fun getInstance(context: Context, scope: CoroutineScope): AppDatabase?{
            if(instance == null){
                synchronized(AppDatabase::class){
                    instance = Room.databaseBuilder(context.applicationContext,AppDatabase::class.java,"user-database").build()
                }
            }
            return instance
        }
    }
}
cs

 

@Synchronized : 멀티스레드 환경에서 스레드간 동기화 작업역할. 

반응형

+ Recent posts