FastCampus 의 30개로 배오는 Android 앱개발 with Kotlin 을 들으면서 Room 을사용해본 썰 푼다
Room이란❓
Room 은 AAC(Android Architecture Components) 이고,
핸드폰의 내장 DB 에 데이터를 저장하기 위해 사용하는 라이브러리
Room 의 장점
- 컴파일 도중 SQL에 대한 유효성 검사 가능
- Schema가 변경될 시 자동으로 업데이트 가능
- Java 데이터 객체를 변경하기 위해 상용구 코드 없이 ORM 라이브러리를 통해 매핑 가능
- LiveData와 RX Java를 위한 Observation 생성 및 동작 가능
Room 의 구성
- 엔티티(Entity) : DB의 테이블을 의미
- 데이터 접근 객체(DAO) : 쿼리 등의 조건을 수행하기 위한 객체(interface 로 선언)
- 데이터베이스(DB) : DB를 통해 처리가능
Room 사용해보기
0. Gradle 설정(준비)
Kotlin 이라면 추가해야함
plugins {
id 'kotlin-kapt'
}
KAPT(Kotlin Annotation Processing Tool)란?
코틀린 프로젝트를 컴파일 할 때는 javac가 아닌 kotlinc로 컴파일(Java로 작성한 애노테이션 프로세서가 동작하지 않음)
코틀린에서는 이러한 애노테이션 처리를 위해 KAPT를 제공
=> 최근에는 KSP(Kotlin SYmbol Processing) 을 사용한다고 합니다.
참고 : https://www.charlezz.com/?p=45255
dependencies {
implementation "androidx.room:room-runtime:2.4.2"
kapt "androidx.room:room-compiler:2.4.2"
}
1. Model 만들기
@Entity
data class History(
@PrimaryKey val uid: Int?,
@ColumnInfo(name = "expression")val expression: String?,
@ColumnInfo(name = "result")val result: String?
)
@PrimaryKey
- 필수적으로 있어야함
@ColumnInfo
- 테이블을 구성할 내용을 선언하기 위하나 annotation
@Entity (tableName = "테이블명")
- 테이블 명을 선언할 경우 DAO 의 Query 에서 해당 테이블명을 사용할 수 있음
@Ignore
- ignore 을 사용하면 해당 필드는 들어가지 않음
2. DAO 만들기
@Dao
interface HistoryDao{
@Query("SELECT * FROM history")
fun getAll() : List<History>
@Insert
fun insertHistory(history : History)
@Query("DELETE FROM history")
fun deleteAll()
@Delete
fun delete(history : History)
@Query("SELECT * FROM history WHERE result like :result LIMIT 1")
fun findByResult(result : String) : History
}
@Query
- Entity에 선언한 tableName 을 기준으로 쿼리작성가능
- 만약 tableName 이 선언되어있지 않다면 클래스명을 소문자로한 이름이 곧 테이블명
@Insert
- 인자를 받아 DB 에 저장해줌
@Delete
- DB에서 제거하는 annotation
- 반드시 인자를 받아야함
3. DB 만들기
@Database(entities = [History::class], version = 1)
abstract class AppDatabase : RoomDatabase(){
abstract fun historyDao() : HistoryDao
companion object {
private var instance : AppDatabase? = null
if(instance == null){
instance = Room.databaseBuilder(applicationContext,
AppDatabase::class.java,
"historyDB").build()
}
return instance
}
}
@Database
- entities 에 DB에서 사용할 모든 클래스를 넣어줌(현재는 1개 이므로 1개만..)
- version 의 경우에 이전구조와 현재 구조를 구분해주는 역할
Document 에서는 Singleton 패턴을 추천!!! 링크
4. Activity 에서 사용하기
lateinit var db : AppDatabase
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//그냥 생성할 경우
db = Room.databaseBuilder(applicationContext,AppDatabase::class.java,"historyDB").build()
//Singleton 으로 생성할 경우
db = AppDatabase.getInstance(applicationContext)
Thread(Runnable {
//그냥
db.historyDao().insertHistory(History(null, expression, resultText))
//singleton
db!!.historyDao().insertHistory(History(null, expression, resultText))
}).start()
}
- PK 를 null 로 설정해줄 경우 자동으로 PK 가 들어감
- Singleton 으로 생성하는 경우는 !!를 선언해서 null 이 없음을 선언
- db 에서 데이터를 처리하는 작업은 따로 Thread 로 쪼개서 사용할 것
=> Thread 를 사용하지 않았을경우 생기는 오류
"Cannot access database on the main thread since it may potentially lock the UI for a long period of time"
✨Room 으로 계산기 만들기✨
=> 복잡한 계산기 로직은 제외하고 간단하게 구현
https://github.com/sju01334/Calculator
GitHub - sju01334/Calculator: Room 을 사용한 계산기 기록 남기기
Room 을 사용한 계산기 기록 남기기. Contribute to sju01334/Calculator development by creating an account on GitHub.
github.com
[최종 결과물]
참고 : https://developer.android.com/training/data-storage/room/
Room을 사용하여 로컬 데이터베이스에 데이터 저장 | Android 개발자 | Android Developers
Room 라이브러리를 사용하여 더 쉽게 데이터를 유지하는 방법 알아보기
developer.android.com
'개발 > Android' 카테고리의 다른 글
[Android] 4대 Component (0) | 2022.07.29 |
---|---|
[Android] Handler? Looper? Runnable? (0) | 2022.07.28 |
[Android] Context란? (0) | 2022.07.27 |
[Android] Fragment 생명주기 (0) | 2022.07.26 |
[Android] Activiy 생명주기 (0) | 2022.07.26 |
댓글