세상을 바꾸는 개발자

[Android, Room, Coroutinnes, DataBinding, LiveData, ViewModel ] 안드로이드 JetPack과 MVVM 패턴 사용해보기(5 - 2 : 룸 라이브러리로 데이터베이스 만들기) 본문

안드로이드/Kotlin

[Android, Room, Coroutinnes, DataBinding, LiveData, ViewModel ] 안드로이드 JetPack과 MVVM 패턴 사용해보기(5 - 2 : 룸 라이브러리로 데이터베이스 만들기)

헬창코딩 2021. 6. 18. 22:25

안녕하세요 헬창코딩입니다.

 

전 게시물에서 기본적인 JetPack라이브러리를 세팅해봤는데요 이번시간부터는 본격적으로 한번 코딩을 해보겠습니다~

 

이번시간에 할 것은 룸 라이브러리를 이용해서 데이터베이스 테이블을 만들어보겠습니다.

 

 

1. 가장먼저 룸 데이터베이스 라이브러리를 통해서 만들 테이블 입니다. 

user_id user_name user_email
1 헬창코딩 a@c.com
2 유재석 b@c.com
3 노홍철 c@c.com

 

 

2. 안드로이드 스튜디오에서 DB 패키지를 하나 만들고 패키지 안에 User라는 코틀린 클래스를 하나 만들어줌니다.

 

 

3.  User 클래스를 Entity 클래스로 만들어줘야합니다.

   2.1  class를 data class로 변경해줍니다.

   2.2  만들려는 테이블레서 속성으로 사용할 변수들을 선언해줍니다. (id, name, email)

   2.3  User클래스에  @Entity 주석을 달아주고 테이블 이름을 입력해 줍니다. 

   2.4  테이블에 대한 기본키를 지정합니다.  (기본키는 id를 사용합니다.)

   2.5 '{' 를 '('로 변경을 해주셔야 됩니다.!!

 

User.kt

1
2
3
4
5
6
7
8
9
10
11
12
@Entity(tableName = "user_data_table")
data class User(
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "user_id")
    var id: Int,
 
    @ColumnInfo(name = "user_name")
    val name: String,
 
    @ColumnInfo(name = "user_email")
    val email: String
)
 
cs

 

 

4. 위에서 만든 user database에 접근할 DAO 인터페이스를 만들어줘야합니다.

    4.1 DB 패키지에 UserDAO.kt 인터페이스를 생성합니다.

    4.2  @Insert, @Update, @Delete, @Query 함수를 만들어 줍니다.

   

UserDAO.kt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Dao
interface UserDAO {
 
    @Insert
    suspend fun insertUser(user: User): Long
 
    @Update
    suspend fun updateUser(user: User)
 
    @Delete
    suspend fun deleteUser(user: User)
 
    @Query(value = "DELETE FROM user_data_table")
    suspend fun deleteAll()
 
    @Query(value = "SELECT * FROM user_data_table")
    fun getAllUsers(): LiveData<List<User>>
 
}
cs

 

 

5. 이제 데이터베이스를 만들준비가 끝났으니 본격적으로 데이터베이스를 만들어보겠습니다.

       5.1 DB 패키지에 UserDatabase.kt 클래스를 생성합니다.

       5.2 클래스를 추상클래스 만들어줍니다. 

       5.3 데이터베이스 주석을 추가합니다. (@Database(entities = [User::class], version = 1))

       5.4 RoomDatabase를 상속받습니다.

       5.5 추상적인 룸 데이터베이스를 만들어주는데  하나의 인스턴스만 사용하는것이 좋습니다.

       5.6 싱글톤을 이용한 데이터베이스 객체를 만들어줍니다. 

 

UserDatabase.kt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@Database(entities = [User::class], version = 1)
abstract class UserDatabase : RoomDatabase() {
 
    abstract val userDAO: UserDAO
 
    companion object {
        @Volatile
        private var INSTANCE: UserDatabase? = null
 
        fun getInstance(context: Context): UserDatabase {
            synchronized(this) {
                var instance = INSTANCE
                if (instance == null) {
                    instance = Room.databaseBuilder(
                        context.applicationContext,
                        UserDatabase::class.java,
                        "user_data_database"
                    ).build()
                }
                return instance
            }
        }
    }
 
}
 
cs

 

 

 

6.  저희는 MVVM 패턴을 따를 것이기때문에 Repository 클래스를 만들어주겠습니다.

(Repository 를 만드는 이유는 ViewModel이 Repository통해서 데이터를 받기때문에 sqlite에서 받아오는지 retrofit을 통해 받아오는지 전반적으로 알필요가 없습니다. 그래서  모듈화가 명확해지고 유지보수도 쉬워질 수 있습니다.)

       6.1 DB 패키지에 UserRepository.kt 클래스를 생성합니다.

       6.2 UserDAO를 생성자로 받습니다.

       6.3 users, insert, update, delete, deleteAll 함수를 생성합니다.

       

     

UserRepository.kt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class UserRepository(private val dao: UserDAO) {
 
    val users = dao.getAllUsers()
 
   suspend fun insert(user: User) {
       dao.insertUser(user)
    }
 
   suspend fun update(user: User) {
       dao.updateUser(user)
    }
 
   suspend fun delete(user: User) {
       dao.deleteUser(user)
    }
 
    suspend fun deleteAll() {
        dao.deleteAll()
    }
 
}
cs

 

이번시간에는 룸을 이용한 데이터베이스를 만들어줬습니다.

다음시간에는 실제로 사용자에게 보여질 UI를 만들고 CRUD를 구현해보겠습니다.~

 

Comments