안드로이드/정리

[Android] Room에 관해...

Room

SQLite를 추상화한 객체이자 ORM(Object Relational Mapping)에 해당됨

객체를 사용하듯 DB를 사용할 수 있게 해줌

 

Room의 주요 Component

1. Entity : 데이터베이스 안에 있는 테이블

2. Database : DAO 객체를 제공해 데이터베이스를 이용할 수 있는 Access point

3. DAO(Data Access Object) : 데이터베이스에 접근하는 메서드가 있는 오브젝트

 

3개의 주요 룸 객체를 생성하고 정의하면 나머지는 라이브러리가 알아서 처리

 

JetPack의 ViewModel과 LiveData와 함께 쓰이도록 설계되었으며 이들과 같이 사용.

 

 

Entity

DB의 테이블과 구성요소를 표현한다.

Annotation ---

  • @Entity(tableName = "이름" : 테이블 이름 설정
  • @PrimaryKey : Entity를 Primary 키로 설정
  • @NonNull : 이 Entity의 값은 null이 될 수 없음
  • @ColumnInfo(name = "이름") : column 이름 

-----

 

DAO

- Dao로 사용할 interface 생성 후 @DAO 선언

- 메서드와 SQLite의 쿼리를 매핑

  - 메서드 위에 어노테이션으로 @Query("...") 설정

  - 각 @Query메서드는 컴파일 타임에 확인되므로 쿼리에 문제 있으면 런타임 오류 대신 컴파일 에러

- 해당 메서드를 호출하면 설정한 쿼리로 데이터를 가져와 정해진 형식으로 반환

Annotation ---

  • @Insert ( 쿼리문 작성 안해도 룸이 알아서 데이터 저장 )
  • @Update ( 기본키와 일치하는 쿼리 사용 int를 반환해 수정된 행 수 확인 가능 )
  • @Delete ( 기본키와 일치하는 쿼리 사용 int를 반환해 삭제된 행 수 확인 가능 )

-----

 

Room DB

- RoomDatabase 객체를 상속하는 추상 클래스

- DAO를 리턴하는 추상 메서드 보유

- Room.databaseBuilder를 이용해 추상 클래스를 객체로 만듬

- 구현할 때 DB에서 사용하는 Entity 클래스와 Version 정보를 Annotation으로 설정 필요

- 객체를 사용하는데 비용이 많이 들어 싱글톤 패턴으로 1개의 객체만 만들도록 권장

 

Repository

- 데이터 액세스하는 로직을 캡슐화

- 로컬 DB나 Network로 부터 특정 데이터 셋을 가져오거나 저장하는 방법 결정

- UI가 데이터 저장하거나 가져오는 것에 관여하지 않게 해줌

- 사용하지 않을 수 있으나 유지보수성이 좋기에 사용을 권장

 

Room은 SQLite에 추상화 레이어를 제공해 SQLite를 완벽히 활용하고 더 견고한 DB 액세스를 가능하게 한다.

1. Query의 유효성 검사 기능을 제공하지 못했던 점

2. Scheme가 바뀔 때 자동적으로 업데이트를 못했던 점

3. ORM(Object Relational Mapping : 객체와 관계형 DB의 데이터를 자동으로 매핑해주는 것)이 지원이 안된 점

4. Observer 패턴의 데이터를 생성하고 동작 시키기 위해 추가적인 코드를 작성해야 했던 점

모두를 해결했다.