티스토리 뷰

혼자서 안드로이드 스튜디오를 활용해서 Todo 리스트를 무작정 만들어보고 있다.

우선 Todo를 담을 데이터 스키마를 짜는데 까지는 좋았지만 어떤 데이터베이스에 담을까 찾아보고 있는 중 2018년에 나온 AAC 중에서 Room 라이브러리가 눈에 띄었고 구글에서 추천해준만큼 활용해보기로 했다.

 


1. Todo

Entity는 데이터 구조를 표현하기 위한 클래스이다. 우선 Todo에 대한 정의를 해주었다.

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
@Entity
public class Todo {
    @PrimaryKey(autoGenerate = true)
    public long id;
    public String title;
    public String content;
    public OffsetDateTime dateTime;
    public Boolean isCompleted;
 
    public long getId() {
        return id;
    }
 
    public void setId(long id) {
        this.id = id;
    }
 
    public String getTitle() {
        return title;
    }
 
    public void setTitle(String title) {
        this.title = title;
    }
 
    public String getContent() {
        return content;
    }
 
    public void setContent(String content) {
        this.content = content;
    }
 
    public OffsetDateTime getDateTime() {
        return dateTime;
    }
 
    public void setDateTime(OffsetDateTime dateTime) {
        this.dateTime = dateTime;
    }
 
    public Boolean getIsCompleted() {
        return isCompleted;
    }
 
    public void setIsCompleted(Boolean isCompleted) {
        this.isCompleted = isCompleted;
    }
 
    public Todo(long id, String title, String content) {
        this.id = id;
        this.title = title;
        this.content = content;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            this.dateTime = OffsetDateTime.now();
        }
        this.isCompleted = false;
    }
}
cs
  • Todo가 DB에서 사용 될 데이터 구조라는 것을 표현하기 위해 @Entity라는 어노테이션을 추가해줬다.
  • id를 PrimaryKey로 지정하고 자동생성 기능을 추가시켜줬다.
  • 모든 변수를 private으로 접근제어 표시를 하고 게터/세터 함수를 통해 접근할 수 있게 지정해줬다.

 

2. TodoDAO

DAO는 실제 DBMS를 위해 호출되는 함수를 선언하는 인터페이스나 추상 클래스이다.

1
2
3
4
5
6
7
8
9
@Dao
public interface TodoDAO {
    @Query("SELECT * FROM user")
    List<Todo> getAll();
 
    @Insert
    void insertAll(Todo... todos);
}
 
cs
  • 데이터베이스에서 Todo 관련 데이터를 접근하기 위한 함수를 지정해주는 곳이다.
  • 인터페이스로 지정해줬지만 @Dao 어노테이션을 표시해주고 각 함수 앞에 적절한 어노테이션을 지정해주면 관련 클래스를 자동으로 생성해준다.
  • 위 경우에는 Todo를 List<Todo> 형식으로 전부 가져오는 함수와 Todo를 한 번에 삽입하는 함수만 지정해줬다.

 

3. AppDatabase

Database 클래스는 데이터베이스 이용을 위한 DAO 객체 획득 함수를 제공하는 클래스이다. DAO 획득 함수는 추상 함수로 정의한다. 당연하지만 추상 함수로 정의하기 위해 추상 클래스로 작성한다.

1
2
3
4
@Database(entities = {Todo.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
    public abstract TodoDAO todoDAO();
}
cs
  • entities에 Todo 클래스를 지정하고 RoomDatabase를 상속받는 추상클래스를 만들고 todoDAO라는 추상 함수를 정의했다.
  • 중요한 건 데이터베이스 버전 정보이다. 앱을 개발해나가면서 기존의 데이터 구조를 수정해줘야할 필요가 있을 것이다. 데이터 구조를 수정해준다면 version의 숫자를 증가시켜주고 Migration 클래스를 상속받아 migrate() 함수를 재정의한 클래스가 필요하다고 한다.
    (해당 내용은 이후 직접 스키마를 변경하는 경우가 생길 때 다시 포스팅할 예정)

 

4. MainViewModel

이제 데이터베이스를 불러오고 더미 todos를 데이터베이스에 넣고 가져오는 코드를 작성할 예정이다.

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
32
33
34
35
36
37
38
39
40
41
42
43
44
public class MainViewModel extends AndroidViewModel {
    TodoDAO todoDAO;
 
    private MutableLiveData<List<Todo>> todos;
 
    public MainViewModel(@NonNull Application application) {
        super(application);
 
        AppDatabase db = Room.databaseBuilder(getApplication().getApplicationContext(),
                AppDatabase.class"db").build();
 
        todoDAO = db.todoDAO();
        Todo[] todos = new Todo[] {
                new Todo(1"제목 1""내용 1"),
                new Todo(2"제목 2""내용 2")
        };
 
        new InsertThread(todos).start();
        new SelectAllThread().start();
 
    }
 
    class InsertThread extends Thread {
        Todo[] todos;
        public InsertThread(Todo[] todos){
            this.todos = todos;
        }
 
        @Override
        public void run() {
            todoDAO.insertAll(todos);
        }
    }
 
    class SelectAllThread extends Thread {
        @Override
        public void run() {
            List<Todo> results = todoDAO.getAll();
            for (Todo todo: results) {
                Log.d("weekyear", todo.getId() + "," + todo.getTitle() + "," + todo.getContent());
            }
        }
    }
}
cs
  • 공부한 책에서는 MainActivity에서 불러왔지만 결국 MVVM 패턴을 활용하면 ViewModel 클래스에 넣어야하지 않을까 싶어서 넣었다.
  • 하지만, 지금 생각이 바뀐게 todos를 여기저기서 활용할 거라면 모든 ViewModel 클래스들이 상속받을 BaseViewModel을 따로 만든 다음에 BaseViewModel에서 싱글턴 패턴으로 데이터베이스를 불러오게 하는게 좋지 않을까 싶다. (이후 바꿀 예정)
  • 액티비티에서 DAO 클래스의 함수 호출은 백그라운드 스레드에서 실행하는 것이 기본이라고 하는데, ViewModel에서는 어떻게 불러오는게 좋을지 다시 생각해봐야겠다.

 


참조 - 깡샘의 안드로이드 프로그래밍 27장 <데이터 바인딩>

더욱 자세한 내용은 [깡샘의 안드로이드 프로그래밍] 책을 확인해주시기 바라요!! 툭 까놓고 말해 제가 공부한 것을 적어두자는 목적으로 쓴 글이라 큰 도움이 안 될 수 있습니다. 책이나 안드로이드 공식 문서를 확인하는 것이 가장 좋은 공부법입니다!!

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함