상세 컨텐츠

본문 제목

Room database

ANDROID

by dhkim0405 2021. 7. 27. 19:17

본문

지난학기 모바일 프로그래밍 강의 중 Android Studio 에서 SQLite를 직접 제어하는 강의가 있었다. 

그런데 안드로이드 에서는  SQLite를 직접 제어하지말고 Room라이브러리를 사용할것을 권장하고 있기에 Room을 통해 SQLite를 사용하는 방법에 대해 알아본다. 


기존 SQLite의 문제점

  • 원시 SQL쿼리에 대한 컴파일 타임 확인이 불가능하다. 즉 SQL쿼리를 수동으로 업데이트 해야하며 이는 시간이 오래 걸리고 오류가 발생할 확률이 높다. 
  • SQL 쿼리문와 데이터 객체 간에 변환하려면 많은 상용구 코드를 사용해야 한다. 

 

 

Room 

  • Jetpack의 아키텍처 컴포넌트 라이브러리로, 데이터베이스 설정과 사용을 쉽게 해준다. 
  • Room을 사용하면 애노테이션이 지정된 코틀린 클래스로 데이터베이스 구조와 쿼리를 정의할 수 있다.

한마디로 SQLite의 사용이 까다로워 Room이라는 녀석이 등장했고,  Room은 애노테이션을 통한 객체 매핑 등의 역할을 자동으로 도와줘 보다 쉽게 데이터베이스를 관리할 수 있게 한다는 말이다. 

 

 

 

 


실습 

 

1. 의존성 추가

-> roon-runtime : 데이터베이스를 정의하는데 필요한 모든 클래스와 애노테이션을 포함하는 Room API이다. 

-> room-compiler : 지정된 애노테이션을 컴파일해서 데이터베이스 구현체를 생성

 

2. Entity정의

Room은 사용자가 정의한 Entity를 기반으로 데이터베이스 테이블 구조를 만든다. 

@Annotation을 통해 Room에게 알리는 방식으로 동작한다. 

 

-> @Entity는 클래스 수준에 적용된다. 

-> User클래스가 테이블 구조를 정의함을 나타낸다. 

 

 

실제 MYSQL TABLE로 표현하면 다음과 같다. 

 

3. Dao Interface선언 - Dao(Data Access Object)

테이블의 데이터에 엑세스 하려면 Dao를 생성해야한다. Dao는 데이터베이스 작업을 수행하는 함수들을 포함하는 인터페이스 이다. 

 

-> @Dao를 추가하면 Room Database가 Dao중의 하나임을 알 수 있게 된다. 

-> 데이터베이스 클래스에 UserDao를 등록하면 이 인터페이스의 함수들의 실행코드를 Room이 생성한다. 

 

4. Dataclass 선언

-> abstract로 지정되어 현재 인스턴스를 만들 수 없다. 

-> Room을통해 이후에 인스턴스를 생성하는 방법을 알아본다. 

 

5. MainActivity 작성

-> onCreate 내부에 Userdatabase 인스턴스 생성

-> 생성된 database인스턴스를 통해 UserDao 인스턴스 생성

 

6. Button Click -> Insert 수행 

-> 버튼 클릭시 익명 객체 쓰레드 생성 및 실행 // 데이터베이스에 엑세스 하는 작업은 시간이 오래 걸려 메인 쓰레드에서 실행불가

-> 익명 객체 쓰레드 내 UserDao 인스턴스를 통해 데이터 insert 

 

 

7.  Button Click -> Select Data

-> insert와 마찬가지로 데이터베이스에 접근하는 메서드 등은 메인쓰레드에서 수행 불가 

 

결과 

-> insert를 수행한 다음 show를 클릭하자 데이터베이스 내 user정보를 가져왔다. 

 

 

'ANDROID' 카테고리의 다른 글

ViewModel  (0) 2021.07.28
RecyclerView  (0) 2021.07.28
LiveData  (0) 2021.07.26
4대 컴포넌트 - SERVICE  (0) 2021.05.29
CHAP 13 -1 MediaPlayer class  (0) 2021.05.28

관련글 더보기