Android의 room을 이용하여 sqlite 사용하기

안드로이드 앱에서 db를 사용할때는 sqlite를 주로 사용하는데, 이때 room을 이용하면, ORM을 사용해서 db에 접근해서 사용할 수 있다.
먼저 공식 문서의 링크는 아래와 같다.
https://developer.android.com/jetpack/androidx/releases/room?hl=ko
방 | Jetpack | Android Developers
이 페이지는 Cloud Translation API를 통해 번역되었습니다. 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Room Room 지속성 라이브러리는 SQLite에 추상화 레이어를
developer.android.com
안드로이드 앱에서 room을 사용하려면 다음과 같다.
첫째, 의존성을 추가한다. 현재 최신버전은 2.6.1 이다.
https://mvnrepository.com/artifact/androidx.room/room-runtime/2.6.1
https://mvnrepository.com/artifact/androidx.room/room-compiler/2.6.1
dependencies {
runtimeOnly 'androidx.room:room-runtime:2.6.1'
implementation 'androidx.room:room-compiler:2.6.1'
}
둘째, room의 구성요소는 Entity, DAO(Data Access Object), Database 가 있는데, 이 구성요소들을 구현한다.
Room 구성 요소
- Entity: 데이터베이스 테이블을 정의하는 클래스
- DAO (Data Access Object): 데이터베이스 접근 객체로, SQL 쿼리를 실행하는 인터페이스
- Database: RoomDatabase를 상속받아 데이터베이스를 생성하고 DAO를 연결
Entity
Entity 는 DB의 row를 저장하기 위한 class 이다.
하나의 row를 저장할 수 있는 class이다 보니, 당연하게도 PrimaryKey가 있어야 하며, PrimaryKey를 표시 하기 위해서, @PrimaryKey 어노테이션을 사용한다.
또, entity에는 기본 생성자가 public 접근제한자로 추가되어야 한다. 그 이유는? 빌드 할때 generated 파일을 생성하는데 generated 파일에서 entity의 기본생성자를 사용한다.
import androidx.room.Entity;
import androidx.room.PrimaryKey;
@Entity(tableName = "user_table")
public class User {
@PrimaryKey(autoGenerate = true)
private long id;
private String name;
private int age;
public User() {
}
public User(String name, int age) {
this.name = name;
this.age = age;
}
...
}
DAO
DAO는 DB에 실제 CRUD 동작을 위한 interface를 정의 한다.
간단하게 @Insert, @Update, @Delete 를 사용할 수도 있고 @Query 를 사용하여 특정 쿼리를 수행하도록 할 수 있다.
import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.Query;
import androidx.room.Update;
import java.util.List;
@Dao
public interface UserDao {
@Insert
void insert(User user);
@Query("SELECT * FROM user_table")
List<User> getAllUsers();
@Query("SELECT * FROM user_table WHERE id = :userId")
User getUserById(long userId);
@Update
void update(User user);
@Delete
void delete(User user);
}
Database
Database는 RoomDatabase를 확장하여 데이터베이스를 정의 하며, 이 클래스는 DAO를 연결한다.
import androidx.room.Database;
import androidx.room.RoomDatabase;
@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}