[안드로이드]SQLite/Room

dada·2021년 11월 7일
2

Android

목록 보기
16/24
post-thumbnail

정말 정말 간단한 정보를 저장할 경우를 생각해봅시다.
예를 들어 자동 로그인 여부를 저장하고 싶은데 고작 이 true/false 값을 저장하려고 Room을 사용하는 건 닭 잡는데 소 잡는 칼 쓰는 격이라고 할 수 있습니다. 작은 일에 큰 노력을 들여야 한다는 것이죠ㅎㅎ
이럴 때는 Room이 아니라 sharedpreferences라는 것을 사용하면 됩니다.
반대로 대량의 데이터를 처리하게 될 경우는 Room보다 Realm을 사용하면 좋습니다. 속도도 빠르고 안정적이고 비동기 지원이 된다는 장점이 있으나 앱 용량이 커진다는 단점이 있어 상황에 맞게 사용하면 됩니다.

✅SQLite

  • SQLite 데이터베이스는 안드로이드에서 제공하는 관계형 데이터베이스이자 경량 데이터베이스다
    • 관계형 데이터 베이스는 테이블, 컬럼(속성), 레코드(로우,튜플)로 이루어져 있음
    • SQL: RDB가 데이터를 조작, 제어하는 용도로 사용하는 언어
    • SQL구문(쿼리): SQL언어로 쓴 명령어
    • 쿼리를 이해해보자
      1) SELECT no, name, date FROM 데이블A
      ->3개의 속성값 데이터를 테이블A에서 읽어와라
      2) SELECT * FROM 데이블A
      ->속성값 모두 선택할때 * 로 가능
      2) SELECT * FROM 데이블A WHERE no=2
      ->3번 레코드 값만 읽어오기
    • 데이터를 조작하기 위한 CRUD 명령을 실행하기 위해 4개의 쿼리만 알면됨!
  • 데이터베이스의 데이터 타입의 종류는 3개가 있다(5개인데 거의 얘네만씀)
    • INTEGER:정수형 속성
    • TEXT:문자형 속성
    • REAL:소수점이 있는 숫자형
  • SQLite을 사용하기 위해선 안드로이드의 컨텍스트가 가지고 있는 SQLiteOpenHelper 클래스를 상속받아 사용해야 한다

✅Room

✔개념

  • ORM(Object Relational Mapping): 객체(class)와 관계형 데이터베이스의 데이터(Table)을 매핑하고 변환하는 기술로 복잡한 쿼리를 잘 몰라도 코드만으로 데이터베이스의 모든 것을 컨트롤 할 수 있도록 도와줌
  • Room:안드로이드는 SQLite를 코드 관점에서 접근할 수 있도록 ORM 라이브러리인 Room을 제공함
  • SQLite보다 쉽고(쿼리를 직접 안짜도됨) 기기가 네트워크에 액세스할 수 없을 때 즉 서버 연동없이 오프라인 상태인 동안에도 사용 가능함

✔SQLite vs Room

이쯤되면 SQLite와 Room은 무슨 차이가 있을지 궁금해진다. 왜 안드로이드 디벨로퍼에선 Room DB 사용하기를 SQLite보다 권장하는 걸까?

SQLite 단점

  • SQL 쿼리에 대한 컴파일 체크가 없다. 실제 DB에 없는 틀린 열 이름으로 쿼리를 작성하면 런타임 동안 예외가 발생하고 컴파일하는 동안 이 문제를 잡을 수 없다.
  • 스키마가 바뀌면 영향 받는 SQL 쿼리를 수동 업데이트해야 한다. 여기서 시간이 오래 걸리거나 다른 오류가 발생할 수도 있다.
    SQL 쿼리와 자바 데이터 객체 간 변환 처리를 하려면 많은 상용구 코드를 작성해야 한다.

Room DB 장점

  • Room은 컴파일하는 시간에 SQL 유효성 검사를 수행한다.
  • 스키마가 바뀌었을 때 영향 받는 SQL 쿼리를 직접 바꾸지 않아도 된다.
  • 상용구 코드 없이 DB 객체를 자바 객체에 매핑한다.

✔Room 구조

  • 총 4개의 파일을 만들게 된다(리스트 형태로 사용하려면 어댑터 추가..)
    • Entities: 데이터베이스의 테이블 역할을 하는 클래스라고 보면됨. Entities클래스 하나 당 테이블 하나를 만드는 것
      - Entity(개체)와 Object(객체)는 비슷해 보이지만 다른 의미를 가지고 있다.객체는 개체를 포함한 더 큰 개념이다.
      대상에 대한 정보뿐만 아니라 동작, 기능, 절차 등을 포함하는 것이 객체이다.
    • DAO(Data Access Object):Room은 데이터를 읽고 쓰는 메서드를 인터페이스 형태로 설계하고 사용함. 코드 없이 이름만 명시하는 형태로 인터페이스를 만들면 Room이 알아서 나머지 코드 작성해줌 즉 DAO는 데이터베이스에 접근해서 DML쿼리(CRUD수행하는 쿼리)를 실행하는 메서드의 모음
    • Room Database:Room 라이브러리가 제공하는 데이터베이스인 RoomDatabase는 RoomDatabase를 상속받아 클래스(RoomHelper)를 만들면 됨. 추상클래스로 만들어야함
    • Rest of The App:나머지 부분 코드를 작성!

✅Room 사용

꿀팁

라이브러리 추가

  • 앱단위의 plugins에 id 'kotlin-kapt 추가
plugins {
...
    id 'kotlin-kapt'
...
}
  • 앱단위의 의존성 추가 버전확인
    implementation "androidx.room:room-ktx:2.3.0"
    kapt "androidx.room:room-compiler:2.3.0"
  • kapt란?
    • 자바 6부터 도입된 Pluggable Annotation Processing API를 코틀린에서도 사용 가능하게 하는 것
    • 어노테이션 프로세싱이란 @명령어처럼 사용하는 주석 형태의 문자열을 실제 코드로 생성해주는 것.
    • @으로 시작하는 명령어를 어노테이션이라고 하는데 어노테이션이 컴파일 시에 코드로 생성되기 때문에 실행시 발생할 수 있는 성능 문제 개선됨
    • Room을 사용하면 클래스명이나 변수명 위에 @어노테이션을 사용해서 코드로 자동변환되주니까 편함

✔Entities

  • 테이블:클래스 위에 @Entity라는 어노테이션을 작성하면 Room라이브러리가 @Entity어노테이션이 적용된 클래스를 찾아 테이블로 변환함. 데이터베이스에서 테이블명을 클래스명과 다르게 하고 싶을 떄는 @Entity(table="테이블명)으로 작성
  • 속성:멤버변수 위에 @ColumnInfo 어노테이션을 붙이면 테이블의 컬럼(속성)이 된다는 걸 명시함. 컬럼명을 테이블의 속성명과 다르게 하고 싶을때는 @ColumnInfo(name="속성이름")
  • 기본키:기본키로 만들고 싶은 속성 위에 @PrimaryKey 어노테이션을 붙이고 자동으로 값이 증가하는 옵션을 붙여서 @PrimaryKey(autoGenerate=true)
    • 기본키로 만든 속성은 자동증가되니까 null값을 허용한다.

✔DAO

  • DAO는 @Dao라는 어노테이션을 붙여서 인터페이스로 만들어야함
  • @Insert를 붙이면 테이블에 데이터 삽입
  • @Update를 붙이면 테이블의 데이터 수정
  • @Delete를 붙이면 테이블의 데이터 삭제이다.
  • 이 외에 복잡한 조건을 주고 삭제하거나 가져오고 싶을때는 어노테이션 사용
  @Dao
interface UserDao {
    @Query("SELECT * FROM room_memo") // 테이블의 모든 값을 가져와라
    fun getAll(): List<User>
 
    @Query("DELETE FROM User WHERE name = :name") // 'name'에 해당하는 유저를 삭제해라
    fun delete(name: String)

    @Insert(onConflict = OnConflictStrategy.REPLACE) //기존에 저장되있던 Primary key의 데이터가 업데이트되면 insert안하고 걍 업데이트 해줌
    fun insert(memo: RoomMemo)

}

✔RoomDatabase

  • SQLiteOpenHelper를 상속받아 구현했던 것처럼 Room은 RoomDatabase를 제공함
    RoomDatabase를 상속받아 RoomHelper를 추상 클래스로 생성함
  • @Database 어노테이션을 이용해서 데베라는걸 알려주고 arrayOf안에 내가 사용하는 테이블(클래스 이름)을 써줌
  • 테이블 여러개일수도 있어서 arrayOf로 만들거고 여러개면 , 로 구분
@Database(entities = arrayOf(User::class, Student::class), version = 1)
  • version을 써주는거 중요: 처음 데베니까 1인데 앱 업데이트 되거나 마이그레이션되면 version변경될 수 있어서 기존에 설치된 앱의 테이블 수정하거나..
  • RoomDatabase만들때 싱글톤으로 만들어야 한다는데 아직 잘 모르는 개념들임 Room 익숙해지고 디자인패턴 익숙해지면 다시보자
  • 싱글톤 적용 블로그
  • 안드로이드 Room 공식
profile
'왜?'라는 물음을 해결하며 마지막 개념까지 공부합니다✍

0개의 댓글

관련 채용 정보