Cute Apple
본문 바로가기
개발/Android

[Android] Room 사용기

by 미댕댕 2022. 7. 28.

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

댓글