티스토리 뷰

| 서론

오늘은 구글에서 만든 Android ORM 라이브러리인 Room Library에 대해서 정리해보려고 한다.

이번에 안드로이드 프로젝트를 진행하게 되면서 Room Library를 사용하여 구현을 하였는데 처음 접하는 개념이 많아서 이해하는 데에 매우 오래 걸렸던 기억이 있다. 그래서 개념이 잘 정리된 글이 많았으면 좋겠다는 생각을 했었어서 글을 쓰게 되었다.

나처럼 Room Library와 같은 ORM 라이브러리를 처음 접하는 사람들에게 이 글이 도움이 되기를 바란다.

 

 

| Room Library?

Room Library는 앞에서도 말했던 구글에서 만든 Android ORM Library이다. 

풀 네임은 Room Persistence Library이지만, Room Library라고 불린다.

구글에서는 SQLite API를 직접 사용하는 대신 Room을 사용하기를 권장하고 있다.

Room Library를 사용하면 개발 중 쿼리가 잘못된 경우 디비를 확인해야만 잘못 되었다는 것을 알 수 있었던 SQLite API 직접 사용 대신  개발 도중에 바로바로 잘못된 쿼리를 확인할 수 있다는 장점이 있다. 👏👏

그 외에도 다양한 라이브러리의 특성에 따른 장점들이 존재하는데 먼저 라이브러리의 특징을 찬찬히 알아보자. 

 

 

| Persistence?

Room Library에 대해서 이해하려면 먼저 이름에 들어가는 Persistence가 대체 뭔지 알아야 할 필요가 있다. 

Persistence란 한국말로 "지속성, 영속성" 이라는 뜻으로 프로그램 계층의 계층화 아키텍쳐(Layered Architecture)Persistence layer와 관련이 있다. 

(계층화 아키텍쳐는 중/대규모의 어플리케이션의 효율적인 개발 및 유지보수를 위해 계층화를 하여 개발하는 것으로 대표적으로 MVC 패턴이 있는데 이는 다음에 다른 글에서 자세히 다루도록 하겠다. )

 

Layered Architecture

 

Persistence Layer는 데이터의 영속성을 유지하는 계층이다.  

여기서 따와서 데이터베이스의 영속성을 유지하는 프레임 워크를 Persistence Framework라고 부른다.

계층형 구조에 따라 Persistence Layer를 통해 데이터에 접근하도록 하는 것이다.
(DataBase Layer는 말 그대로 DB를 뜻한다.)

 

위키피디아에서는 '퍼시스턴스 프레임워크(Persistence Framework)는 데이터의 저장, 조회, 변경, 삭제를 다루는 클래스 및 설정 파일들의 집합이다. 퍼시스턴스 프레임워크를 사용하면 JDBC 프로그래밍의 복잡함이나 번거로움 없이 간단한 작업만으로 데이터베이스와 연동되는 시스템을 빠르게 개발할 수 있으며 안정적인 구동도 보장한다. '라고 설명하고 있다.

 

Room도 이와 같은 Persistence Framework 이기 때문에 Room Persistence Library라고 명명된 것.

Persistence Framework는 SQL 문장으로 직접 데이터베이스를 다루는 'SQL mapper'Mybatis SQLite  그리고 자바 객체를 통해 간접적으로 접근하는 'ORM(Object-Relational mappping)'인 hibernate Room Library가 있다.  

 

 

 

| ORM(Object-Relational Mapping)?

앞에서 자바 객체를 통해 간접적으로 접근하는 것이 ORM이라고 하였는데, 대체 자바 객체로 간접적으로 접근한다는 게 무슨 말이지? 하고 이해가 잘 안 될 수 있다. (내가 그랬다.🙋‍♀️)

 

SQL Mapper와 비교해서 보면 조금  쉽게 이해 할 수 있는데 Android 앱 만들면서 SQLite를 다뤄 본 사람들이라면 알겠지만, 하나하나 SQL 쿼리를 작성해서 필요할 때마다 디비에 접근하는 부분을 작성해야 한다는 것을 알 수 있다. 데이터 베이스가 사용 되는 곳들에서 각각 디비에 접근하게 된다. 

 

그런데 반면에 ORM의 경우에는 Room Library를 예를 들어 설명하자면 Dao.class에 쿼리를 작성해두고 이를 통해 디비에 접근하고 Entity.class로 디비의 테이블을 선언해준다.

그리고 Dao에 쿼리를 작성하고 작성한 쿼리를 자바 함수와 연결해서 자바 객체에서는 Dao에 선언 된 자바 함수를 사용하여 데이터 베이스와 관련된 행위를 할 수 있게 해주는 것이다. (👏👏👏)

 

그러니까 자바 함수 쓰듯이 Dao에 선언해둔 디비 쿼리를 필요할 때 함수로 가져다 쓰면 된다는 말.

얼마나 편리한가!

 

 

 

| Room Library 구성 요소

이제 Room Library를 사용할 준비가 되었으니, 구성요소와 관계를 알아보자.

 

출처 : https://developer.android.com/training/data-storage/room?hl=ko

 

위의 그림은 Room Architecture diagram이다.

보이는 바와 같이 Database, DAO(Data Access Object), Entity 이 3가지가 Room의 기본 구성요소이다. 

그림에서 보이는 것처럼 앱에서는 DB에 접근할때 DAO를 이용하여 접근한다.

 

DataBase는 말 그대로 앱의 Database이다.

Dao에는 Database에 접근하기 위한 쿼리를 작성한다. 

Entity에서는 DB의 객체를 선언하고 Entity의 객체를 반환(DTO)하는 역할을 한다.(Getter, Setter)

 

기본적으로 ORM에서는 Entity의 객체를 반환하는 DTO를 Entity.class와 분리하기를 권장하고 따로 쓰지만, Room 에서는 Entity에서 DTO의 역할까지도 한다는 것이 다른 것들과의 차이점이다. 

 

 

| Room 구현 예시

구글 developer 페이지의 예제 소스를 이용하여 구현 예시를 살펴보자.

 

|Entity

    @Entity
    public class User {
        @PrimaryKey
        public int uid;

        @ColumnInfo(name = "first_name")
        public String firstName;

        @ColumnInfo(name = "last_name")
        public String lastName;
    }
    

위의 코드는 User Entity를 선언한 코드이다.

@Entity라는 주석(Annotation)을 클래스 선언부 위에 달아줘야 Room Library에서 이것이 Entity인 것을 인식 할 수 있다. @ColumnInfo(name= "칼럼이름") 을 통해 디비의 칼럼 이름을 지정해 줄 수 있다. 

 

 

|Dao

    @Dao
    public interface UserDao {
        @Query("SELECT * FROM user")
        List<User> getAll();

        @Query("SELECT * FROM user WHERE uid IN (:userIds)")
        List<User> loadAllByIds(int[] userIds);

        @Query("SELECT * FROM user WHERE first_name LIKE :first AND " +
               "last_name LIKE :last LIMIT 1")
        User findByName(String first, String last);

        @Insert
        void insertAll(User... users);

        @Delete
        void delete(User user);
    }
    

DB에 접근하는 DAO 부분 코드이다. Dao는 interface로 작성해준다. @Dao라는 주석을 달아주면 되고, 쿼리를 작성할때에는 @Query("작성할 쿼리") 와 같이 작성하고 아래에 자바 함수를 작성해준다.

아래에 작성해준 자바 함수를 통해 다른 곳에서 Dao를 통해 디비에 접근 할 수 있게 된다. 

 

(Dao는 interface이기 때문에 구현체가 아니라서 구현체에 implements해서 많이 사용하게 된다. 이때 Repository.class에 Dao를 상속받아서 Repository에서 Dao를 실행하는 식으로 구현하면 된다.)

 

 

|Database

  @Database(entities = {User.class}, version = 1)
    public abstract class AppDatabase extends RoomDatabase {
        public abstract UserDao userDao();
    }
    

데이터 베이스 생성 코드이다. 위와 같이 데이터베이스를 생성하고,  다음과 같이 생성한 디비 인스턴스를 가지고 오면 된다.

    AppDatabase db = Room.databaseBuilder(getApplicationContext(),
            AppDatabase.class, "database-name").build();
            

 

 

 

 

 

 

 

이상 Room Library에 대해 알아보면서 Persistence와 ORM에 대해서도 정리해보았다. 

나의 글이 Room Library를 처음 접한 사람들에게 많은 도움이 되기를 바란다. 👨‍🏫

Android Room Library 외에도 Spring에서도 ORM이 많이 사용이 되는데 둘을 비교하면서 공부하면 더 이해하기 쉬울 것이다. 🧚‍♀️

 

 

 

 

 

 

 

 

References

https://developer.android.com/training/data-storage/room?hl=ko#java 

https://ko.wikipedia.org/wiki/%ED%8D%BC%EC%8B%9C%EC%8A%A4%ED%84%B4%EC%8A%A4_%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함